[gimp] app: port GimpFgBgView rendering to cairo



commit 8d67b5b69b01e5868456cf0f1858359f8936375c
Author: Michael Natterer <mitch gimp org>
Date:   Thu Jul 29 14:05:51 2010 +0200

    app: port GimpFgBgView rendering to cairo

 app/widgets/gimpfgbgview.c |   92 ++++++++++---------------------------------
 app/widgets/gimpfgbgview.h |    3 -
 2 files changed, 22 insertions(+), 73 deletions(-)
---
diff --git a/app/widgets/gimpfgbgview.c b/app/widgets/gimpfgbgview.c
index d7b022b..40a8b6c 100644
--- a/app/widgets/gimpfgbgview.c
+++ b/app/widgets/gimpfgbgview.c
@@ -139,68 +139,9 @@ gimp_fg_bg_view_destroy (GtkObject *object)
   if (view->context)
     gimp_fg_bg_view_set_context (view, NULL);
 
-  if (view->render_buf)
-    {
-      g_free (view->render_buf);
-      view->render_buf = NULL;
-      view->render_buf_size = 0;
-    }
-
   GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
-static void
-gimp_fg_bg_view_draw_rect (GimpFgBgView  *view,
-                           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;
-
-  if (! (width > 0 && height > 0))
-    return;
-
-  gimp_rgb_get_uchar (color, &r, &g, &b);
-
-  rowstride = 3 * ((width + 3) & -4);
-
-  if (! view->render_buf || view->render_buf_size < height * rowstride)
-    {
-      view->render_buf_size = rowstride * height;
-
-      g_free (view->render_buf);
-      view->render_buf = g_malloc (view->render_buf_size);
-    }
-
-  bp = view->render_buf;
-  for (xx = 0; xx < width; xx++)
-    {
-      *bp++ = r;
-      *bp++ = g;
-      *bp++ = b;
-    }
-
-  bp = view->render_buf;
-
-  for (yy = 1; yy < height; yy++)
-    {
-      bp += rowstride;
-      memcpy (bp, view->render_buf, rowstride);
-    }
-
-  gdk_draw_rgb_image (drawable, gc, x, y, width, height,
-                      GDK_RGB_DITHER_MAX,
-                      view->render_buf,
-                      rowstride);
-}
-
 static gboolean
 gimp_fg_bg_view_expose (GtkWidget      *widget,
                         GdkEventExpose *eevent)
@@ -208,6 +149,7 @@ gimp_fg_bg_view_expose (GtkWidget      *widget,
   GimpFgBgView *view   = GIMP_FG_BG_VIEW (widget);
   GtkStyle     *style  = gtk_widget_get_style (widget);
   GdkWindow    *window = gtk_widget_get_window (widget);
+  cairo_t      *cr;
   GtkAllocation allocation;
   gint          x, y;
   gint          width, height;
@@ -217,6 +159,11 @@ gimp_fg_bg_view_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);
 
   x      = allocation.x;
@@ -232,12 +179,14 @@ gimp_fg_bg_view_expose (GtkWidget      *widget,
   if (view->context)
     {
       gimp_context_get_background (view->context, &color);
-      gimp_fg_bg_view_draw_rect (view, window,
-                                 style->fg_gc[0],
-                                 x + width  - rect_w + 1,
-                                 y + height - rect_h + 1,
-                                 rect_w - 2, rect_h - 2,
-                                 &color);
+      gimp_cairo_set_source_rgb (cr, &color);
+
+      cairo_rectangle (cr,
+                       x + width  - rect_w + 1,
+                       y + height - rect_h + 1,
+                       rect_w - 2,
+                       rect_h - 2);
+      cairo_fill (cr);
     }
 
   gtk_paint_shadow (style, window, GTK_STATE_NORMAL,
@@ -250,11 +199,14 @@ gimp_fg_bg_view_expose (GtkWidget      *widget,
   if (view->context)
     {
       gimp_context_get_foreground (view->context, &color);
-      gimp_fg_bg_view_draw_rect (view, window,
-                                 style->fg_gc[0],
-                                 x + 1, y + 1,
-                                 rect_w - 2, rect_h - 2,
-                                 &color);
+      gimp_cairo_set_source_rgb (cr, &color);
+
+      cairo_rectangle (cr,
+                       x + 1,
+                       y + 1,
+                       rect_w - 2,
+                       rect_h - 2);
+      cairo_fill (cr);
     }
 
   gtk_paint_shadow (style, window, GTK_STATE_NORMAL,
diff --git a/app/widgets/gimpfgbgview.h b/app/widgets/gimpfgbgview.h
index c27d40d..067c4d3 100644
--- a/app/widgets/gimpfgbgview.h
+++ b/app/widgets/gimpfgbgview.h
@@ -37,9 +37,6 @@ struct _GimpFgBgView
   GtkWidget    parent_instance;
 
   GimpContext *context;
-
-  guchar      *render_buf;
-  gint         render_buf_size;
 };
 
 struct _GimpFgBgViewClass



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