From a798c9456c300be0004bcf0939f05cb14da5bf66 Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Mon, 18 Oct 2010 22:15:34 +0200 Subject: [PATCH] app/display: add new canvas item GimpCanvasPassePartout This is supposed to replace the GimpDisplayShell highlight API, but it is not yet used. --- app/display/Makefile.am | 2 + app/display/gimpcanvaspassepartout.c | 140 +++++++++++++++++++++++++++ app/display/gimpcanvaspassepartout.h | 59 +++++++++++ app/display/gimpdisplayshell-draw.c | 2 +- app/display/gimpdisplayshell-style.c | 8 +- app/display/gimpdisplayshell-style.h | 2 +- 6 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 app/display/gimpcanvaspassepartout.c create mode 100644 app/display/gimpcanvaspassepartout.h diff --git a/app/display/Makefile.am b/app/display/Makefile.am index a1293c3433..00a3064502 100644 --- a/app/display/Makefile.am +++ b/app/display/Makefile.am @@ -41,6 +41,8 @@ libappdisplay_a_sources = \ gimpcanvaslayerboundary.h \ gimpcanvasline.c \ gimpcanvasline.h \ + gimpcanvaspassepartout.c \ + gimpcanvaspassepartout.h \ gimpcanvaspath.c \ gimpcanvaspath.h \ gimpcanvaspen.c \ diff --git a/app/display/gimpcanvaspassepartout.c b/app/display/gimpcanvaspassepartout.c new file mode 100644 index 0000000000..a02204578a --- /dev/null +++ b/app/display/gimpcanvaspassepartout.c @@ -0,0 +1,140 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpcanvaspassepartout.c + * Copyright (C) 2010 Sven Neumann + * + * 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 . + */ + +#include "config.h" + +#include +#include + +#include "display-types.h" + +#include "gimpcanvas.h" +#include "gimpcanvaspassepartout.h" +#include "gimpdisplayshell.h" +#include "gimpdisplayshell-draw.h" +#include "gimpdisplayshell-style.h" + + +/* local function prototypes */ + +static void gimp_canvas_passe_partout_draw (GimpCanvasItem *item, + GimpDisplayShell *shell, + cairo_t *cr); +static cairo_region_t * gimp_canvas_passe_partout_get_extents (GimpCanvasItem *item, + GimpDisplayShell *shell); +static void gimp_canvas_passe_partout_fill (GimpCanvasItem *item, + GimpDisplayShell *shell, + cairo_t *cr); + + +G_DEFINE_TYPE (GimpCanvasPassePartout, gimp_canvas_passe_partout, + GIMP_TYPE_CANVAS_RECTANGLE) + +#define parent_class gimp_canvas_passe_partout_parent_class + + +static void +gimp_canvas_passe_partout_class_init (GimpCanvasPassePartoutClass *klass) +{ + GimpCanvasItemClass *item_class = GIMP_CANVAS_ITEM_CLASS (klass); + + item_class->draw = gimp_canvas_passe_partout_draw; + item_class->get_extents = gimp_canvas_passe_partout_get_extents; + item_class->fill = gimp_canvas_passe_partout_fill; +} + +static void +gimp_canvas_passe_partout_init (GimpCanvasPassePartout *passe_partout) +{ +} + +static void +gimp_canvas_passe_partout_draw (GimpCanvasItem *item, + GimpDisplayShell *shell, + cairo_t *cr) +{ + gint w, h; + + gimp_display_shell_draw_get_scaled_image_size (shell, &w, &h); + + cairo_rectangle (cr, - shell->offset_x, - shell->offset_y, w, h); + + GIMP_CANVAS_ITEM_CLASS (parent_class)->draw (item, shell, cr); +} + +static cairo_region_t * +gimp_canvas_passe_partout_get_extents (GimpCanvasItem *item, + GimpDisplayShell *shell) +{ + cairo_region_t *inner; + cairo_region_t *outer; + GdkRectangle rect = { 0, 0, 0, 0 }; + + gimp_display_shell_draw_get_scaled_image_size (shell, + &rect.width, &rect.height); +#ifdef USE_CAIRO_REGION + outer = cairo_region_create_rectangle ((cairo_rectangle_int_t *) &rect); +#else + outer = gdk_region_rectangle (&rect); +#endif + + inner = GIMP_CANVAS_ITEM_CLASS (parent_class)->get_extents (item, shell); + +#ifdef USE_CAIRO_REGION + cairo_region_subtract (outer, inner); +#else + gdk_region_subtract (outer, inner); +#endif + + return outer; +} + +static void +gimp_canvas_passe_partout_fill (GimpCanvasItem *item, + GimpDisplayShell *shell, + cairo_t *cr) +{ + cairo_translate (cr, -shell->offset_x, -shell->offset_y); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_clip (cr); + + gimp_display_shell_set_passe_partout_style (shell, cr); + cairo_paint (cr); +} + +GimpCanvasItem * +gimp_canvas_passe_partout_new (GimpDisplayShell *shell, + gdouble x, + gdouble y, + gdouble width, + gdouble height) +{ + g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), NULL); + + return g_object_new (GIMP_TYPE_CANVAS_PASSE_PARTOUT, + "shell", shell, + "x", x, + "y", y, + "width", width, + "height", height, + "filled", TRUE, + NULL); +} diff --git a/app/display/gimpcanvaspassepartout.h b/app/display/gimpcanvaspassepartout.h new file mode 100644 index 0000000000..7a1dce3a0d --- /dev/null +++ b/app/display/gimpcanvaspassepartout.h @@ -0,0 +1,59 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpcanvaspassepartout.h + * Copyright (C) 2010 Sven Neumann + * + * 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 . + */ + +#ifndef __GIMP_CANVAS_PASSE_PARTOUT_H__ +#define __GIMP_CANVAS_PASSE_PARTOUT_H__ + + +#include "gimpcanvasrectangle.h" + + +#define GIMP_TYPE_CANVAS_PASSE_PARTOUT (gimp_canvas_passe_partout_get_type ()) +#define GIMP_CANVAS_PASSE_PARTOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CANVAS_PASSE_PARTOUT, GimpCanvasPassePartout)) +#define GIMP_CANVAS_PASSE_PARTOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CANVAS_PASSE_PARTOUT, GimpCanvasPassePartoutClass)) +#define GIMP_IS_CANVAS_PASSE_PARTOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CANVAS_PASSE_PARTOUT)) +#define GIMP_IS_CANVAS_PASSE_PARTOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CANVAS_PASSE_PARTOUT)) +#define GIMP_CANVAS_PASSE_PARTOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CANVAS_PASSE_PARTOUT, GimpCanvasPassePartoutClass)) + + +typedef struct _GimpCanvasPassePartout GimpCanvasPassePartout; +typedef struct _GimpCanvasPassePartoutClass GimpCanvasPassePartoutClass; + +struct _GimpCanvasPassePartout +{ + GimpCanvasRectangle parent_instance; +}; + +struct _GimpCanvasPassePartoutClass +{ + GimpCanvasRectangleClass parent_class; +}; + + +GType gimp_canvas_passe_partout_get_type (void) G_GNUC_CONST; + +GimpCanvasItem * gimp_canvas_passe_partout_new (GimpDisplayShell *shell, + gdouble x, + gdouble y, + gdouble width, + gdouble height); + + +#endif /* __GIMP_CANVAS_PASSE_PARTOUT_H__ */ diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c index 26444f3161..b570c482c2 100644 --- a/app/display/gimpdisplayshell-draw.c +++ b/app/display/gimpdisplayshell-draw.c @@ -258,6 +258,6 @@ gimp_display_shell_draw_highlight (GimpDisplayShell *shell, cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); cairo_clip (cr); - gimp_display_shell_set_dim_style (shell, cr); + gimp_display_shell_set_passe_partout_style (shell, cr); cairo_paint (cr); } diff --git a/app/display/gimpdisplayshell-style.c b/app/display/gimpdisplayshell-style.c index 71502f25f6..1cad1d23c9 100644 --- a/app/display/gimpdisplayshell-style.c +++ b/app/display/gimpdisplayshell-style.c @@ -67,7 +67,7 @@ static const GimpRGB vectors_normal_fg = { 0.0, 0.0, 1.0, 0.8 }; static const GimpRGB vectors_active_bg = { 1.0, 1.0, 1.0, 0.6 }; static const GimpRGB vectors_active_fg = { 1.0, 0.0, 0.0, 0.8 }; -static const GimpRGB dim = { 0.0, 0.0, 0.0, 0.5 }; +static const GimpRGB passe_partout = { 0.0, 0.0, 0.0, 0.5 }; static const GimpRGB tool_bg = { 0.0, 0.0, 0.0, 0.4 }; static const GimpRGB tool_fg = { 1.0, 1.0, 1.0, 0.8 }; @@ -298,13 +298,13 @@ gimp_display_shell_set_vectors_fg_style (GimpDisplayShell *shell, } void -gimp_display_shell_set_dim_style (GimpDisplayShell *shell, - cairo_t *cr) +gimp_display_shell_set_passe_partout_style (GimpDisplayShell *shell, + cairo_t *cr) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); g_return_if_fail (cr != NULL); - gimp_cairo_set_source_rgba (cr, &dim); + gimp_cairo_set_source_rgba (cr, &passe_partout); } void diff --git a/app/display/gimpdisplayshell-style.h b/app/display/gimpdisplayshell-style.h index e87affb09d..89a276218c 100644 --- a/app/display/gimpdisplayshell-style.h +++ b/app/display/gimpdisplayshell-style.h @@ -50,7 +50,7 @@ void gimp_display_shell_set_vectors_fg_style (GimpDisplayShell *shell, cairo_t *cr, gboolean active); -void gimp_display_shell_set_dim_style (GimpDisplayShell *shell, +void gimp_display_shell_set_passe_partout_style (GimpDisplayShell *shell, cairo_t *cr); void gimp_display_shell_set_tool_bg_style (GimpDisplayShell *shell,