[librsvg] bgo#760180: handle the viewBox of markers correctly



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]