Revert "Break out cairo color matrix recoloring to gdk_cairo_image_surface_recolor()"
authorBenjamin Otte <otte@redhat.com>
Sat, 1 Feb 2020 23:56:39 +0000 (00:56 +0100)
committerAlexander Larsson <alexl@redhat.com>
Tue, 4 Feb 2020 15:43:59 +0000 (16:43 +0100)
We're not in the business of adding Cairo APIs. That's Cairo's job.

Also, we don't need this API anywhere like the original commit claimed,
so there's no need to make it available in any way.

This reverts commit afa6cc23692f83f0d38de24c9cf58a7a494c01d2.

gdk/gdkcairo.c
gdk/gdkcairo.h
gsk/gskrendernodeimpl.c

index 68d46aa4ae35cf3b7f07ea108f2a127651edac8f..c5917cfeb9e76876fe0268979a411fae855713f1 100644 (file)
@@ -456,74 +456,3 @@ gdk_cairo_region_from_clip (cairo_t *cr)
 
   return region;
 }
-
-/**
- * gdk_cairo_image_surface_recolor:
- * @image_surface: a cairo image surface
- * @color_matrix: the color matrix to use
- * @color_offset: the color offset to use
- *
- * Modifies the colors of an surfaceimage by applying an affine transformation
- * in RGB space.
- *
- * This is the same operation as in gtk_snapshot_push_color_matrix() but
- * always done on the cpu.
- */
-void
-gdk_cairo_image_surface_recolor (cairo_surface_t         *image_surface,
-                                 const graphene_matrix_t *color_matrix,
-                                 const graphene_vec4_t   *color_offset)
-{
-  graphene_vec4_t pixel;
-  guint32* pixel_data;
-  guchar *data;
-  gsize x, y, width, height, stride;
-  float alpha;
-
-  data = cairo_image_surface_get_data (image_surface);
-  width = cairo_image_surface_get_width (image_surface);
-  height = cairo_image_surface_get_height (image_surface);
-  stride = cairo_image_surface_get_stride (image_surface);
-
-  for (y = 0; y < height; y++)
-    {
-      pixel_data = (guint32 *) data;
-      for (x = 0; x < width; x++)
-        {
-          alpha = ((pixel_data[x] >> 24) & 0xFF) / 255.0;
-
-          if (alpha == 0)
-            {
-              graphene_vec4_init (&pixel, 0.0, 0.0, 0.0, 0.0);
-            }
-          else
-            {
-              graphene_vec4_init (&pixel,
-                                  ((pixel_data[x] >> 16) & 0xFF) / (255.0 * alpha),
-                                  ((pixel_data[x] >>  8) & 0xFF) / (255.0 * alpha),
-                                  ( pixel_data[x]        & 0xFF) / (255.0 * alpha),
-                                  alpha);
-              graphene_matrix_transform_vec4 (color_matrix, &pixel, &pixel);
-            }
-
-          graphene_vec4_add (&pixel, color_offset, &pixel);
-
-          alpha = graphene_vec4_get_w (&pixel);
-          if (alpha > 0.0)
-            {
-              alpha = MIN (alpha, 1.0);
-              pixel_data[x] = (((guint32) roundf (alpha * 255)) << 24) |
-                              (((guint32) roundf (CLAMP (graphene_vec4_get_x (&pixel), 0, 1) * alpha * 255)) << 16) |
-                              (((guint32) roundf (CLAMP (graphene_vec4_get_y (&pixel), 0, 1) * alpha * 255)) <<  8) |
-                               ((guint32) roundf (CLAMP (graphene_vec4_get_z (&pixel), 0, 1) * alpha * 255));
-            }
-          else
-            {
-              pixel_data[x] = 0;
-            }
-        }
-      data += stride;
-    }
-
-  cairo_surface_mark_dirty (image_surface);
-}
index 934b5d17ed1bf4d00568e7410e5b656e1b2fd160..c4e2d3836c4bcf823a7f02b543af1e3261450af8 100644 (file)
@@ -26,7 +26,6 @@
 #include <gdk/gdkrgba.h>
 #include <gdk/gdkpixbuf.h>
 #include <pango/pangocairo.h>
-#include <graphene.h>
 
 G_BEGIN_DECLS
 
@@ -73,11 +72,6 @@ void      gdk_cairo_surface_upload_to_gl (cairo_surface_t *surface,
                                           int              height,
                                           GdkGLContext    *context);
 
-GDK_AVAILABLE_IN_ALL
-void      gdk_cairo_image_surface_recolor (cairo_surface_t         *image_surface,
-                                           const graphene_matrix_t *color_matrix,
-                                           const graphene_vec4_t   *color_offset);
-
 G_END_DECLS
 
 #endif /* __GDK_CAIRO_H__ */
index f82343054b773b6996952a292f5408a2f93dacf5..2434c5d40e2b7ace235d803143f632628ff9a53d 100644 (file)
@@ -2339,6 +2339,11 @@ gsk_color_matrix_node_draw (GskRenderNode *node,
   GskColorMatrixNode *self = (GskColorMatrixNode *) node;
   cairo_pattern_t *pattern;
   cairo_surface_t *surface, *image_surface;
+  graphene_vec4_t pixel;
+  guint32* pixel_data;
+  guchar *data;
+  gsize x, y, width, height, stride;
+  float alpha;
 
   cairo_save (cr);
 
@@ -2355,10 +2360,52 @@ gsk_color_matrix_node_draw (GskRenderNode *node,
   cairo_pattern_get_surface (pattern, &surface);
   image_surface = cairo_surface_map_to_image (surface, NULL);
 
-  gdk_cairo_image_surface_recolor (image_surface,
-                                   &self->color_matrix,
-                                   &self->color_offset);
+  data = cairo_image_surface_get_data (image_surface);
+  width = cairo_image_surface_get_width (image_surface);
+  height = cairo_image_surface_get_height (image_surface);
+  stride = cairo_image_surface_get_stride (image_surface);
 
+  for (y = 0; y < height; y++)
+    {
+      pixel_data = (guint32 *) data;
+      for (x = 0; x < width; x++)
+        {
+          alpha = ((pixel_data[x] >> 24) & 0xFF) / 255.0;
+
+          if (alpha == 0)
+            {
+              graphene_vec4_init (&pixel, 0.0, 0.0, 0.0, 0.0);
+            }
+          else
+            {
+              graphene_vec4_init (&pixel,
+                                  ((pixel_data[x] >> 16) & 0xFF) / (255.0 * alpha),
+                                  ((pixel_data[x] >>  8) & 0xFF) / (255.0 * alpha),
+                                  ( pixel_data[x]        & 0xFF) / (255.0 * alpha),
+                                  alpha);
+              graphene_matrix_transform_vec4 (&self->color_matrix, &pixel, &pixel);
+            }
+
+          graphene_vec4_add (&pixel, &self->color_offset, &pixel);
+
+          alpha = graphene_vec4_get_w (&pixel);
+          if (alpha > 0.0)
+            {
+              alpha = MIN (alpha, 1.0);
+              pixel_data[x] = (((guint32) roundf (alpha * 255)) << 24) |
+                              (((guint32) roundf (CLAMP (graphene_vec4_get_x (&pixel), 0, 1) * alpha * 255)) << 16) |
+                              (((guint32) roundf (CLAMP (graphene_vec4_get_y (&pixel), 0, 1) * alpha * 255)) <<  8) |
+                               ((guint32) roundf (CLAMP (graphene_vec4_get_z (&pixel), 0, 1) * alpha * 255));
+            }
+          else
+            {
+              pixel_data[x] = 0;
+            }
+        }
+      data += stride;
+    }
+
+  cairo_surface_mark_dirty (image_surface);
   cairo_surface_unmap_image (surface, image_surface);
 
   cairo_set_source (cr, pattern);