<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<style type="text/css">
#svgRoot {
margin: 0px;
padding: 0px;
position: absolute;
top: 0px;
left: 0px;
}
.nonscaletest {
stroke-width: 20px;
fill: #ccc;
fill-opacity: 0.4;
}
#ellipse1, #ellipse2 {
stroke: #f31900;
}
#line1, #line2 {
stroke: #3364c2;
}
#rect1, #rect2 {
stroke: #f7d72b;
}
#curve1, #curve2 {
stroke: #44c400;
}
</style>
<script type="text/javascript">
function enter(event) {
event.target.setAttribute("stroke-opacity", "0.4");
};
function exit(event) {
event.target.setAttribute("stroke-opacity", "0.7");
};
</script>
</head>
<body>
<p>Tests for WK82628 - Make sure hit testing works properly on ellipses, rects, lines and curves with non-scaling stroke.</p>
<p>On success, you will see a series of "PASS" messages and no "FAIL" messages.</p>
<pre id="console"></pre>
<svg id="svgRoot" width="500px" height="300px" viewBox="0 0 500 300" xmlns="http://www.w3.org/2000/svg">
<!-- The following are all small and scaled up -->
<g transform="translate(30, 0) scale(5, 5)">
<ellipse id="ellipse1" class="nonscaletest" cx="10" cy="10" rx="10" ry="5" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
<rect id="rect1" class="nonscaletest" x="30" y="10" width="10" height="7" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
<path id="line1" class="nonscaletest" d="M20 20 l 10 10z" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
<g transform="translate(-6, 12)">
<path id="curve1" class="nonscaletest" d="M5,20 C10,10 25,10 25,20 S40,30 40,20" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
</g>
</g>
<!-- The following are all large and scaled down -->
<g transform="translate(275, 0) scale(0.2, 0.2)">
<ellipse id="ellipse2" class="nonscaletest" cx="250" cy="250" rx="250" ry="125" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" class="nonscaletest" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
<rect id="rect2" class="nonscaletest" x="750" y="250" width="250" height="175" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
<path id="line2" class="nonscaletest" d="M500 500 l 250 250z" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
<g transform="translate(-150, 300)">
<path id="curve2" class="nonscaletest" d="M125,500 C250,250 625,250 600,500 S1000,750 1000,500" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
</g>
</g>
</svg>
<script type="text/javascript">
// document.body.onmousedown = function(evt) { console.log("mouse down at " + evt.x + "," + evt.y); }
if (window.testRunner)
testRunner.dumpAsText();
var resultString = "";
var ellipse1 = document.getElementById("ellipse1");
var ellipse2 = document.getElementById("ellipse2"); // 250px to the right of ellipse1
var pointsOnEllipse1Stroke = [
{x: 29, y: 37},
{x: 34, y: 48},
{x: 94, y: 70},
{x: 100, y: 78}
];
var pointsNotOnEllipse1Stroke = [
{x: 33, y: 18},
{x: 81, y: 49},
{x: 129, y: 78}
];
var rect1 = document.getElementById("rect1");
var rect2 = document.getElementById("rect2"); // 250px to the right of rect1
var pointsOnRect1Stroke = [
{x: 172, y: 45},
{x: 183, y: 63},
{x: 220, y: 82},
{x: 233, y: 90}
];
var pointsNotOnRect1Stroke = [
{x: 205, y: 68}
];
var line1 = document.getElementById("line1");
var line2 = document.getElementById("line2"); // 250px to the right of line1
var pointsOnLine1Stroke = [
{x: 127, y: 97},
{x: 174, y: 146}
];
var pointsNotOnLine1Stroke = [
{x: 138, y: 131},
{x: 177, y: 126}
];
var curve1 = document.getElementById("curve1");
var curve2 = document.getElementById("curve2"); // 250px to the right of curve1
var pointsOnCurve1Stroke = [
{x: 24, y: 159},
{x: 107, y: 126},
{x: 169, y: 193},
{x: 195, y: 159}
];
var pointsNotOnCurve1Stroke = [
{x: 5, y: 164},
{x: 81, y: 140},
{x: 161, y: 177}
];
pointsOnEllipse1Stroke.forEach( function(point) {
var pass = (ellipse1 == document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " ellipse1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
var pass = (ellipse2 == document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " ellipse2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsNotOnEllipse1Stroke.forEach( function(point) {
var pass = (ellipse1 != document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " ellipse1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
var pass = (ellipse2 != document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " ellipse2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsOnRect1Stroke.forEach( function(point) {
var pass = (rect1 == document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " rect1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
var pass = (rect2 == document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " rect2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsNotOnRect1Stroke.forEach( function(point) {
var pass = (rect1 != document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " rect1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
var pass = (rect2 != document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " rect2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsOnLine1Stroke.forEach( function(point) {
var pass = (line1 == document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " line1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
var pass = (line2 == document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " line2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsNotOnLine1Stroke.forEach( function(point) {
var pass = (line1 != document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " line1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
var pass = (line2 != document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " line2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsOnCurve1Stroke.forEach( function(point) {
var pass = (curve1 == document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " curve1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
var pass = (curve2 == document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " curve2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
});
pointsNotOnCurve1Stroke.forEach( function(point) {
var pass = (curve1 != document.elementFromPoint(point.x, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " curve1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
var pass = (curve2 != document.elementFromPoint(point.x + 250, point.y));
resultString += ((pass) ? "PASS" : "FAIL") + " curve2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
});
document.getElementById("console").innerHTML = resultString;
</script>
</body>
</html>