[gtk/wip/otte/listview: 1544/1575] rendernodeparser: Handle empty Cairo nodes



commit 53f23f8ae9b2b23c1f917fae0b25049552643b45
Author: Benjamin Otte <otte redhat com>
Date:   Wed May 29 05:48:38 2019 +0200

    rendernodeparser: Handle empty Cairo nodes
    
    Cairo nodes can contain a NULL surface if they have never been drawn to.
    Make this the default Cairo node.

 gsk/gskrendernodeparser.c                     |  58 +++++++++++++-------------
 testsuite/gsk/compare/empty-cairo.png         | Bin 153 -> 1340 bytes
 testsuite/gsk/nodeparser/empty-cairo.ref.node |   2 -
 3 files changed, 30 insertions(+), 30 deletions(-)
---
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index 6dc1d19448..4cdf70f630 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -1065,32 +1065,31 @@ parse_cairo_node (GtkCssParser *parser)
     { "script", parse_script, clear_surface, &surface }
   };
   GskRenderNode *node;
-  cairo_t *cr;
 
   parse_declarations (parser, declarations, G_N_ELEMENTS(declarations));
 
   node = gsk_cairo_node_new (&bounds);
   
-  cr = gsk_cairo_node_get_draw_context (node);
-
   if (surface != NULL)
     {
+      cairo_t *cr = gsk_cairo_node_get_draw_context (node);
       cairo_set_source_surface (cr, surface, 0, 0);
       cairo_paint (cr);
+      cairo_destroy (cr);
     }
   else if (pixels != NULL)
     {
+      cairo_t *cr = gsk_cairo_node_get_draw_context (node);
       surface = gdk_texture_download_surface (pixels);
       cairo_set_source_surface (cr, surface, 0, 0);
       cairo_paint (cr);
+      cairo_destroy (cr);
     }
   else
     {
-      gdk_cairo_set_source_rgba (cr, &GDK_RGBA ("FF00CC"));
-      cairo_paint (cr);
+      /* do nothing */
     }
 
-  cairo_destroy (cr);
   g_clear_object (&pixels);
   g_clear_pointer (&surface, cairo_surface_destroy);
 
@@ -2380,36 +2379,39 @@ render_node_print (Printer       *p,
         start_node (p, "cairo");
         append_rect_param (p, "bounds", &node->bounds);
 
-        array = g_byte_array_new ();
-        cairo_surface_write_to_png_stream (surface, cairo_write_array, array);
-        b64 = g_base64_encode (array->data, array->len);
+        if (surface != NULL)
+          {
+            array = g_byte_array_new ();
+            cairo_surface_write_to_png_stream (surface, cairo_write_array, array);
+            b64 = g_base64_encode (array->data, array->len);
 
-        _indent (p);
-        g_string_append_printf (p->str, "pixels: url(\"data:image/png;base64,%s\");\n", b64);
+            _indent (p);
+            g_string_append_printf (p->str, "pixels: url(\"data:image/png;base64,%s\");\n", b64);
 
-        g_free (b64);
-        g_byte_array_free (array, TRUE);
+            g_free (b64);
+            g_byte_array_free (array, TRUE);
 
 #ifdef CAIRO_HAS_SCRIPT_SURFACE
-        if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_RECORDING)
-          {
-            cairo_device_t *script;
+            if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_RECORDING)
+              {
+                cairo_device_t *script;
 
-            array = g_byte_array_new ();
-            script = cairo_script_create_for_stream (cairo_write_array, array);
+                array = g_byte_array_new ();
+                script = cairo_script_create_for_stream (cairo_write_array, array);
 
-            if (cairo_script_from_recording_surface (script, surface) == CAIRO_STATUS_SUCCESS)
-              {
-                b64 = g_base64_encode (array->data, array->len);
-                _indent (p);
-                g_string_append_printf (p->str, "script: url(\"data:;base64,%s\");\n", b64);
-                g_free (b64);
-              }
+                if (cairo_script_from_recording_surface (script, surface) == CAIRO_STATUS_SUCCESS)
+                  {
+                    b64 = g_base64_encode (array->data, array->len);
+                    _indent (p);
+                    g_string_append_printf (p->str, "script: url(\"data:;base64,%s\");\n", b64);
+                    g_free (b64);
+                  }
 
-          cairo_device_destroy (script);
-          g_byte_array_free (array, TRUE);
-        }
+              cairo_device_destroy (script);
+              g_byte_array_free (array, TRUE);
+            }
 #endif
+        }
 
         end_node (p);
       }
diff --git a/testsuite/gsk/compare/empty-cairo.png b/testsuite/gsk/compare/empty-cairo.png
index 3a032a391b..b4dff4c12f 100644
Binary files a/testsuite/gsk/compare/empty-cairo.png and b/testsuite/gsk/compare/empty-cairo.png differ
diff --git a/testsuite/gsk/nodeparser/empty-cairo.ref.node b/testsuite/gsk/nodeparser/empty-cairo.ref.node
index 4dca846961..841560aaa9 100644
--- a/testsuite/gsk/nodeparser/empty-cairo.ref.node
+++ b/testsuite/gsk/nodeparser/empty-cairo.ref.node
@@ -1,5 +1,3 @@
 cairo {
   bounds: 0 0 50 50;
-  pixels: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABmJLR0QA/wD/AP+gvaeTAAAATklEQVRYhe3OMQHAIADAMJh/aXgCA3t6wZEoyNxjjfd8twP/tAqtQqvQKrQKrUKr0Cq0Cq1Cq9AqtAqtQqvQKrQKrUKr0Cq0Cq1Cq9AqDsEHAi9RKkB7AAAAAElFTkSuQmCC");
-  script: 
url("data:;base64,JSFDYWlyb1NjcmlwdAo8PCAvY29udGVudCAvL0NPTE9SX0FMUEhBIC93aWR0aCA1MCAvaGVpZ2h0IDUwID4+IHN1cmZhY2UgY29udGV4dAoxIDAgMC44IHJnYiBzZXQtc291cmNlCnBhaW50CnBvcAo=");
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]