From 9142bb1805057384cafcfdedf3354bc6f2f12150 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Wed, 11 Jan 2017 00:21:43 +0100 Subject: [PATCH] app: move erase and anti-erase to layer-modes/ --- app/gegl/gimp-gegl-nodes.c | 4 +- app/operations/Makefile.am | 4 - app/operations/gimp-operations.c | 8 +- app/operations/gimplayermodefunctions.c | 8 +- app/operations/gimpoperationantierasemode.c | 131 ------------------ app/operations/gimpoperationantierasemode.h | 62 --------- app/operations/layer-modes/Makefile.am | 6 +- .../gimpoperationantierase.c} | 40 +++--- .../gimpoperationantierase.h} | 35 ++--- .../layer-modes/gimpoperationerase.c | 131 ++++++++++++++++++ .../layer-modes/gimpoperationerase.h | 62 +++++++++ 11 files changed, 246 insertions(+), 245 deletions(-) delete mode 100644 app/operations/gimpoperationantierasemode.c delete mode 100644 app/operations/gimpoperationantierasemode.h rename app/operations/{gimpoperationerasemode.c => layer-modes/gimpoperationantierase.c} (77%) rename app/operations/{gimpoperationerasemode.h => layer-modes/gimpoperationantierase.h} (53%) create mode 100644 app/operations/layer-modes/gimpoperationerase.c create mode 100644 app/operations/layer-modes/gimpoperationerase.h diff --git a/app/gegl/gimp-gegl-nodes.c b/app/gegl/gimp-gegl-nodes.c index 998b4cb39d..d16156d26a 100644 --- a/app/gegl/gimp-gegl-nodes.c +++ b/app/gegl/gimp-gegl-nodes.c @@ -312,7 +312,7 @@ gimp_gegl_mode_node_set_mode (GeglNode *node, break; case GIMP_LAYER_MODE_ERASE: - operation = "gimp:erase-mode"; + operation = "gimp:erase"; break; case GIMP_LAYER_MODE_REPLACE: @@ -320,7 +320,7 @@ gimp_gegl_mode_node_set_mode (GeglNode *node, break; case GIMP_LAYER_MODE_ANTI_ERASE: - operation = "gimp:anti-erase-mode"; + operation = "gimp:anti-erase"; break; default: diff --git a/app/operations/Makefile.am b/app/operations/Makefile.am index fe36a51407..919e4474c5 100644 --- a/app/operations/Makefile.am +++ b/app/operations/Makefile.am @@ -113,12 +113,8 @@ libappoperations_a_SOURCES = \ gimpoperationgrainmergemode.h \ gimpoperationcolorerasemode.c \ gimpoperationcolorerasemode.h \ - gimpoperationerasemode.c \ - gimpoperationerasemode.h \ gimpoperationreplacemode.c \ gimpoperationreplacemode.h \ - gimpoperationantierasemode.c \ - gimpoperationantierasemode.h \ \ gimplayermodefunctions.c \ gimplayermodefunctions.h diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c index be5207d6de..883e69f31a 100644 --- a/app/operations/gimp-operations.c +++ b/app/operations/gimp-operations.c @@ -105,9 +105,9 @@ #include "layer-modes/gimpoperationlchchroma.h" #include "layer-modes/gimpoperationlchcolor.h" #include "layer-modes/gimpoperationlchlightness.h" -#include "gimpoperationerasemode.h" +#include "layer-modes/gimpoperationerase.h" #include "gimpoperationreplacemode.h" -#include "gimpoperationantierasemode.h" +#include "layer-modes/gimpoperationantierase.h" void @@ -181,9 +181,9 @@ gimp_operations_init (void) g_type_class_ref (GIMP_TYPE_OPERATION_LCH_CHROMA); g_type_class_ref (GIMP_TYPE_OPERATION_LCH_COLOR); g_type_class_ref (GIMP_TYPE_OPERATION_LCH_LIGHTNESS); - g_type_class_ref (GIMP_TYPE_OPERATION_ERASE_MODE); + g_type_class_ref (GIMP_TYPE_OPERATION_ERASE); g_type_class_ref (GIMP_TYPE_OPERATION_REPLACE_MODE); - g_type_class_ref (GIMP_TYPE_OPERATION_ANTI_ERASE_MODE); + g_type_class_ref (GIMP_TYPE_OPERATION_ANTI_ERASE); gimp_gegl_config_register ("gimp:brightness-contrast", GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG); diff --git a/app/operations/gimplayermodefunctions.c b/app/operations/gimplayermodefunctions.c index 4a9f2a2bb2..fec77cc7fb 100644 --- a/app/operations/gimplayermodefunctions.c +++ b/app/operations/gimplayermodefunctions.c @@ -65,9 +65,9 @@ #include "layer-modes/gimpoperationlchchroma.h" #include "layer-modes/gimpoperationlchcolor.h" #include "layer-modes/gimpoperationlchlightness.h" -#include "gimpoperationerasemode.h" +#include "layer-modes/gimpoperationerase.h" #include "gimpoperationreplacemode.h" -#include "gimpoperationantierasemode.h" +#include "layer-modes/gimpoperationantierase.h" GimpLayerModeFunction @@ -247,7 +247,7 @@ get_layer_mode_function (GimpLayerMode paint_mode, break; case GIMP_LAYER_MODE_ERASE: - func = gimp_operation_erase_mode_process_pixels; + func = gimp_operation_erase_process_pixels; break; case GIMP_LAYER_MODE_REPLACE: @@ -255,7 +255,7 @@ get_layer_mode_function (GimpLayerMode paint_mode, break; case GIMP_LAYER_MODE_ANTI_ERASE: - func = gimp_operation_anti_erase_mode_process_pixels; + func = gimp_operation_anti_erase_process_pixels; break; default: diff --git a/app/operations/gimpoperationantierasemode.c b/app/operations/gimpoperationantierasemode.c deleted file mode 100644 index cd9e1a7b71..0000000000 --- a/app/operations/gimpoperationantierasemode.c +++ /dev/null @@ -1,131 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * gimpoperationantierasemode.c - * Copyright (C) 2008 Michael Natterer - * 2012 Ville Sokk - * - * 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 "operations-types.h" - -#include "gimpoperationantierasemode.h" - - -static void gimp_operation_anti_erase_mode_prepare (GeglOperation *operation); -static gboolean gimp_operation_anti_erase_mode_process (GeglOperation *operation, - void *in_buf, - void *aux_buf, - void *aux2_buf, - void *out_buf, - glong samples, - const GeglRectangle *roi, - gint level); - - -G_DEFINE_TYPE (GimpOperationAntiEraseMode, gimp_operation_anti_erase_mode, - GIMP_TYPE_OPERATION_POINT_LAYER_MODE) - - -static void -gimp_operation_anti_erase_mode_class_init (GimpOperationAntiEraseModeClass *klass) -{ - GeglOperationClass *operation_class; - GeglOperationPointComposer3Class *point_class; - - operation_class = GEGL_OPERATION_CLASS (klass); - point_class = GEGL_OPERATION_POINT_COMPOSER3_CLASS (klass); - - gegl_operation_class_set_keys (operation_class, - "name", "gimp:anti-erase-mode", - "description", "GIMP anti erase mode operation", - NULL); - - operation_class->prepare = gimp_operation_anti_erase_mode_prepare; - point_class->process = gimp_operation_anti_erase_mode_process; -} - -static void -gimp_operation_anti_erase_mode_init (GimpOperationAntiEraseMode *self) -{ -} - -static void -gimp_operation_anti_erase_mode_prepare (GeglOperation *operation) -{ - const Babl *format = babl_format ("RGBA float"); - - gegl_operation_set_format (operation, "input", format); - gegl_operation_set_format (operation, "aux", format); - gegl_operation_set_format (operation, "aux2", babl_format ("Y float")); - gegl_operation_set_format (operation, "output", format); -} - -static gboolean -gimp_operation_anti_erase_mode_process (GeglOperation *operation, - void *in_buf, - void *aux_buf, - void *aux2_buf, - void *out_buf, - glong samples, - const GeglRectangle *roi, - gint level) -{ - gfloat opacity = GIMP_OPERATION_POINT_LAYER_MODE (operation)->opacity; - - return gimp_operation_anti_erase_mode_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level); -} - -gboolean -gimp_operation_anti_erase_mode_process_pixels (gfloat *in, - gfloat *layer, - gfloat *mask, - gfloat *out, - gfloat opacity, - glong samples, - const GeglRectangle *roi, - gint level) -{ - const gboolean has_mask = mask != NULL; - - while (samples--) - { - gfloat value = opacity; - gint b; - - if (has_mask) - value *= *mask; - - out[ALPHA] = in[ALPHA] + (1.0 - in[ALPHA]) * layer[ALPHA] * value; - - for (b = RED; b < ALPHA; b++) - { - out[b] = in[b]; - } - - in += 4; - layer += 4; - out += 4; - - if (has_mask) - mask++; - } - - return TRUE; -} diff --git a/app/operations/gimpoperationantierasemode.h b/app/operations/gimpoperationantierasemode.h deleted file mode 100644 index b79cef19a1..0000000000 --- a/app/operations/gimpoperationantierasemode.h +++ /dev/null @@ -1,62 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * gimpoperationantierasemode.h - * Copyright (C) 2008 Michael Natterer - * - * 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_OPERATION_ANTI_ERASE_MODE_H__ -#define __GIMP_OPERATION_ANTI_ERASE_MODE_H__ - - -#include "gimpoperationpointlayermode.h" - - -#define GIMP_TYPE_OPERATION_ANTI_ERASE_MODE (gimp_operation_anti_erase_mode_get_type ()) -#define GIMP_OPERATION_ANTI_ERASE_MODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE, GimpOperationAntiEraseMode)) -#define GIMP_OPERATION_ANTI_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE, GimpOperationAntiEraseModeClass)) -#define GIMP_IS_OPERATION_ANTI_ERASE_MODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE)) -#define GIMP_IS_OPERATION_ANTI_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE)) -#define GIMP_OPERATION_ANTI_ERASE_MODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE, GimpOperationAntiEraseModeClass)) - - -typedef struct _GimpOperationAntiEraseMode GimpOperationAntiEraseMode; -typedef struct _GimpOperationAntiEraseModeClass GimpOperationAntiEraseModeClass; - -struct _GimpOperationAntiEraseMode -{ - GimpOperationPointLayerMode parent_instance; -}; - -struct _GimpOperationAntiEraseModeClass -{ - GimpOperationPointLayerModeClass parent_class; -}; - - -GType gimp_operation_anti_erase_mode_get_type (void) G_GNUC_CONST; - - -gboolean gimp_operation_anti_erase_mode_process_pixels (gfloat *in, - gfloat *layer, - gfloat *mask, - gfloat *out, - gfloat opacity, - glong samples, - const GeglRectangle *roi, - gint level); - -#endif /* __GIMP_OPERATION_ANTI_ERASE_MODE_H__ */ diff --git a/app/operations/layer-modes/Makefile.am b/app/operations/layer-modes/Makefile.am index 4acc7ee2bd..272d2e7567 100644 --- a/app/operations/layer-modes/Makefile.am +++ b/app/operations/layer-modes/Makefile.am @@ -55,7 +55,11 @@ libapplayermodes_generic_a_sources = \ gimpoperationhsvcolor.c \ gimpoperationhsvcolor.h \ gimpoperationhsvvalue.c \ - gimpoperationhsvvalue.h + gimpoperationhsvvalue.h \ + gimpoperationerase.c \ + gimpoperationerase.h \ + gimpoperationantierase.c \ + gimpoperationantierase.h libapplayermodes_sse2_a_sources = \ gimpoperationnormal-sse2.c diff --git a/app/operations/gimpoperationerasemode.c b/app/operations/layer-modes/gimpoperationantierase.c similarity index 77% rename from app/operations/gimpoperationerasemode.c rename to app/operations/layer-modes/gimpoperationantierase.c index 8452954461..fff71b172e 100644 --- a/app/operations/gimpoperationerasemode.c +++ b/app/operations/layer-modes/gimpoperationantierase.c @@ -1,7 +1,7 @@ /* GIMP - The GNU Image Manipulation Program * Copyright (C) 1995 Spencer Kimball and Peter Mattis * - * gimpoperationerasemode.c + * gimpoperationantierase.c * Copyright (C) 2008 Michael Natterer * 2012 Ville Sokk * @@ -23,13 +23,13 @@ #include -#include "operations-types.h" +#include "../operations-types.h" -#include "gimpoperationerasemode.h" +#include "gimpoperationantierase.h" -static void prepare (GeglOperation *operation); -static gboolean gimp_operation_erase_mode_process (GeglOperation *operation, +static void gimp_operation_anti_erase_prepare (GeglOperation *operation); +static gboolean gimp_operation_anti_erase_process (GeglOperation *operation, void *in_buf, void *aux_buf, void *aux2_buf, @@ -39,12 +39,12 @@ static gboolean gimp_operation_erase_mode_process (GeglOperation *operatio gint level); -G_DEFINE_TYPE (GimpOperationEraseMode, gimp_operation_erase_mode, +G_DEFINE_TYPE (GimpOperationAntiErase, gimp_operation_anti_erase, GIMP_TYPE_OPERATION_POINT_LAYER_MODE) static void -gimp_operation_erase_mode_class_init (GimpOperationEraseModeClass *klass) +gimp_operation_anti_erase_class_init (GimpOperationAntiEraseClass *klass) { GeglOperationClass *operation_class; GeglOperationPointComposer3Class *point_class; @@ -53,21 +53,21 @@ gimp_operation_erase_mode_class_init (GimpOperationEraseModeClass *klass) point_class = GEGL_OPERATION_POINT_COMPOSER3_CLASS (klass); gegl_operation_class_set_keys (operation_class, - "name", "gimp:erase-mode", - "description", "GIMP erase mode operation", + "name", "gimp:anti-erase", + "description", "GIMP anti erase mode operation", NULL); - operation_class->prepare = prepare; - point_class->process = gimp_operation_erase_mode_process; + operation_class->prepare = gimp_operation_anti_erase_prepare; + point_class->process = gimp_operation_anti_erase_process; } static void -gimp_operation_erase_mode_init (GimpOperationEraseMode *self) +gimp_operation_anti_erase_init (GimpOperationAntiErase *self) { } static void -prepare (GeglOperation *operation) +gimp_operation_anti_erase_prepare (GeglOperation *operation) { const Babl *format = babl_format ("RGBA float"); @@ -78,7 +78,7 @@ prepare (GeglOperation *operation) } static gboolean -gimp_operation_erase_mode_process (GeglOperation *operation, +gimp_operation_anti_erase_process (GeglOperation *operation, void *in_buf, void *aux_buf, void *aux2_buf, @@ -89,11 +89,11 @@ gimp_operation_erase_mode_process (GeglOperation *operation, { gfloat opacity = GIMP_OPERATION_POINT_LAYER_MODE (operation)->opacity; - return gimp_operation_erase_mode_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level); + return gimp_operation_anti_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level); } gboolean -gimp_operation_erase_mode_process_pixels (gfloat *in, +gimp_operation_anti_erase_process_pixels (gfloat *in, gfloat *layer, gfloat *mask, gfloat *out, @@ -110,21 +110,21 @@ gimp_operation_erase_mode_process_pixels (gfloat *in, gint b; if (has_mask) - value *= (*mask); + value *= *mask; + + out[ALPHA] = in[ALPHA] + (1.0 - in[ALPHA]) * layer[ALPHA] * value; for (b = RED; b < ALPHA; b++) { out[b] = in[b]; } - out[ALPHA] = in[ALPHA] - in[ALPHA] * layer[ALPHA] * value; - in += 4; layer += 4; out += 4; if (has_mask) - mask ++; + mask++; } return TRUE; diff --git a/app/operations/gimpoperationerasemode.h b/app/operations/layer-modes/gimpoperationantierase.h similarity index 53% rename from app/operations/gimpoperationerasemode.h rename to app/operations/layer-modes/gimpoperationantierase.h index de9470393b..0b4d3ba064 100644 --- a/app/operations/gimpoperationerasemode.h +++ b/app/operations/layer-modes/gimpoperationantierase.h @@ -1,7 +1,7 @@ /* GIMP - The GNU Image Manipulation Program * Copyright (C) 1995 Spencer Kimball and Peter Mattis * - * gimpoperationerasemode.h + * gimpoperationantierase.h * Copyright (C) 2008 Michael Natterer * * This program is free software: you can redistribute it and/or modify @@ -18,38 +18,38 @@ * along with this program. If not, see . */ -#ifndef __GIMP_OPERATION_ERASE_MODE_H__ -#define __GIMP_OPERATION_ERASE_MODE_H__ +#ifndef __GIMP_OPERATION_ANTI_ERASE_H__ +#define __GIMP_OPERATION_ANTI_ERASE_H__ -#include "gimpoperationpointlayermode.h" +#include "../gimpoperationpointlayermode.h" -#define GIMP_TYPE_OPERATION_ERASE_MODE (gimp_operation_erase_mode_get_type ()) -#define GIMP_OPERATION_ERASE_MODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ERASE_MODE, GimpOperationEraseMode)) -#define GIMP_OPERATION_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_ERASE_MODE, GimpOperationEraseModeClass)) -#define GIMP_IS_OPERATION_ERASE_MODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ERASE_MODE)) -#define GIMP_IS_OPERATION_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_ERASE_MODE)) -#define GIMP_OPERATION_ERASE_MODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_ERASE_MODE, GimpOperationEraseModeClass)) +#define GIMP_TYPE_OPERATION_ANTI_ERASE (gimp_operation_anti_erase_get_type ()) +#define GIMP_OPERATION_ANTI_ERASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE, GimpOperationAntiErase)) +#define GIMP_OPERATION_ANTI_ERASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_ANTI_ERASE, GimpOperationAntiEraseClass)) +#define GIMP_IS_OPERATION_ANTI_ERASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE)) +#define GIMP_IS_OPERATION_ANTI_ERASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_ANTI_ERASE)) +#define GIMP_OPERATION_ANTI_ERASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE, GimpOperationAntiEraseClass)) -typedef struct _GimpOperationEraseMode GimpOperationEraseMode; -typedef struct _GimpOperationEraseModeClass GimpOperationEraseModeClass; +typedef struct _GimpOperationAntiErase GimpOperationAntiErase; +typedef struct _GimpOperationAntiEraseClass GimpOperationAntiEraseClass; -struct _GimpOperationEraseMode +struct _GimpOperationAntiErase { GimpOperationPointLayerMode parent_instance; }; -struct _GimpOperationEraseModeClass +struct _GimpOperationAntiEraseClass { GimpOperationPointLayerModeClass parent_class; }; -GType gimp_operation_erase_mode_get_type (void) G_GNUC_CONST; +GType gimp_operation_anti_erase_get_type (void) G_GNUC_CONST; -gboolean gimp_operation_erase_mode_process_pixels (gfloat *in, +gboolean gimp_operation_anti_erase_process_pixels (gfloat *in, gfloat *layer, gfloat *mask, gfloat *out, @@ -58,4 +58,5 @@ gboolean gimp_operation_erase_mode_process_pixels (gfloat *in, const GeglRectangle *roi, gint level); -#endif /* __GIMP_OPERATION_ERASE_MODE_H__ */ + +#endif /* __GIMP_OPERATION_ANTI_ERASE_H__ */ diff --git a/app/operations/layer-modes/gimpoperationerase.c b/app/operations/layer-modes/gimpoperationerase.c new file mode 100644 index 0000000000..138c2dfb5d --- /dev/null +++ b/app/operations/layer-modes/gimpoperationerase.c @@ -0,0 +1,131 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpoperationerase.c + * Copyright (C) 2008 Michael Natterer + * 2012 Ville Sokk + * + * 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 "../operations-types.h" + +#include "gimpoperationerase.h" + + +static void gimp_operation_erase_prepare (GeglOperation *operation); +static gboolean gimp_operation_erase_process (GeglOperation *operation, + void *in_buf, + void *aux_buf, + void *aux2_buf, + void *out_buf, + glong samples, + const GeglRectangle *roi, + gint level); + + +G_DEFINE_TYPE (GimpOperationErase, gimp_operation_erase, + GIMP_TYPE_OPERATION_POINT_LAYER_MODE) + + +static void +gimp_operation_erase_class_init (GimpOperationEraseClass *klass) +{ + GeglOperationClass *operation_class; + GeglOperationPointComposer3Class *point_class; + + operation_class = GEGL_OPERATION_CLASS (klass); + point_class = GEGL_OPERATION_POINT_COMPOSER3_CLASS (klass); + + gegl_operation_class_set_keys (operation_class, + "name", "gimp:erase", + "description", "GIMP erase mode operation", + NULL); + + operation_class->prepare = gimp_operation_erase_prepare; + point_class->process = gimp_operation_erase_process; +} + +static void +gimp_operation_erase_init (GimpOperationErase *self) +{ +} + +static void +gimp_operation_erase_prepare (GeglOperation *operation) +{ + const Babl *format = babl_format ("RGBA float"); + + gegl_operation_set_format (operation, "input", format); + gegl_operation_set_format (operation, "aux", format); + gegl_operation_set_format (operation, "aux2", babl_format ("Y float")); + gegl_operation_set_format (operation, "output", format); +} + +static gboolean +gimp_operation_erase_process (GeglOperation *operation, + void *in_buf, + void *aux_buf, + void *aux2_buf, + void *out_buf, + glong samples, + const GeglRectangle *roi, + gint level) +{ + gfloat opacity = GIMP_OPERATION_POINT_LAYER_MODE (operation)->opacity; + + return gimp_operation_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level); +} + +gboolean +gimp_operation_erase_process_pixels (gfloat *in, + gfloat *layer, + gfloat *mask, + gfloat *out, + gfloat opacity, + glong samples, + const GeglRectangle *roi, + gint level) +{ + const gboolean has_mask = mask != NULL; + + while (samples--) + { + gfloat value = opacity; + gint b; + + if (has_mask) + value *= (*mask); + + for (b = RED; b < ALPHA; b++) + { + out[b] = in[b]; + } + + out[ALPHA] = in[ALPHA] - in[ALPHA] * layer[ALPHA] * value; + + in += 4; + layer += 4; + out += 4; + + if (has_mask) + mask ++; + } + + return TRUE; +} diff --git a/app/operations/layer-modes/gimpoperationerase.h b/app/operations/layer-modes/gimpoperationerase.h new file mode 100644 index 0000000000..19ac0ac767 --- /dev/null +++ b/app/operations/layer-modes/gimpoperationerase.h @@ -0,0 +1,62 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpoperationerase.h + * Copyright (C) 2008 Michael Natterer + * + * 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_OPERATION_ERASE_H__ +#define __GIMP_OPERATION_ERASE_H__ + + +#include "../gimpoperationpointlayermode.h" + + +#define GIMP_TYPE_OPERATION_ERASE (gimp_operation_erase_get_type ()) +#define GIMP_OPERATION_ERASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ERASE, GimpOperationErase)) +#define GIMP_OPERATION_ERASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_ERASE, GimpOperationEraseClass)) +#define GIMP_IS_OPERATION_ERASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ERASE)) +#define GIMP_IS_OPERATION_ERASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_ERASE)) +#define GIMP_OPERATION_ERASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_ERASE, GimpOperationEraseClass)) + + +typedef struct _GimpOperationErase GimpOperationErase; +typedef struct _GimpOperationEraseClass GimpOperationEraseClass; + +struct _GimpOperationErase +{ + GimpOperationPointLayerMode parent_instance; +}; + +struct _GimpOperationEraseClass +{ + GimpOperationPointLayerModeClass parent_class; +}; + + +GType gimp_operation_erase_get_type (void) G_GNUC_CONST; + +gboolean gimp_operation_erase_process_pixels (gfloat *in, + gfloat *layer, + gfloat *mask, + gfloat *out, + gfloat opacity, + glong samples, + const GeglRectangle *roi, + gint level); + + +#endif /* __GIMP_OPERATION_ERASE_MODE_H__ */