Bug 676001 - Fix for stroke hit testing on cairo. r=jrmuizel

The mochitest was mostly written by Jonathan Watt (bug 719385).
This commit is contained in:
Tom Klein 2015-11-18 11:20:02 -06:00
parent 1f7438dc92
commit b824a27a11
4 changed files with 71 additions and 6 deletions

View File

@ -70,6 +70,7 @@ skip-if = android_version == '18' # bug 1147994
[test_pointer-events-7.xhtml] [test_pointer-events-7.xhtml]
[test_scientific.html] [test_scientific.html]
[test_selectSubString.xhtml] [test_selectSubString.xhtml]
[test_stroke-hit-testing.xhtml]
[test_stroke-linecap-hit-testing.xhtml] [test_stroke-linecap-hit-testing.xhtml]
[test_SVGLengthList-2.xhtml] [test_SVGLengthList-2.xhtml]
[test_SVGLengthList.xhtml] [test_SVGLengthList.xhtml]

View File

@ -0,0 +1,67 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=676001
-->
<head>
<title>Test hit-testing of stroke</title>
<style>
:hover { stroke: lime; }
</style>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body onload="run()">
<script class="testbody" type="text/javascript">
<![CDATA[
SimpleTest.waitForExplicitFinish();
function run()
{
var div = document.getElementById('div');
var line = document.getElementById('line');
var circle = document.getElementById('circle');
var offsetX = div.offsetLeft;
var offsetY = div.offsetTop;
var got;
// line
got = document.elementFromPoint(offsetX + 116, offsetY + 103);
is(got, line, 'Should hit line (1)');
got = document.elementFromPoint(offsetX + 123, offsetY + 108);
is(got, line, 'Should hit line (2)');
// circle
got = document.elementFromPoint(offsetX + 188, offsetY + 158);
is(got, circle, 'Should hit circle (1)');
got = document.elementFromPoint(offsetX + 185, offsetY + 162);
is(got, circle, 'Should hit circle (2)');
SimpleTest.finish();
}
]]>
</script>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=676001">Mozilla Bug 676001</a>
<p id="display"></p>
<div id="content">
<div width="100%" height="1" id="div"></div>
<svg xmlns="http://www.w3.org/2000/svg" id="svg" width="500" height="300">
<line id="line" x1="100" y1="100" x2="600" y2="180"
stroke="red" stroke-width="40"/>
<!-- the circle test points need to be within the mochitest test harness
viewport for test content in order for elementFromPoint to work -->
<circle id="circle" cx="100" cy="150" r="100"
fill="none" stroke="red" stroke-width="40"/>
</svg>
</div>
<pre id="test">
</pre>
</body>
</html>

View File

@ -1213,8 +1213,8 @@ _cairo_gstate_in_stroke (cairo_gstate_t *gstate,
limit.p1.x = _cairo_fixed_from_double (x) - 5; limit.p1.x = _cairo_fixed_from_double (x) - 5;
limit.p1.y = _cairo_fixed_from_double (y) - 5; limit.p1.y = _cairo_fixed_from_double (y) - 5;
limit.p2.x = limit.p1.x + 5; limit.p2.x = limit.p1.x + 10;
limit.p2.y = limit.p1.y + 5; limit.p2.y = limit.p1.y + 10;
_cairo_traps_init (&traps); _cairo_traps_init (&traps);
_cairo_traps_limit (&traps, &limit, 1); _cairo_traps_limit (&traps, &limit, 1);

View File

@ -252,13 +252,10 @@ _add_clipped_edge (cairo_polygon_t *polygon,
right_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, right_y = _cairo_edge_compute_intersection_y_for_x (p1, p2,
limits->p2.x); limits->p2.x);
if (left_y == right_y) /* horizontal within bounds */
continue;
p1_y = top; p1_y = top;
p2_y = bottom; p2_y = bottom;
if (left_y < right_y) { if (p1->x < p2->x) {
if (p1->x < limits->p1.x && left_y > limits->p1.y) { if (p1->x < limits->p1.x && left_y > limits->p1.y) {
p[0].x = limits->p1.x; p[0].x = limits->p1.x;
p[0].y = limits->p1.y; p[0].y = limits->p1.y;