[gimp] app: port GimpFgBgEditor drawing to cairo



commit d28a04ac045fe182da25700ec8caf45a340d2923
Author: Michael Natterer <mitch gimp org>
Date:   Thu Jul 29 14:20:37 2010 +0200

    app: port GimpFgBgEditor drawing to cairo

 app/widgets/gimpfgbgeditor.c |  117 ++++++++++++++----------------------------
 app/widgets/gimpfgbgeditor.h |    3 -
 2 files changed, 38 insertions(+), 82 deletions(-)
---
diff --git a/app/widgets/gimpfgbgeditor.c b/app/widgets/gimpfgbgeditor.c
index 5286319..ae5c6b9 100644
--- a/app/widgets/gimpfgbgeditor.c
+++ b/app/widgets/gimpfgbgeditor.c
@@ -207,13 +207,6 @@ gimp_fg_bg_editor_destroy (GtkObject *object)
   if (editor->context)
     gimp_fg_bg_editor_set_context (editor, NULL);
 
-  if (editor->render_buf)
-    {
-      g_free (editor->render_buf);
-      editor->render_buf = NULL;
-      editor->render_buf_size = 0;
-    }
-
   if (editor->default_icon)
     {
       g_object_unref (editor->default_icon);
@@ -229,57 +222,6 @@ gimp_fg_bg_editor_destroy (GtkObject *object)
   GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
-static void
-gimp_fg_bg_editor_draw_rect (GimpFgBgEditor *editor,
-                             GdkDrawable    *drawable,
-                             GdkGC          *gc,
-                             gint            x,
-                             gint            y,
-                             gint            width,
-                             gint            height,
-                             const GimpRGB  *color)
-{
-  gint    rowstride;
-  guchar  r, g, b;
-  gint    xx, yy;
-  guchar *bp;
-
-  g_return_if_fail (width > 0 && height > 0);
-
-  gimp_rgb_get_uchar (color, &r, &g, &b);
-
-  rowstride = 3 * ((width + 3) & -4);
-
-  if (! editor->render_buf || editor->render_buf_size < height * rowstride)
-    {
-      editor->render_buf_size = rowstride * height;
-
-      g_free (editor->render_buf);
-      editor->render_buf = g_malloc (editor->render_buf_size);
-    }
-
-  bp = editor->render_buf;
-  for (xx = 0; xx < width; xx++)
-    {
-      *bp++ = r;
-      *bp++ = g;
-      *bp++ = b;
-    }
-
-  bp = editor->render_buf;
-
-  for (yy = 1; yy < height; yy++)
-    {
-      bp += rowstride;
-      memcpy (bp, editor->render_buf, rowstride);
-    }
-
-  gdk_draw_rgb_image (drawable, gc, x, y, width, height,
-                      GDK_RGB_DITHER_MAX,
-                      editor->render_buf,
-                      rowstride);
-}
-
 static gboolean
 gimp_fg_bg_editor_expose (GtkWidget      *widget,
                           GdkEventExpose *eevent)
@@ -287,6 +229,7 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
   GimpFgBgEditor *editor = GIMP_FG_BG_EDITOR (widget);
   GtkStyle       *style  = gtk_widget_get_style (widget);
   GdkWindow      *window = gtk_widget_get_window (widget);
+  cairo_t        *cr;
   GtkAllocation   allocation;
   gint            width, height;
   gint            default_w, default_h;
@@ -297,6 +240,11 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
   if (! gtk_widget_is_drawable (widget))
     return FALSE;
 
+  cr = gdk_cairo_create (eevent->window);
+
+  gdk_cairo_region (cr, eevent->region);
+  cairo_clip (cr);
+
   gtk_widget_get_allocation (widget, &allocation);
 
   width  = allocation.width;
@@ -312,11 +260,15 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
   default_h = gdk_pixbuf_get_height (editor->default_icon);
 
   if (default_w < width / 2 && default_h < height / 2)
-    gdk_draw_pixbuf (window, NULL, editor->default_icon,
-                     0, 0, 0, height - default_h, default_w, default_h,
-                     GDK_RGB_DITHER_NORMAL, 0, 0);
+    {
+      gdk_cairo_set_source_pixbuf (cr, editor->default_icon,
+                                   0, height - default_h);
+      cairo_paint (cr);
+    }
   else
-    default_w = default_h = 0;
+    {
+      default_w = default_h = 0;
+    }
 
   /*  draw the swap colors pixbuf  */
   if (! editor->swap_icon)
@@ -328,11 +280,15 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
   swap_h = gdk_pixbuf_get_height (editor->swap_icon);
 
   if (swap_w < width / 2 && swap_h < height / 2)
-    gdk_draw_pixbuf (window, NULL, editor->swap_icon,
-                     0, 0, width - swap_w, 0, swap_w, swap_h,
-                     GDK_RGB_DITHER_NORMAL, 0, 0);
+    {
+      gdk_cairo_set_source_pixbuf (cr, editor->swap_icon,
+                                   width - swap_w, 0);
+      cairo_paint (cr);
+    }
   else
-    swap_w = swap_h = 0;
+    {
+      swap_w = swap_h = 0;
+    }
 
   rect_h = height - MAX (default_h, swap_h) - 2;
   rect_w = width  - MAX (default_w, swap_w) - 4;
@@ -350,13 +306,14 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
   if (editor->context)
     {
       gimp_context_get_background (editor->context, &color);
-      gimp_fg_bg_editor_draw_rect (editor,
-                                   window,
-                                   style->fg_gc[0],
-                                   (width - rect_w),
-                                   (height - rect_h),
-                                   rect_w, rect_h,
-                                   &color);
+      gimp_cairo_set_source_rgb (cr, &color);
+
+      cairo_rectangle (cr,
+                       width - rect_w,
+                       height - rect_h,
+                       rect_w,
+                       rect_h);
+      cairo_fill (cr);
     }
 
   gtk_paint_shadow (style, window, GTK_STATE_NORMAL,
@@ -373,12 +330,12 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
   if (editor->context)
     {
       gimp_context_get_foreground (editor->context, &color);
-      gimp_fg_bg_editor_draw_rect (editor,
-                                   window,
-                                   style->fg_gc[0],
-                                   0, 0,
-                                   rect_w, rect_h,
-                                   &color);
+      gimp_cairo_set_source_rgb (cr, &color);
+
+      cairo_rectangle (cr,
+                       0, 0,
+                       rect_w, rect_h);
+      cairo_fill (cr);
     }
 
   gtk_paint_shadow (style, window, GTK_STATE_NORMAL,
@@ -388,6 +345,8 @@ gimp_fg_bg_editor_expose (GtkWidget      *widget,
                     0, 0,
                     rect_w, rect_h);
 
+  cairo_destroy (cr);
+
   return TRUE;
 }
 
diff --git a/app/widgets/gimpfgbgeditor.h b/app/widgets/gimpfgbgeditor.h
index a430812..dad36bf 100644
--- a/app/widgets/gimpfgbgeditor.h
+++ b/app/widgets/gimpfgbgeditor.h
@@ -39,9 +39,6 @@ struct _GimpFgBgEditor
   GimpContext     *context;
   GimpActiveColor  active_color;
 
-  guchar          *render_buf;
-  gint             render_buf_size;
-
   GdkPixbuf       *default_icon;
   GdkPixbuf       *swap_icon;
 



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