[gimp] libgimp: port GimpGradientSelectButton drawing to cairo



commit 1a893ce0b46a887a501ef6356debacc0a11c597c
Author: Michael Natterer <mitch gimp org>
Date:   Fri Jul 30 16:20:45 2010 +0200

    libgimp: port GimpGradientSelectButton drawing to cairo

 libgimp/gimpgradientselectbutton.c |  101 +++++++++++++++++-------------------
 1 files changed, 48 insertions(+), 53 deletions(-)
---
diff --git a/libgimp/gimpgradientselectbutton.c b/libgimp/gimpgradientselectbutton.c
index 1085830..1d2ddde 100644
--- a/libgimp/gimpgradientselectbutton.c
+++ b/libgimp/gimpgradientselectbutton.c
@@ -104,9 +104,9 @@ static void gimp_gradient_select_preview_size_allocate
                                                  (GtkWidget                *widget,
                                                   GtkAllocation            *allocation,
                                                   GimpGradientSelectButton *button);
-static void gimp_gradient_select_preview_expose  (GtkWidget                *preview,
-                                                  GdkEventExpose           *event,
-                                                  GimpGradientSelectButton *button);
+static gboolean gimp_gradient_select_preview_expose   (GtkWidget                *preview,
+                                                       GdkEventExpose           *event,
+                                                       GimpGradientSelectButton *button);
 
 static void   gimp_gradient_select_drag_data_received (GimpGradientSelectButton *button,
                                                        GdkDragContext           *context,
@@ -479,78 +479,73 @@ gimp_gradient_select_preview_size_allocate (GtkWidget                *widget,
     }
 }
 
-static void
+static gboolean
 gimp_gradient_select_preview_expose (GtkWidget                *widget,
                                      GdkEventExpose           *event,
                                      GimpGradientSelectButton *button)
 {
+  GimpGradientSelectButtonPrivate *priv;
+  GtkAllocation                    allocation;
+  cairo_t                         *cr;
+  cairo_pattern_t                 *pattern;
+  cairo_surface_t                 *surface;
   const gdouble                   *src;
-  guchar                          *p0;
-  guchar                          *p1;
-  guchar                          *even;
-  guchar                          *odd;
+  guchar                          *dest;
   gint                             width;
-  gint                             x, y;
-  GimpGradientSelectButtonPrivate *priv;
+  gint                             x;
 
   priv = GIMP_GRADIENT_SELECT_BUTTON_GET_PRIVATE (button);
 
   src = priv->gradient_data;
   if (! src)
-    return;
+    return FALSE;
 
-  width = priv->n_samples / 4;
+  gtk_widget_get_allocation (widget, &allocation);
 
-  p0 = even = g_malloc (width * 3);
-  p1 = odd  = g_malloc (width * 3);
+  cr = gdk_cairo_create (event->window);
 
-  for (x = 0; x < width; x++)
-    {
-      gdouble  r, g, b, a;
-      gdouble  c0, c1;
+  gdk_cairo_region (cr, event->region);
+  cairo_clip (cr);
 
-      r = src[x * 4 + 0];
-      g = src[x * 4 + 1];
-      b = src[x * 4 + 2];
-      a = src[x * 4 + 3];
+  pattern = gimp_cairo_checkerboard_create (cr, GIMP_CHECK_SIZE_SM, NULL, NULL);
+  cairo_set_source (cr, pattern);
+  cairo_pattern_destroy (pattern);
 
-      if ((x / GIMP_CHECK_SIZE_SM) & 1)
-        {
-          c0 = GIMP_CHECK_LIGHT;
-          c1 = GIMP_CHECK_DARK;
-        }
-      else
-        {
-          c0 = GIMP_CHECK_DARK;
-          c1 = GIMP_CHECK_LIGHT;
-        }
+  cairo_paint (cr);
 
-      *p0++ = (c0 + (r - c0) * a) * 255.0;
-      *p0++ = (c0 + (g - c0) * a) * 255.0;
-      *p0++ = (c0 + (b - c0) * a) * 255.0;
+  width = priv->n_samples / 4;
 
-      *p1++ = (c1 + (r - c1) * a) * 255.0;
-      *p1++ = (c1 + (g - c1) * a) * 255.0;
-      *p1++ = (c1 + (b - c1) * a) * 255.0;
-    }
+  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, 1);
 
-  for (y = event->area.y; y < event->area.y + event->area.height; y++)
+  for (x = 0, dest = cairo_image_surface_get_data (surface);
+       x < width;
+       x++, src += 4, dest += 4)
     {
-      GtkStyle *style = gtk_widget_get_style (widget);
-      guchar   *buf   = ((y / GIMP_CHECK_SIZE_SM) & 1) ? odd : even;
-
-      gdk_draw_rgb_image_dithalign (gtk_widget_get_window (widget),
-                                    style->fg_gc[gtk_widget_get_state (widget)],
-                                    event->area.x, y,
-                                    event->area.width, 1,
-                                    GDK_RGB_DITHER_MAX,
-                                    buf + event->area.x * 3,
-                                    width * 3,
-                                    - event->area.x, - y);
+      GimpRGB color;
+      guchar  r, g, b, a;
+
+      gimp_rgba_set (&color, src[0], src[1], src[2], src[3]);
+      gimp_rgba_get_uchar (&color, &r, &g, &b, &a);
+
+      GIMP_CAIRO_ARGB32_SET_PIXEL(dest, r, g, b, a);
     }
 
-  g_free (odd);
-  g_free (even);
+  cairo_surface_mark_dirty (surface);
+
+  pattern = cairo_pattern_create_for_surface (surface);
+  cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REFLECT);
+  cairo_surface_destroy (surface);
+
+  cairo_scale (cr, (gdouble) allocation.width / (gdouble) width, 1.0);
+
+  cairo_set_source (cr, pattern);
+  cairo_pattern_destroy (pattern);
+
+  cairo_paint (cr);
+
+  cairo_destroy (cr);
+
+  return FALSE;
 }
 
 static void



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