[librsvg] Use the alternate solid color if a pattern cannot be acquired



commit 5804c73d0e7ef249a3c5e7c32947b565d7eba036
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Feb 8 12:50:21 2017 -0600

    Use the alternate solid color if a pattern cannot be acquired
    
    This fixes the last case in pservers-pattern-03-f.svg, which has a fill
    with an invalid URI and an alternate color for the fill.

 rsvg-cairo-draw.c                                  |   21 +++--
 .../reftests/svg1.1/pservers-pattern-03-f-ref.png  |  Bin 0 -> 6074 bytes
 .../reftests/svg1.1/pservers-pattern-03-f.svg      |   91 ++++++++++++++++++++
 3 files changed, 105 insertions(+), 7 deletions(-)
---
diff --git a/rsvg-cairo-draw.c b/rsvg-cairo-draw.c
index 7eb953c..d168ba8 100644
--- a/rsvg-cairo-draw.c
+++ b/rsvg-cairo-draw.c
@@ -192,15 +192,18 @@ _set_source_rsvg_paint_server (RsvgDrawingCtx * ctx,
 {
     RsvgNode *node;
     gboolean had_paint_server;
+    gboolean use_alternate;
 
     had_paint_server = FALSE;
 
     switch (ps->type) {
     case RSVG_PAINT_SERVER_IRI:
+        use_alternate = FALSE;
+
         node = rsvg_drawing_ctx_acquire_node (ctx, ps->core.iri->iri_str);
-        if (node == NULL)
-            break;
-        else if (rsvg_node_type (node) == RSVG_NODE_TYPE_LINEAR_GRADIENT) {
+        if (node == NULL) {
+            use_alternate = TRUE;
+        } else if (rsvg_node_type (node) == RSVG_NODE_TYPE_LINEAR_GRADIENT) {
             _set_source_rsvg_linear_gradient (ctx, (RsvgLinearGradient *) node, opacity, bbox);
             had_paint_server = TRUE;
         } else if (rsvg_node_type (node) == RSVG_NODE_TYPE_RADIAL_GRADIENT) {
@@ -210,10 +213,14 @@ _set_source_rsvg_paint_server (RsvgDrawingCtx * ctx,
             if (_set_source_rsvg_pattern (ctx, (RsvgPattern *) node, bbox)) {
                 had_paint_server = TRUE;
             } else {
-                if (ps->core.iri->has_alternate) {
-                    _set_source_rsvg_solid_color (ctx, &ps->core.iri->alternate, opacity, current_color);
-                    had_paint_server = TRUE;
-                }
+                use_alternate = TRUE;
+            }
+        }
+
+        if (use_alternate) {
+            if (ps->core.iri->has_alternate) {
+                _set_source_rsvg_solid_color (ctx, &ps->core.iri->alternate, opacity, current_color);
+                had_paint_server = TRUE;
             }
         }
 
diff --git a/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.png 
b/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.png
new file mode 100644
index 0000000..dc7c7ff
Binary files /dev/null and b/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.png differ
diff --git a/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg 
b/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg
new file mode 100644
index 0000000..dbf9f47
--- /dev/null
+++ b/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg
@@ -0,0 +1,91 @@
+<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="[reviewer]" author="ED" status="created"
+    version="$Revision: 1.1 $" testname="$RCSfile: pservers-pattern-03-f.svg,v $">
+    <d:testDescription xmlns="http://www.w3.org/1999/xhtml"; 
href="http://www.w3.org/TR/SVG11/pservers.html#Patterns";>
+      <p>
+        Test that empty patterns are not rendered, and that the fallback color is used instead.
+      </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 test is passed if there are 8 green rectangles visible, and no red.
+      </p>
+    </d:passCriteria>
+  </d:SVGTestCase>
+  <title id="test-title">$RCSfile: pservers-pattern-03-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>
+      <pattern id="invisible1">
+        <rect width="100%" height="100%" fill="red"/>
+      </pattern>
+      <pattern id="invisible2" patternUnits="objectBoundingBox" patternContentUnits="objectBoundingBox">
+        <rect width="100%" height="100%" fill="red"/>
+      </pattern>
+      <pattern id="invisible3" width="0" height="0" patternUnits="objectBoundingBox" 
patternContentUnits="objectBoundingBox">
+        <rect width="1" height="1" fill="red"/>
+      </pattern>
+      <pattern id="invisible4" width="0" patternUnits="objectBoundingBox" 
patternContentUnits="objectBoundingBox">
+        <rect width="1" height="1" fill="red"/>
+      </pattern>
+      <pattern id="invisible5" width="0" height="0" patternUnits="userSpaceOnUse" 
patternContentUnits="objectBoundingBox">
+        <rect width="1" height="1" fill="red"/>
+      </pattern>
+      <pattern id="invisible6" height="0" patternUnits="userSpaceOnUse" 
patternContentUnits="objectBoundingBox">
+        <rect width="1" height="1" fill="red"/>
+      </pattern>
+      <pattern id="invisible7" height="0" patternUnits="userSpaceOnUse" patternContentUnits="userSpaceOnUse">
+        <rect width="100%" height="100%" fill="red"/>
+      </pattern>
+    </defs>
+
+    <g transform="translate(40 60)" stroke="black">
+      <rect width="100" height="100" fill="url(#invisible1) lime"/>
+      <rect x="100" width="100" height="100" fill="url(#invisible2) lime"/>
+      <rect x="200" width="100" height="100" fill="url(#invisible3) lime"/>
+      <rect x="300" width="100" height="100" fill="url(#invisible4) lime"/>
+
+      <rect y="100" width="100" height="100" fill="url(#invisible5) lime"/>
+      <rect x="100" y="100" width="100" height="100" fill="url(#invisible6) lime"/>
+      <rect x="200" y="100" width="100" height="100" fill="url(#invisible7) lime"/>
+      
+      <!-- note that this is on purpose testing a broken uri -->
+      <rect x="300" y="100" width="100" height="100" fill="url(#invisible8) lime"/>
+    </g>
+  </g>
+  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+    <text id="revision" x="10" y="340" stroke="none"
+      fill="black">$Revision: 1.1 $</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]