4 <script src=
"../../../resources/js-test.js"></script>
5 <script src=
"../resources/subpixel-utils.js"></script>
8 border:
1px solid black;
14 font:
20px/
1 Ahem, sans-serif;
24 shape-outside: ellipse(
200px
100px at
225px
125px);
41 <p>The right edges of the three black squares should follow the outer ellipse boundary and each square should appear on a subsequent line.
</p>
42 <div id=
"container-border">
44 <div id=
"float-right">
45 <svg id=
"svg-shape-ellipse" xmlns=
"http://www.w3.org/2000/">
46 <ellipse cx=
"225" cy=
"125" rx=
"200" ry=
"100" fill=
"green"></ellipse>
47 <ellipse cx=
"225" cy=
"125" rx=
"225" ry=
"125" fill=
"none" stroke=
"green"></ellipse>
50 <span id=
"s1">X
</span></br><span id=
"s2">X
</span><br/><span id=
"s3">X
</span>
53 <div id=
"console"></div>
56 function elementRect(elementId
)
58 var s
= document
.getElementById("container").getBoundingClientRect();
59 var r
= document
.getElementById(elementId
).getBoundingClientRect();
60 return {right
: (r
.left
- s
.left
) + r
.width
, top
: r
.top
- s
.top
, width
: r
.width
, height
: r
.height
};
63 // You'll find the equation for the X intercept of an elliptical arc here (among other places):
64 // http://hansmuller-webkit.blogspot.com/2012/07/computing-horizonal-rounded-rectangle.html
66 function marginEllipseRightXIntercept(y
, cx
, rx
, ry
)
68 var containerWidth
= document
.getElementById("container").getBoundingClientRect().width
;
69 var f
= SubPixelLayout
.snapToLayoutUnit(containerWidth
- (cx
+ rx
* Math
.sqrt(1 - Math
.pow((ry
- y
) / ry
, 2))));
70 return String( Math
.floor(f
) );
73 // In the ".right" tests below, it's the lower edge of the 20px Ahem glyph that that defines the element rect's left edge.
74 // That's why the Y coordinate in each of those tests is 20 greater than the ".top" test.
76 var quiet
= true; // PASS output depends on SubPixelLayout.isEnabled()
78 shouldBe("elementRect('s1').top", "0");
79 shouldBe("elementRect('s1').right", marginEllipseRightXIntercept(20, 225, 225, 125), quiet
);
81 shouldBe("elementRect('s2').top", "20");
82 shouldBe("elementRect('s2').right", marginEllipseRightXIntercept(40, 225, 225, 125), quiet
);
84 shouldBe("elementRect('s3').top", "40");
85 shouldBe("elementRect('s3').right", marginEllipseRightXIntercept(60, 225, 225, 125), quiet
);