[gtk+/wip/otte/rendernode: 53/110] cssimage: Use textures in GtkCssImageSurface



commit 0e4162f1869300129df33ba49bc64197811f5c49
Author: Benjamin Otte <otte redhat com>
Date:   Tue Dec 13 05:11:59 2016 +0100

    cssimage: Use textures in GtkCssImageSurface
    
    We now use textures instead of surfaces and implement the snapshot()
    vfunc instead of draw().

 gtk/gtkcssimagerecolor.c        |    8 +---
 gtk/gtkcssimagesurface.c        |   92 +++++++++++++--------------------------
 gtk/gtkcssimagesurfaceprivate.h |    6 +-
 gtk/gtkcssimageurl.c            |    8 +---
 4 files changed, 37 insertions(+), 77 deletions(-)
---
diff --git a/gtk/gtkcssimagerecolor.c b/gtk/gtkcssimagerecolor.c
index 1c38654..bb617b8 100644
--- a/gtk/gtkcssimagerecolor.c
+++ b/gtk/gtkcssimagerecolor.c
@@ -120,8 +120,6 @@ gtk_css_image_recolor_load (GtkCssImageRecolor  *recolor,
 
   if (pixbuf == NULL)
     {
-      cairo_surface_t *empty;
-
       if (gerror)
         {
           char *uri;
@@ -135,13 +133,11 @@ gtk_css_image_recolor_load (GtkCssImageRecolor  *recolor,
           g_free (uri);
        }
 
-      empty = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
-      image = _gtk_css_image_surface_new (empty);
-      cairo_surface_destroy (empty);
+      image = gtk_css_image_surface_new (NULL);
       return image;
     }
 
-  image = _gtk_css_image_surface_new_for_pixbuf (pixbuf);
+  image = gtk_css_image_surface_new_for_pixbuf (pixbuf);
   g_object_unref (pixbuf);
 
   return image;
diff --git a/gtk/gtkcssimagesurface.c b/gtk/gtkcssimagesurface.c
index 1570e83..70910e3 100644
--- a/gtk/gtkcssimagesurface.c
+++ b/gtk/gtkcssimagesurface.c
@@ -28,7 +28,10 @@ gtk_css_image_surface_get_width (GtkCssImage *image)
 {
   GtkCssImageSurface *surface = GTK_CSS_IMAGE_SURFACE (image);
 
-  return cairo_image_surface_get_width (surface->surface);
+  if (surface->texture == NULL)
+    return 0;
+
+  return gsk_texture_get_width (surface->texture);
 }
 
 static int
@@ -36,65 +39,36 @@ gtk_css_image_surface_get_height (GtkCssImage *image)
 {
   GtkCssImageSurface *surface = GTK_CSS_IMAGE_SURFACE (image);
 
-  return cairo_image_surface_get_height (surface->surface);
+  if (surface->texture == NULL)
+    return 0;
+
+  return gsk_texture_get_height (surface->texture);
 }
 
 static void
-gtk_css_image_surface_draw (GtkCssImage *image,
-                            cairo_t     *cr,
-                            double       width,
-                            double       height)
+gtk_css_image_surface_snapshot (GtkCssImage *image,
+                                GtkSnapshot *snapshot,
+                                double       width,
+                                double       height)
 {
   GtkCssImageSurface *surface = GTK_CSS_IMAGE_SURFACE (image);
-  int image_width, image_height;
-
-  image_width = cairo_image_surface_get_width (surface->surface);
-  image_height = cairo_image_surface_get_height (surface->surface);
 
-  if (image_width == 0 || image_height == 0)
+  if (surface->texture == NULL)
     return;
 
-  cairo_rectangle (cr, 0, 0, width, height);
-  cairo_scale (cr,
-               width / image_width,
-               height / image_height);
-  cairo_set_source_surface (cr, surface->surface, 0, 0);
-  cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD);
-  cairo_fill (cr);
-}
-
-static cairo_status_t
-surface_write (void                *closure,
-               const unsigned char *data,
-               unsigned int         length)
-{
-  g_byte_array_append (closure, data, length);
-
-  return CAIRO_STATUS_SUCCESS;
+  gtk_snapshot_append_texture_node (snapshot,
+                                    surface->texture,
+                                    &GRAPHENE_RECT_INIT (0, 0, width, height),
+                                    "Surface Image %dx%d",
+                                    gsk_texture_get_width (surface->texture),
+                                    gsk_texture_get_height (surface->texture));
 }
 
 static void
 gtk_css_image_surface_print (GtkCssImage *image,
                              GString     *string)
 {
-#if CAIRO_HAS_PNG_FUNCTIONS
-  GtkCssImageSurface *surface = GTK_CSS_IMAGE_SURFACE (image);
-  GByteArray *array;
-  char *base64;
-  
-  array = g_byte_array_new ();
-  cairo_surface_write_to_png_stream (surface->surface, surface_write, array);
-  base64 = g_base64_encode (array->data, array->len);
-  g_byte_array_free (array, TRUE);
-
-  g_string_append (string, "url(\"data:image/png;base64,");
-  g_string_append (string, base64);
-  g_string_append (string, "\")");
-
-  g_free (base64);
-#else
-  g_string_append (string, "none /* you need cairo png functions enabled to make this work */");
-#endif
+  g_string_append (string, "none /* FIXME */");
 }
 
 static void
@@ -102,11 +76,7 @@ gtk_css_image_surface_dispose (GObject *object)
 {
   GtkCssImageSurface *surface = GTK_CSS_IMAGE_SURFACE (object);
 
-  if (surface->surface)
-    {
-      cairo_surface_destroy (surface->surface);
-      surface->surface = NULL;
-    }
+  g_clear_pointer (&surface->texture, gsk_texture_unref);
 
   G_OBJECT_CLASS (_gtk_css_image_surface_parent_class)->dispose (object);
 }
@@ -119,7 +89,7 @@ _gtk_css_image_surface_class_init (GtkCssImageSurfaceClass *klass)
 
   image_class->get_width = gtk_css_image_surface_get_width;
   image_class->get_height = gtk_css_image_surface_get_height;
-  image_class->draw = gtk_css_image_surface_draw;
+  image_class->snapshot = gtk_css_image_surface_snapshot;
   image_class->print = gtk_css_image_surface_print;
 
   object_class->dispose = gtk_css_image_surface_dispose;
@@ -131,31 +101,29 @@ _gtk_css_image_surface_init (GtkCssImageSurface *image_surface)
 }
 
 GtkCssImage *
-_gtk_css_image_surface_new (cairo_surface_t *surface)
+gtk_css_image_surface_new (GskTexture *texture)
 {
   GtkCssImage *image;
 
-  g_return_val_if_fail (surface != NULL, NULL);
-
   image = g_object_new (GTK_TYPE_CSS_IMAGE_SURFACE, NULL);
   
-  GTK_CSS_IMAGE_SURFACE (image)->surface = cairo_surface_reference (surface);
+  if (texture)
+    GTK_CSS_IMAGE_SURFACE (image)->texture = gsk_texture_ref (texture);
 
   return image;
 }
 
 GtkCssImage *
-_gtk_css_image_surface_new_for_pixbuf (GdkPixbuf *pixbuf)
+gtk_css_image_surface_new_for_pixbuf (GdkPixbuf *pixbuf)
 {
   GtkCssImage *image;
-  cairo_surface_t *surface;
+  GskTexture *texture;
 
   g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
 
-  surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 1, NULL);
-
-  image = _gtk_css_image_surface_new (surface);
-  cairo_surface_destroy (surface);
+  texture = gsk_texture_new_for_pixbuf (pixbuf);
+  image = gtk_css_image_surface_new (texture);
+  gsk_texture_unref (texture);
 
   return image;
 }
diff --git a/gtk/gtkcssimagesurfaceprivate.h b/gtk/gtkcssimagesurfaceprivate.h
index 87baab2..5878f95 100644
--- a/gtk/gtkcssimagesurfaceprivate.h
+++ b/gtk/gtkcssimagesurfaceprivate.h
@@ -38,7 +38,7 @@ struct _GtkCssImageSurface
 {
   GtkCssImage parent;
 
-  cairo_surface_t *surface;             /* the surface we render - guaranteed to be an image surface */
+  GskTexture *texture; /* the texture we render */
 };
 
 struct _GtkCssImageSurfaceClass
@@ -48,8 +48,8 @@ struct _GtkCssImageSurfaceClass
 
 GType          _gtk_css_image_surface_get_type             (void) G_GNUC_CONST;
 
-GtkCssImage *  _gtk_css_image_surface_new                  (cairo_surface_t *surface);
-GtkCssImage *  _gtk_css_image_surface_new_for_pixbuf       (GdkPixbuf       *pixbuf);
+GtkCssImage *  gtk_css_image_surface_new                   (GskTexture      *texture);
+GtkCssImage *  gtk_css_image_surface_new_for_pixbuf        (GdkPixbuf       *pixbuf);
 
 G_END_DECLS
 
diff --git a/gtk/gtkcssimageurl.c b/gtk/gtkcssimageurl.c
index 7e83f13..03e80a0 100644
--- a/gtk/gtkcssimageurl.c
+++ b/gtk/gtkcssimageurl.c
@@ -66,8 +66,6 @@ gtk_css_image_url_load_image (GtkCssImageUrl  *url,
 
   if (pixbuf == NULL)
     {
-      cairo_surface_t *empty;
-
       if (error)
         {
           char *uri;
@@ -81,13 +79,11 @@ gtk_css_image_url_load_image (GtkCssImageUrl  *url,
           g_free (uri);
        }
 
-      empty = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
-      url->loaded_image = _gtk_css_image_surface_new (empty);
-      cairo_surface_destroy (empty);
+      url->loaded_image = gtk_css_image_surface_new (NULL);
       return url->loaded_image;
     }
 
-  url->loaded_image = _gtk_css_image_surface_new_for_pixbuf (pixbuf);
+  url->loaded_image = gtk_css_image_surface_new_for_pixbuf (pixbuf);
   g_object_unref (pixbuf);
 
   return url->loaded_image;


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