217 lines
8.2 KiB
HTML
217 lines
8.2 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
<html>
|
|
<head>
|
|
<script src="../../resources/js-test-pre.js"></script>
|
|
</head>
|
|
<body>
|
|
<p id="description"></p>
|
|
<div id="console"></div>
|
|
<script>
|
|
// Test that assures that SVGTextContentElement API takes lengthAdjust & co into account.
|
|
description("Complete test of the SVGTextContentElement API");
|
|
|
|
// Prepare testcase
|
|
var svgNS = "http://www.w3.org/2000/svg";
|
|
|
|
var svgRoot = document.createElementNS(svgNS, "svg");
|
|
document.documentElement.appendChild(svgRoot);
|
|
|
|
var svgText = document.createElementNS(svgNS, "text");
|
|
svgText.style.fontFamily = "Arial";
|
|
svgText.style.fontSize = "20px";
|
|
svgText.setAttribute("x", "10");
|
|
svgText.setAttribute("y", "20");
|
|
svgText.setAttribute("lengthAdjust", "spacingAndGlyphs");
|
|
svgText.setAttribute("textLength", "200");
|
|
svgText.appendChild(document.createTextNode("Test"));
|
|
svgRoot.appendChild(svgText);
|
|
|
|
// Build scale matrix, we need to handle the spacingAndGlyphs transformation on our own.
|
|
var startPosition = svgText.getStartPositionOfChar(0);
|
|
var scale = svgText.textLength.baseVal.value / svgText.getComputedTextLength();
|
|
var scaleMatrix = svgRoot.createSVGMatrix()
|
|
.translate(startPosition.x, startPosition.y)
|
|
.scaleNonUniform(scale, 1)
|
|
.translate(-startPosition.x, -startPosition.y);
|
|
var inverseScaleMatrix = scaleMatrix.inverse();
|
|
|
|
function transformPoint(point, matrix) {
|
|
return point.matrixTransform(matrix);
|
|
}
|
|
|
|
function transformRect(rect, matrix) {
|
|
var topLeft = svgRoot.createSVGPoint();
|
|
topLeft.x = rect.x;
|
|
topLeft.y = rect.y;
|
|
topLeft = transformPoint(topLeft, matrix);
|
|
|
|
var bottomRight = svgRoot.createSVGPoint();
|
|
bottomRight.x = rect.x + rect.width;
|
|
bottomRight.y = rect.y + rect.height;
|
|
bottomRight = transformPoint(bottomRight, matrix);
|
|
|
|
var newRect = svgRoot.createSVGRect();
|
|
newRect.x = topLeft.x;
|
|
newRect.y = topLeft.y;
|
|
newRect.width = bottomRight.x - topLeft.x;
|
|
newRect.height = bottomRight.y - topLeft.y;
|
|
return newRect;
|
|
}
|
|
|
|
// Helper functions
|
|
function numberToString(number) {
|
|
return number.toFixed(1);
|
|
}
|
|
|
|
function lengthToString(number) {
|
|
return numberToString(number * scale);
|
|
}
|
|
|
|
function pointToString(point) {
|
|
point = point.matrixTransform(scaleMatrix);
|
|
return "(" + numberToString(point.x) + "," + numberToString(point.y) + ")";
|
|
}
|
|
|
|
function rectToString(rect) {
|
|
rect = transformRect(rect, scaleMatrix);
|
|
return "(" + numberToString(rect.x) + "," + numberToString(rect.y) + ")-(" + numberToString(rect.width) + "x" + numberToString(rect.height) + ")";
|
|
}
|
|
|
|
debug("Test SVGTextContentElement SVG DOM properties");
|
|
shouldBeEqualToString("svgText.textLength.baseVal.value.toFixed(1)", "200.0");
|
|
shouldBe("svgText.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
|
|
|
|
debug("");
|
|
debug("Test getNumberOfChars() API");
|
|
shouldBe("svgText.getNumberOfChars()", "4");
|
|
|
|
debug("");
|
|
debug("Test getComputedTextLength() API");
|
|
shouldBeEqualToString("lengthToString(svgText.getComputedTextLength())", "200.0");
|
|
|
|
debug("");
|
|
debug("Test getSubStringLength() API");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(0, 1))", "62.8");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(0, 2))", "108.6");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(0, 3))", "160.0");;
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(0, 4))", "188.6");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(1, 1))", "57.2");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(1, 2))", "108.6");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(1, 3))", "137.2");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(2, 1))", "51.4");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(2, 2))", "80.0");
|
|
shouldBeEqualToString("lengthToString(svgText.getSubStringLength(3, 1))", "28.6");
|
|
|
|
debug("");
|
|
debug("Test getStartPositionOfChar() API");
|
|
shouldBeEqualToString("pointToString(svgText.getStartPositionOfChar(0))", "(10.0,20.0)");
|
|
shouldBeEqualToString("pointToString(svgText.getStartPositionOfChar(1))", "(72.8,20.0)");
|
|
shouldBeEqualToString("pointToString(svgText.getStartPositionOfChar(2))", "(118.6,20.0)");
|
|
shouldBeEqualToString("pointToString(svgText.getStartPositionOfChar(3))", "(170.0,20.0)");
|
|
|
|
debug("");
|
|
debug("Test getEndPositionOfChar() API");
|
|
shouldBeEqualToString("pointToString(svgText.getEndPositionOfChar(0))", "(72.8,20.0)");
|
|
shouldBeEqualToString("pointToString(svgText.getEndPositionOfChar(1))", "(118.6,20.0)");
|
|
shouldBeEqualToString("pointToString(svgText.getEndPositionOfChar(2))", "(170.0,20.0)");
|
|
shouldBeEqualToString("pointToString(svgText.getEndPositionOfChar(3))", "(198.6,20.0)");
|
|
|
|
debug("");
|
|
debug("Test getExtentOfChar() API");
|
|
shouldBeEqualToString("rectToString(svgText.getExtentOfChar(0))", "(10.0,1.9)-(62.8x22.3)");
|
|
shouldBeEqualToString("rectToString(svgText.getExtentOfChar(1))", "(72.8,1.9)-(57.2x22.3)");
|
|
shouldBeEqualToString("rectToString(svgText.getExtentOfChar(2))", "(118.6,1.9)-(51.4x22.3)");
|
|
shouldBeEqualToString("rectToString(svgText.getExtentOfChar(3))", "(170.0,1.9)-(28.6x22.3)");
|
|
|
|
debug("");
|
|
debug("Test getRotationOfChar() API");
|
|
shouldBeEqualToString("svgText.getRotationOfChar(0).toFixed(1)", "0.0");
|
|
shouldBeEqualToString("svgText.getRotationOfChar(1).toFixed(1)", "0.0");
|
|
shouldBeEqualToString("svgText.getRotationOfChar(2).toFixed(1)", "0.0");
|
|
shouldBeEqualToString("svgText.getRotationOfChar(3).toFixed(1)", "0.0");
|
|
|
|
var point = svgRoot.createSVGPoint();
|
|
var pointDict;
|
|
point.y = 10.0;
|
|
|
|
debug("");
|
|
debug("Test getCharNumAtPosition() API");
|
|
|
|
point.x = 0.0;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "-1");
|
|
pointDict = {x: point.x, y: point.y};
|
|
shouldBe("svgText.getCharNumAtPosition(pointDict)", "-1");
|
|
|
|
point.x = 9.9;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "-1");
|
|
pointDict = {x: point.x, y: point.y};
|
|
shouldBe("svgText.getCharNumAtPosition(pointDict)", "-1");
|
|
|
|
point.x = 10.1;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "0");
|
|
pointDict = {x: point.x, y: point.y};
|
|
shouldBe("svgText.getCharNumAtPosition(pointDict)", "0");
|
|
|
|
point.x = 71.4;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "0");
|
|
|
|
point.x = 71.6;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "0");
|
|
|
|
point.x = 127.8;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "1");
|
|
pointDict = {x: point.x, y: point.y};
|
|
shouldBe("svgText.getCharNumAtPosition(pointDict)", "1");
|
|
|
|
point.x = 128.0;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "1");
|
|
|
|
point.x = 179.1;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "3");
|
|
pointDict = {x: point.x, y: point.y};
|
|
shouldBe("svgText.getCharNumAtPosition(pointDict)", "3");
|
|
|
|
point.x = 179.3;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "3");
|
|
|
|
point.x = 209.9;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "-1");
|
|
|
|
point.x = 210.1;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "-1");
|
|
|
|
point.x = 250.0;
|
|
point = point.matrixTransform(inverseScaleMatrix);
|
|
debug("> Testing point=" + pointToString(point));
|
|
shouldBe("svgText.getCharNumAtPosition(point)", "-1");
|
|
|
|
// Cleanup
|
|
document.documentElement.removeChild(svgRoot);
|
|
var successfullyParsed = true;
|
|
</script>
|
|
<script src="../../resources/js-test-post.js"></script>
|
|
</body>
|
|
</html>
|