[gimp] libgimpwidgets: port GimpColorArea drawing to cairo
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimpwidgets: port GimpColorArea drawing to cairo
- Date: Fri, 10 Sep 2010 17:54:52 +0000 (UTC)
commit 8b4bcbb9e13f9e7f373b8ea0f8de07d5f422b3a1
Author: Michael Natterer <mitch gimp org>
Date: Fri Sep 10 19:53:48 2010 +0200
libgimpwidgets: port GimpColorArea drawing to cairo
And unexport an unused lib-internal function. Leave it there privately
though because it might be useful later.
libgimpwidgets/gimpcolorarea.c | 164 +++++++++++++++++++++++-----------------
libgimpwidgets/gimpcolorarea.h | 10 ---
2 files changed, 94 insertions(+), 80 deletions(-)
---
diff --git a/libgimpwidgets/gimpcolorarea.c b/libgimpwidgets/gimpcolorarea.c
index 340f500..3f4edec 100644
--- a/libgimpwidgets/gimpcolorarea.c
+++ b/libgimpwidgets/gimpcolorarea.c
@@ -28,6 +28,7 @@
#include "gimpwidgetstypes.h"
+#include "gimpcairo-utils.h"
#include "gimpcolorarea.h"
@@ -77,6 +78,14 @@ static void gimp_color_area_state_changed (GtkWidget *widget,
GtkStateType previous_state);
static gboolean gimp_color_area_expose (GtkWidget *widget,
GdkEventExpose *event);
+static void gimp_color_area_render_buf (GtkWidget *widget,
+ gboolean insensitive,
+ GimpColorAreaType type,
+ guchar *buf,
+ guint width,
+ guint height,
+ guint rowstride,
+ GimpRGB *color);
static void gimp_color_area_render (GimpColorArea *area);
static void gimp_color_area_drag_begin (GtkWidget *widget,
@@ -305,7 +314,7 @@ gimp_color_area_size_allocate (GtkWidget *widget,
area->width = allocation->width;
area->height = allocation->height;
- area->rowstride = (area->width * 3 + 3) & ~0x3;
+ area->rowstride = area->width * 4 + 4;
g_free (area->buf);
area->buf = g_new (guchar, area->rowstride * area->height);
@@ -332,9 +341,10 @@ static gboolean
gimp_color_area_expose (GtkWidget *widget,
GdkEventExpose *event)
{
- GimpColorArea *area = GIMP_COLOR_AREA (widget);
- GtkStyle *style = gtk_widget_get_style (widget);
- guchar *buf;
+ GimpColorArea *area = GIMP_COLOR_AREA (widget);
+ GtkStyle *style = gtk_widget_get_style (widget);
+ cairo_t *cr;
+ cairo_surface_t *buffer;
if (! area->buf || ! gtk_widget_is_drawable (widget))
return FALSE;
@@ -342,26 +352,33 @@ gimp_color_area_expose (GtkWidget *widget,
if (area->needs_render)
gimp_color_area_render (area);
- buf = area->buf + event->area.y * area->rowstride + event->area.x * 3;
+ cr = gdk_cairo_create (gtk_widget_get_window (widget));
- gdk_draw_rgb_image_dithalign (gtk_widget_get_window (widget),
- style->black_gc,
- event->area.x,
- event->area.y,
- event->area.width,
- event->area.height,
- GDK_RGB_DITHER_MAX,
- buf,
- area->rowstride,
- event->area.x,
- event->area.y);
+ gdk_cairo_region (cr, event->region);
+ cairo_clip (cr);
+
+ buffer = cairo_image_surface_create_for_data (area->buf,
+ CAIRO_FORMAT_RGB24,
+ area->width,
+ area->height,
+ area->rowstride);
+ cairo_set_source_surface (cr, buffer, 0.0, 0.0);
+ cairo_surface_destroy (buffer);
+
+ cairo_paint (cr);
if (area->draw_border)
- gdk_draw_rectangle (gtk_widget_get_window (widget),
- style->fg_gc[gtk_widget_get_state (widget)],
- FALSE,
- 0, 0,
- area->width - 1, area->height - 1);
+ {
+ cairo_set_line_width (cr, 1.0);
+ gdk_cairo_set_source_color (cr,
+ &style->fg[gtk_widget_get_state (widget)]);
+
+ cairo_rectangle (cr, 0.5, 0.5, area->width - 1, area->height - 1);
+
+ cairo_stroke (cr);
+ }
+
+ cairo_destroy (cr);
return FALSE;
}
@@ -505,17 +522,17 @@ gimp_color_area_set_draw_border (GimpColorArea *area,
}
}
-void
-_gimp_color_area_render_buf (GtkWidget *widget,
- gboolean insensitive,
- GimpColorAreaType type,
- guchar *buf,
- guint width,
- guint height,
- guint rowstride,
- GimpRGB *color)
+static void
+gimp_color_area_render_buf (GtkWidget *widget,
+ gboolean insensitive,
+ GimpColorAreaType type,
+ guchar *buf,
+ guint width,
+ guint height,
+ guint rowstride,
+ GimpRGB *color)
{
- GtkStyle *style;
+ GtkStyle *style = gtk_widget_get_style (widget);
guint x, y;
guint check_size = 0;
guchar light[3];
@@ -525,12 +542,6 @@ _gimp_color_area_render_buf (GtkWidget *widget,
guchar *p;
gdouble frac;
- g_return_if_fail (GTK_IS_WIDGET (widget));
- g_return_if_fail (buf != NULL);
- g_return_if_fail (color != NULL);
-
- style = gtk_widget_get_style (widget);
-
switch (type)
{
case GIMP_COLOR_AREA_FLAT:
@@ -562,16 +573,20 @@ _gimp_color_area_render_buf (GtkWidget *widget,
{
if (insensitive && ((x + y) % 2))
{
- *p++ = insens[0];
- *p++ = insens[1];
- *p++ = insens[2];
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ insens[0],
+ insens[1],
+ insens[2]);
}
else
{
- *p++ = opaque[0];
- *p++ = opaque[1];
- *p++ = opaque[2];
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ opaque[0],
+ opaque[1],
+ opaque[2]);
}
+
+ p += 4;
}
}
@@ -600,9 +615,11 @@ _gimp_color_area_render_buf (GtkWidget *widget,
{
if ((width - x) * height > y * width)
{
- *p++ = opaque[0];
- *p++ = opaque[1];
- *p++ = opaque[2];
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ opaque[0],
+ opaque[1],
+ opaque[2]);
+ p += 4;
continue;
}
@@ -613,53 +630,60 @@ _gimp_color_area_render_buf (GtkWidget *widget,
{
if ((gint) frac)
{
- *p++ = light[0];
- *p++ = light[1];
- *p++ = light[2];
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ light[0],
+ light[1],
+ light[2]);
}
else
{
- *p++ = ((gdouble) light[0] * frac +
- (gdouble) opaque[0] * (1.0 - frac));
- *p++ = ((gdouble) light[1] * frac +
- (gdouble) opaque[1] * (1.0 - frac));
- *p++ = ((gdouble) light[2] * frac +
- (gdouble) opaque[2] * (1.0 - frac));
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ ((gdouble) light[0] * frac +
+ (gdouble) opaque[0] * (1.0 - frac)),
+ ((gdouble) light[1] * frac +
+ (gdouble) opaque[1] * (1.0 - frac)),
+ ((gdouble) light[2] * frac +
+ (gdouble) opaque[2] * (1.0 - frac)));
}
}
else
{
if ((gint) frac)
{
- *p++ = dark[0];
- *p++ = dark[1];
- *p++ = dark[2];
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ dark[0],
+ dark[1],
+ dark[2]);
}
else
{
- *p++ = ((gdouble) dark[0] * frac +
- (gdouble) opaque[0] * (1.0 - frac));
- *p++ = ((gdouble) dark[1] * frac +
- (gdouble) opaque[1] * (1.0 - frac));
- *p++ = ((gdouble) dark[2] * frac +
- (gdouble) opaque[2] * (1.0 - frac));
+ GIMP_CAIRO_RGB24_SET_PIXEL (p,
+ ((gdouble) dark[0] * frac +
+ (gdouble) opaque[0] * (1.0 - frac)),
+ ((gdouble) dark[1] * frac +
+ (gdouble) opaque[1] * (1.0 - frac)),
+ ((gdouble) dark[2] * frac +
+ (gdouble) opaque[2] * (1.0 - frac)));
}
}
+
+ p += 4;
}
}
}
+
static void
gimp_color_area_render (GimpColorArea *area)
{
if (! area->buf)
return;
- _gimp_color_area_render_buf (GTK_WIDGET (area),
- ! gtk_widget_is_sensitive (GTK_WIDGET (area)),
- area->type,
- area->buf,
- area->width, area->height, area->rowstride,
- &area->color);
+ gimp_color_area_render_buf (GTK_WIDGET (area),
+ ! gtk_widget_is_sensitive (GTK_WIDGET (area)),
+ area->type,
+ area->buf,
+ area->width, area->height, area->rowstride,
+ &area->color);
area->needs_render = FALSE;
}
diff --git a/libgimpwidgets/gimpcolorarea.h b/libgimpwidgets/gimpcolorarea.h
index 37185dc..1e240c2 100644
--- a/libgimpwidgets/gimpcolorarea.h
+++ b/libgimpwidgets/gimpcolorarea.h
@@ -86,16 +86,6 @@ void gimp_color_area_set_type (GimpColorArea *area,
void gimp_color_area_set_draw_border (GimpColorArea *area,
gboolean draw_border);
-/* only for private use in libgimpwidgets */
-G_GNUC_INTERNAL void _gimp_color_area_render_buf (GtkWidget *widget,
- gboolean insensitive,
- GimpColorAreaType type,
- guchar *buf,
- guint width,
- guint height,
- guint rowstride,
- GimpRGB *color);
-
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]