[librsvg] bgo#760180: handle the viewBox of markers correctly
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] bgo#760180: handle the viewBox of markers correctly
- Date: Fri, 8 Jan 2016 01:44:46 +0000 (UTC)
commit 63371906c63d74bfb1f1ca6b10237d3b563bb55a
Author: Federico Mena Quintero <federico gnome org>
Date: Thu Jan 7 19:15:38 2016 -0600
bgo#760180: handle the viewBox of markers correctly
One of the SVG test suite's images has a marker with a viewBox that doesn't actually start at (0, 0).
This was rendered incorrectly.
I'm not sure why this specific use of rsvg_preserve_aspect_ratio() is not the same as the others
in librsvg, but it certainly produced incorrect results.
https://bugzilla.gnome.org/show_bug.cgi?id=760180
rsvg-marker.c | 13 +--
tests/fixtures/reftests/bugs/760180-ref.png | Bin 0 -> 8120 bytes
tests/fixtures/reftests/bugs/760180.svg | 159 +++++++++++++++++++++++++++
3 files changed, 161 insertions(+), 11 deletions(-)
---
diff --git a/rsvg-marker.c b/rsvg-marker.c
index fed255d..bcca6d7 100644
--- a/rsvg-marker.c
+++ b/rsvg-marker.c
@@ -136,7 +136,6 @@ rsvg_marker_render (const char * marker_name, gdouble xpos, gdouble ypos, gdoubl
}
if (self->vbox.active) {
-
double w, h, x, y;
w = _rsvg_css_normalize_length (&self->width, ctx, 'h');
h = _rsvg_css_normalize_length (&self->height, ctx, 'v');
@@ -148,17 +147,9 @@ rsvg_marker_render (const char * marker_name, gdouble xpos, gdouble ypos, gdoubl
self->vbox.rect.height,
&w, &h, &x, &y);
- x = -self->vbox.rect.x * w / self->vbox.rect.width;
- y = -self->vbox.rect.y * h / self->vbox.rect.height;
-
- cairo_matrix_init (&taffine,
- w / self->vbox.rect.width,
- 0,
- 0,
- h / self->vbox.rect.height,
- x,
- y);
+ cairo_matrix_init_scale (&taffine, w / self->vbox.rect.width, h / self->vbox.rect.height);
cairo_matrix_multiply (&affine, &taffine, &affine);
+
_rsvg_push_view_box (ctx, self->vbox.rect.width, self->vbox.rect.height);
}
diff --git a/tests/fixtures/reftests/bugs/760180-ref.png b/tests/fixtures/reftests/bugs/760180-ref.png
new file mode 100644
index 0000000..8ff6e2c
Binary files /dev/null and b/tests/fixtures/reftests/bugs/760180-ref.png differ
diff --git a/tests/fixtures/reftests/bugs/760180.svg b/tests/fixtures/reftests/bugs/760180.svg
new file mode 100644
index 0000000..c1929f8
--- /dev/null
+++ b/tests/fixtures/reftests/bugs/760180.svg
@@ -0,0 +1,159 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="AG" author="ED" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: painting-marker-06-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml"
href="http://www.w3.org/TR/SVG11/painting.html#MarkerElement">
+ <p>
+ Tests the basic support for markers. For the three tests, there
+ should be two identical paths with markers drawn. The path on the left is
+ rendered using the marker elements. The path on the right is rendered using
+ the equivalent SVG, showing what the marked path should look like.
+ </p>
+ <p>
+ This test is similar to the painting-marker-01-f.svg test, but has some viewBox attributes
+ that have a non-zero offset.
+ </p>
+ <p>
+ The top test examines the basic support for the marker element and style. The markers are purple
rectangles.
+ </p>
+ <p>
+ The middle test examines the support for the different styles of marker properties. The
+ "marker-start" property defines the marker to use at the first vertex of the marked path,
+ in this case a purple rectangle. The "marker-end" property defines the marker to use at the
+ last vertex of the marked path, in this case a blue triangle. The "marker-mid" property
+ defines the marker to use at all vertices, other than the first and last, of the marked path,
+ in this case a green circle.
+ </p>
+ <p>
+ The bottom test examines the support for marker orientation along the
+ path direction. The second vertex, the top right corner of the path, has a marker that
+ is rotated 45 degrees, since that is the average of the horizontal and vertical segments
+ each side. The last vertex, the bottom right corner of the path, has a marker rotated 90
+ degrees since that is the direction of the last path segment.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-06-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- ===================================================================== -->
+ <!-- Define a few simple marker elements -->
+ <!-- ===================================================================== -->
+ <marker id="marker1" viewBox="20 20 10 10" markerWidth="2" markerHeight="2" refX="25" refY="25"
markerUnits="strokeWidth">
+ <rect x="20" y="20" width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="marker2" viewBox="-5 -5 10 10" markerWidth="2" markerHeight="2" markerUnits="strokeWidth"
orient="auto">
+ <path d="M 0 -5 L 5 5 L -5 5 Z" fill="blue" stroke="none"/>
+ </marker>
+ <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5"
markerUnits="strokeWidth">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="markerMiddle" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5"
refY="5" markerUnits="strokeWidth">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </marker>
+ <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5"
markerUnits="strokeWidth">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </marker>
+ </defs>
+ <!-- ===================================================================== -->
+ <!-- Basic Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="170" y="30" font-size="14">Basic Markers</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker1)"
marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 130 40 L 180 40 L 180 90"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 40 L 180 40 L 180 90"/>
+ <g transform="translate(130,40) scale(8) scale(0.2, 0.2) translate(-5, -5)"
fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,40) scale(8) scale(0.2, 0.2) translate(-5, -5)"
fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,90) scale(8) scale(0.2, 0.2) translate(-5, -5)"
fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Start, Middle and End Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="125" font-size="14">Start, Middle and End</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#markerStart)"
marker-mid="url(#markerMiddle)" marker-end="url(#markerEnd)" d="M 130 135 L 180 135 L 180 185"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 135 L 180 135 L 180 185"/>
+ <g transform="translate(130,135) scale(8) scale(0.2, 0.2) translate(-5, -5)"
fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,135) scale(8) scale(0.2, 0.2) translate(-5, -5)"
fill="none" stroke="black" stroke-width="8">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </g>
+ <g transform="translate(180,185) scale(8) scale(0.2, 0.2) translate(-5, -5)"
fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Auto Orientation Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="220" font-size="14">Automatic Orientation</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker2)"
marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 130 230 L 180 230 L 180 280"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 230 L 180 230 L 180 280"/>
+ <g transform="translate(130,230) rotate(0) scale(8) scale(0.2, 0.2) translate(-5,
-5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,230) rotate(45) scale(8) scale(0.2, 0.2) translate(-5,
-5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,280) rotate(90) scale(8) scale(0.2, 0.2) translate(-5,
-5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]