[gimp] app: move the GTK-free cairo utility functions to core/gimp-cairo.[ch]
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: move the GTK-free cairo utility functions to core/gimp-cairo.[ch]
- Date: Wed, 2 May 2012 16:36:19 +0000 (UTC)
commit 53cf2c657b511da43c6dec3d3df472b75aa462a0
Author: Michael Natterer <mitch gimp org>
Date: Tue Apr 10 12:09:37 2012 +0200
app: move the GTK-free cairo utility functions to core/gimp-cairo.[ch]
app/core/Makefile.am | 2 +
app/core/core-types.h | 12 ++
app/core/gimp-cairo.c | 136 ++++++++++++++
app/{widgets/gimpcairo.h => core/gimp-cairo.h} | 9 +-
app/display/gimpcanvasarc.c | 2 +-
app/display/gimpcanvasboundary.c | 3 +-
app/display/gimpcanvascursor.c | 2 +-
app/display/gimpcanvashandle.c | 2 +-
app/display/gimpdisplayshell-callbacks.c | 2 +-
app/display/gimpdisplayshell-draw.c | 3 +-
app/display/gimpdisplayshell-selection.c | 3 +-
app/display/gimpdisplayshell-style.c | 3 +-
app/widgets/Makefile.am | 2 -
app/widgets/gimpcairo-wilber.c | 99 ++++++++++-
app/widgets/gimpcairo-wilber.h | 17 +-
app/widgets/gimpcairo.c | 232 ------------------------
app/widgets/gimptoolbox.c | 2 +-
app/widgets/widgets-types.h | 13 --
18 files changed, 270 insertions(+), 274 deletions(-)
---
diff --git a/app/core/Makefile.am b/app/core/Makefile.am
index d137309..d769be5 100644
--- a/app/core/Makefile.am
+++ b/app/core/Makefile.am
@@ -23,6 +23,8 @@ libappcore_a_sources = \
gimp.h \
gimp-apply-operation.c \
gimp-apply-operation.h \
+ gimp-cairo.c \
+ gimp-cairo.h \
gimp-contexts.c \
gimp-contexts.h \
gimp-edit.c \
diff --git a/app/core/core-types.h b/app/core/core-types.h
index 6deace2..b2945b9 100644
--- a/app/core/core-types.h
+++ b/app/core/core-types.h
@@ -233,6 +233,18 @@ struct _GimpCoords
gdouble direction;
};
+/* temp hack as replacement for GdkSegment */
+
+typedef struct _GimpSegment GimpSegment;
+
+struct _GimpSegment
+{
+ gint x1;
+ gint y1;
+ gint x2;
+ gint y2;
+};
+
#include "gegl/gimp-gegl-types.h"
#include "paint/paint-types.h"
diff --git a/app/core/gimp-cairo.c b/app/core/gimp-cairo.c
new file mode 100644
index 0000000..3bcdd93
--- /dev/null
+++ b/app/core/gimp-cairo.c
@@ -0,0 +1,136 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimp-cairo.c
+ * Copyright (C) 2010-2012 Michael Natterer <mitch gimp org>
+ *
+ * Some code here is based on code from librsvg that was originally
+ * written by Raph Levien <raph artofcode com> for Gill.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <cairo.h>
+#include <gegl.h>
+
+#include "libgimpcolor/gimpcolor.h"
+
+#include "core-types.h"
+
+#include "gimp-cairo.h"
+
+
+static cairo_user_data_key_t surface_data_key = { 0, };
+
+
+cairo_pattern_t *
+gimp_cairo_stipple_pattern_create (const GimpRGB *fg,
+ const GimpRGB *bg,
+ gint index)
+{
+ cairo_surface_t *surface;
+ cairo_pattern_t *pattern;
+ guchar *data;
+ guchar *d;
+ guchar fg_r, fg_g, fg_b, fg_a;
+ guchar bg_r, bg_g, bg_b, bg_a;
+ gint x, y;
+
+ g_return_val_if_fail (fg != NULL, NULL);
+ g_return_val_if_fail (bg != NULL, NULL);
+
+ data = g_malloc (8 * 8 * 4);
+
+ gimp_rgba_get_uchar (fg, &fg_r, &fg_g, &fg_b, &fg_a);
+ gimp_rgba_get_uchar (bg, &bg_r, &bg_g, &bg_b, &bg_a);
+
+ d = data;
+
+ for (y = 0; y < 8; y++)
+ {
+ for (x = 0; x < 8; x++)
+ {
+ if ((x + y + index) % 8 >= 4)
+ GIMP_CAIRO_ARGB32_SET_PIXEL (d, fg_r, fg_g, fg_b, fg_a);
+ else
+ GIMP_CAIRO_ARGB32_SET_PIXEL (d, bg_r, bg_g, bg_b, bg_a);
+
+ d += 4;
+ }
+ }
+
+ surface = cairo_image_surface_create_for_data (data,
+ CAIRO_FORMAT_ARGB32,
+ 8, 8, 8 * 4);
+ cairo_surface_set_user_data (surface, &surface_data_key,
+ data, (cairo_destroy_func_t) g_free);
+
+ pattern = cairo_pattern_create_for_surface (surface);
+ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+
+ cairo_surface_destroy (surface);
+
+ return pattern;
+}
+
+void
+gimp_cairo_add_arc (cairo_t *cr,
+ gdouble center_x,
+ gdouble center_y,
+ gdouble radius,
+ gdouble start_angle,
+ gdouble slice_angle)
+{
+ g_return_if_fail (cr != NULL);
+
+ if (slice_angle >= 0)
+ {
+ cairo_arc_negative (cr, center_x, center_y, radius,
+ - start_angle,
+ - start_angle - slice_angle);
+ }
+ else
+ {
+ cairo_arc (cr, center_x, center_y, radius,
+ - start_angle,
+ - start_angle - slice_angle);
+ }
+}
+
+void
+gimp_cairo_add_segments (cairo_t *cr,
+ GimpSegment *segs,
+ gint n_segs)
+{
+ gint i;
+
+ g_return_if_fail (cr != NULL);
+ g_return_if_fail (segs != NULL && n_segs > 0);
+
+ for (i = 0; i < n_segs; i++)
+ {
+ if (segs[i].x1 == segs[i].x2)
+ {
+ cairo_move_to (cr, segs[i].x1 + 0.5, segs[i].y1 + 0.5);
+ cairo_line_to (cr, segs[i].x2 + 0.5, segs[i].y2 - 0.5);
+ }
+ else
+ {
+ cairo_move_to (cr, segs[i].x1 + 0.5, segs[i].y1 + 0.5);
+ cairo_line_to (cr, segs[i].x2 - 0.5, segs[i].y2 + 0.5);
+ }
+ }
+}
diff --git a/app/widgets/gimpcairo.h b/app/core/gimp-cairo.h
similarity index 83%
rename from app/widgets/gimpcairo.h
rename to app/core/gimp-cairo.h
index f7080a2..140369d 100644
--- a/app/widgets/gimpcairo.h
+++ b/app/core/gimp-cairo.h
@@ -1,8 +1,8 @@
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
- * gimpcairo.h
- * Copyright (C) 2010 Michael Natterer <mitch gimp org>
+ * gimp-cairo.h
+ * Copyright (C) 2010-2012 Michael Natterer <mitch gimp org>
*
* Some code here is based on code from librsvg that was originally
* written by Raph Levien <raph artofcode com> for Gill.
@@ -39,10 +39,5 @@ void gimp_cairo_add_segments (cairo_t *cr,
GimpSegment *segs,
gint n_segs);
-void gimp_cairo_draw_toolbox_wilber (GtkWidget *widget,
- cairo_t *cr);
-void gimp_cairo_draw_drop_wilber (GtkWidget *widget,
- cairo_t *cr);
-
#endif /* __GIMP_CAIRO_H__ */
diff --git a/app/display/gimpcanvasarc.c b/app/display/gimpcanvasarc.c
index bdf4d80..5d76bc0 100644
--- a/app/display/gimpcanvasarc.c
+++ b/app/display/gimpcanvasarc.c
@@ -28,7 +28,7 @@
#include "display-types.h"
-#include "widgets/gimpcairo.h"
+#include "core/gimp-cairo.h"
#include "gimpcanvasarc.h"
#include "gimpdisplayshell.h"
diff --git a/app/display/gimpcanvasboundary.c b/app/display/gimpcanvasboundary.c
index e3aa9e9..3075003 100644
--- a/app/display/gimpcanvasboundary.c
+++ b/app/display/gimpcanvasboundary.c
@@ -28,11 +28,10 @@
#include "display-types.h"
+#include "core/gimp-cairo.h"
#include "core/gimpboundary.h"
#include "core/gimpparamspecs.h"
-#include "widgets/gimpcairo.h"
-
#include "gimpcanvasboundary.h"
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-transform.h"
diff --git a/app/display/gimpcanvascursor.c b/app/display/gimpcanvascursor.c
index 577f5c2..5e2c3e1 100644
--- a/app/display/gimpcanvascursor.c
+++ b/app/display/gimpcanvascursor.c
@@ -28,7 +28,7 @@
#include "display-types.h"
-#include "widgets/gimpcairo.h"
+#include "core/gimp-cairo.h"
#include "gimpcanvascursor.h"
#include "gimpdisplayshell.h"
diff --git a/app/display/gimpcanvashandle.c b/app/display/gimpcanvashandle.c
index 45ad673..2aca51b 100644
--- a/app/display/gimpcanvashandle.c
+++ b/app/display/gimpcanvashandle.c
@@ -28,7 +28,7 @@
#include "display-types.h"
-#include "widgets/gimpcairo.h"
+#include "core/gimp-cairo.h"
#include "gimpcanvashandle.h"
#include "gimpcanvasitem-utils.h"
diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c
index 1a2ea7e..e8cf44d 100644
--- a/app/display/gimpdisplayshell-callbacks.c
+++ b/app/display/gimpdisplayshell-callbacks.c
@@ -29,7 +29,7 @@
#include "core/gimpimage.h"
#include "core/gimpimage-quick-mask.h"
-#include "widgets/gimpcairo.h"
+#include "widgets/gimpcairo-wilber.h"
#include "widgets/gimpuimanager.h"
#include "gimpcanvasitem.h"
diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c
index 6e0e971..5466631 100644
--- a/app/display/gimpdisplayshell-draw.c
+++ b/app/display/gimpdisplayshell-draw.c
@@ -27,13 +27,12 @@
#include "display-types.h"
+#include "core/gimp-cairo.h"
#include "core/gimpdrawable.h"
#include "core/gimpimage.h"
#include "core/gimppickable.h"
#include "core/gimpprojection.h"
-#include "widgets/gimpcairo.h"
-
#include "gimpcanvas.h"
#include "gimpcanvaspath.h"
#include "gimpdisplay.h"
diff --git a/app/display/gimpdisplayshell-selection.c b/app/display/gimpdisplayshell-selection.c
index d66211d..b6e1885 100644
--- a/app/display/gimpdisplayshell-selection.c
+++ b/app/display/gimpdisplayshell-selection.c
@@ -25,12 +25,11 @@
#include "config/gimpdisplayconfig.h"
#include "core/gimp.h"
+#include "core/gimp-cairo.h"
#include "core/gimpboundary.h"
#include "core/gimpchannel.h"
#include "core/gimpimage.h"
-#include "widgets/gimpcairo.h"
-
#include "gimpdisplay.h"
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-appearance.h"
diff --git a/app/display/gimpdisplayshell-style.c b/app/display/gimpdisplayshell-style.c
index c17004c..91b87ce 100644
--- a/app/display/gimpdisplayshell-style.c
+++ b/app/display/gimpdisplayshell-style.c
@@ -28,11 +28,10 @@
#include "display-types.h"
+#include "core/gimp-cairo.h"
#include "core/gimpgrid.h"
#include "core/gimplayer.h"
-#include "widgets/gimpcairo.h"
-
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-style.h"
diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am
index 55dacc5..ee09090 100644
--- a/app/widgets/Makefile.am
+++ b/app/widgets/Makefile.am
@@ -39,8 +39,6 @@ libappwidgets_a_sources = \
gimpbrushselect.h \
gimpbufferview.c \
gimpbufferview.h \
- gimpcairo.c \
- gimpcairo.h \
gimpcairo-wilber.c \
gimpcairo-wilber.h \
gimpcellrendererdashes.c \
diff --git a/app/widgets/gimpcairo-wilber.c b/app/widgets/gimpcairo-wilber.c
index 62fe06f..883ccc6 100644
--- a/app/widgets/gimpcairo-wilber.c
+++ b/app/widgets/gimpcairo-wilber.c
@@ -29,7 +29,104 @@
#include "libgimpmath/gimpmath.h"
-#include <gimpcairo-wilber.h>
+#include "widgets-types.h"
+
+#include "gimpcairo-wilber.h"
+
+
+void
+gimp_cairo_draw_toolbox_wilber (GtkWidget *widget,
+ cairo_t *cr)
+{
+ GtkStyle *style;
+ GtkStateType state;
+ GtkAllocation allocation;
+ gdouble wilber_width;
+ gdouble wilber_height;
+ gdouble factor;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (cr != NULL);
+
+ style = gtk_widget_get_style (widget);
+ state = gtk_widget_get_state (widget);
+
+ gtk_widget_get_allocation (widget, &allocation);
+
+ gimp_cairo_wilber_get_size (cr, &wilber_width, &wilber_height);
+
+ factor = allocation.width / wilber_width * 0.9;
+
+ if (! gtk_widget_get_has_window (widget))
+ cairo_translate (cr, allocation.x, allocation.y);
+
+ cairo_scale (cr, factor, factor);
+
+ gimp_cairo_wilber (cr,
+ (allocation.width / factor - wilber_width) / 2.0,
+ (allocation.height / factor - wilber_height) / 2.0);
+
+ cairo_set_source_rgba (cr,
+ style->fg[state].red / 65535.0,
+ style->fg[state].green / 65535.0,
+ style->fg[state].blue / 65535.0,
+ 0.10);
+ cairo_fill (cr);
+}
+
+void
+gimp_cairo_draw_drop_wilber (GtkWidget *widget,
+ cairo_t *cr)
+{
+ GtkStyle *style;
+ GtkStateType state;
+ GtkAllocation allocation;
+ gdouble wilber_width;
+ gdouble wilber_height;
+ gdouble width;
+ gdouble height;
+ gdouble side;
+ gdouble factor;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (cr != NULL);
+
+ style = gtk_widget_get_style (widget);
+ state = gtk_widget_get_state (widget);
+
+ gtk_widget_get_allocation (widget, &allocation);
+
+ gimp_cairo_wilber_get_size (cr, &wilber_width, &wilber_height);
+
+ wilber_width /= 2;
+ wilber_height /= 2;
+
+ side = MIN (MIN (allocation.width, allocation.height),
+ MAX (allocation.width, allocation.height) / 2);
+
+ width = MAX (wilber_width, side);
+ height = MAX (wilber_height, side);
+
+ factor = MIN (width / wilber_width, height / wilber_height);
+
+ if (! gtk_widget_get_has_window (widget))
+ cairo_translate (cr, allocation.x, allocation.y);
+
+ cairo_scale (cr, factor, factor);
+
+ /* magic factors depend on the image used, everything else is generic
+ */
+ gimp_cairo_wilber (cr,
+ - wilber_width * 0.6,
+ allocation.height / factor - wilber_height * 1.1);
+
+ cairo_set_source_rgba (cr,
+ style->fg[state].red / 65535.0,
+ style->fg[state].green / 65535.0,
+ style->fg[state].blue / 65535.0,
+ 0.15);
+ cairo_fill (cr);
+}
/* This string is a path description as found in SVG files. You can
diff --git a/app/widgets/gimpcairo-wilber.h b/app/widgets/gimpcairo-wilber.h
index bc31992..44d3d24 100644
--- a/app/widgets/gimpcairo-wilber.h
+++ b/app/widgets/gimpcairo-wilber.h
@@ -25,12 +25,17 @@
#define __GIMP_CAIRO_WILBER_H__
-void gimp_cairo_wilber (cairo_t *cr,
- gdouble x,
- gdouble y);
-void gimp_cairo_wilber_get_size (cairo_t *cr,
- gdouble *width,
- gdouble *height);
+void gimp_cairo_draw_toolbox_wilber (GtkWidget *widget,
+ cairo_t *cr);
+void gimp_cairo_draw_drop_wilber (GtkWidget *widget,
+ cairo_t *cr);
+
+void gimp_cairo_wilber (cairo_t *cr,
+ gdouble x,
+ gdouble y);
+void gimp_cairo_wilber_get_size (cairo_t *cr,
+ gdouble *width,
+ gdouble *height);
#endif /* __GIMP_CAIRO_WILBER_H__ */
diff --git a/app/widgets/gimptoolbox.c b/app/widgets/gimptoolbox.c
index 00f4057..772ca3f 100644
--- a/app/widgets/gimptoolbox.c
+++ b/app/widgets/gimptoolbox.c
@@ -37,7 +37,7 @@
#include "file/file-open.h"
#include "file/file-utils.h"
-#include "gimpcairo.h"
+#include "gimpcairo-wilber.h"
#include "gimpdevices.h"
#include "gimpdialogfactory.h"
#include "gimpdockwindow.h"
diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h
index 0df8469..76719c4 100644
--- a/app/widgets/widgets-types.h
+++ b/app/widgets/widgets-types.h
@@ -281,17 +281,4 @@ typedef gboolean (* GimpPanedBoxDroppedFunc) (GtkWidget *source,
gpointer data);
-/* temp hack as replacement for GdkSegment */
-
-typedef struct _GimpSegment GimpSegment;
-
-struct _GimpSegment
-{
- gint x1;
- gint y1;
- gint x2;
- gint y2;
-};
-
-
#endif /* __WIDGETS_TYPES_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]