From 3a50cdcd4f172d621fd15b948a14a30d61953d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Mon, 9 Jan 2017 23:19:29 +0100 Subject: [PATCH] app: split screen op in legacy and new --- app/core/core-enums.c | 4 +- app/core/core-enums.h | 3 +- app/gegl/gimp-gegl-nodes.c | 7 +- app/operations/Makefile.am | 2 - app/operations/gimp-operations.c | 3 +- app/operations/gimplayermodefunctions.c | 9 +- app/operations/gimpoperationscreenmode.c | 137 ------------------ app/operations/gimpoperationscreenmode.h | 62 -------- app/operations/layer-modes-legacy/Makefile.am | 4 +- app/operations/layer-modes/Makefile.am | 4 +- app/widgets/gimpwidgets-constructors.c | 3 +- libgimp/gimpenums.h | 3 +- tools/pdbgen/enums.pl | 5 +- 13 files changed, 33 insertions(+), 213 deletions(-) delete mode 100644 app/operations/gimpoperationscreenmode.c delete mode 100644 app/operations/gimpoperationscreenmode.h diff --git a/app/core/core-enums.c b/app/core/core-enums.c index 646c29f8ce..d7d03cd468 100644 --- a/app/core/core-enums.c +++ b/app/core/core-enums.c @@ -321,6 +321,7 @@ gimp_layer_mode_get_type (void) { GIMP_LAYER_MODE_MULTIPLY, "GIMP_LAYER_MODE_MULTIPLY", "multiply" }, { GIMP_LAYER_MODE_MULTIPLY_LINEAR, "GIMP_LAYER_MODE_MULTIPLY_LINEAR", "multiply-linear" }, { GIMP_LAYER_MODE_DODGE, "GIMP_LAYER_MODE_DODGE", "dodge" }, + { GIMP_LAYER_MODE_SCREEN, "GIMP_LAYER_MODE_SCREEN", "screen" }, { GIMP_LAYER_MODE_ERASE, "GIMP_LAYER_MODE_ERASE", "erase" }, { GIMP_LAYER_MODE_REPLACE, "GIMP_LAYER_MODE_REPLACE", "replace" }, { GIMP_LAYER_MODE_ANTI_ERASE, "GIMP_LAYER_MODE_ANTI_ERASE", "anti-erase" }, @@ -333,7 +334,7 @@ gimp_layer_mode_get_type (void) { GIMP_LAYER_MODE_DISSOLVE, NC_("layer-mode", "Dissolve"), NULL }, { GIMP_LAYER_MODE_BEHIND, NC_("layer-mode", "Behind"), NULL }, { GIMP_LAYER_MODE_MULTIPLY_LEGACY, NC_("layer-mode", "Multiply (legacy)"), NULL }, - { GIMP_LAYER_MODE_SCREEN_LEGACY, NC_("layer-mode", "Screen"), NULL }, + { GIMP_LAYER_MODE_SCREEN_LEGACY, NC_("layer-mode", "Screen (legacy)"), NULL }, { GIMP_LAYER_MODE_OVERLAY_LEGACY, NC_("layer-mode", "Old broken Overlay"), NULL }, { GIMP_LAYER_MODE_DIFFERENCE_LEGACY, NC_("layer-mode", "Difference"), NULL }, { GIMP_LAYER_MODE_ADDITION_LEGACY, NC_("layer-mode", "Addition"), NULL }, @@ -361,6 +362,7 @@ gimp_layer_mode_get_type (void) { GIMP_LAYER_MODE_MULTIPLY, NC_("layer-mode", "Multiply"), NULL }, { GIMP_LAYER_MODE_MULTIPLY_LINEAR, NC_("layer-mode", "Multiply (linear)"), NULL }, { GIMP_LAYER_MODE_DODGE, NC_("layer-mode", "Dodge"), NULL }, + { GIMP_LAYER_MODE_SCREEN, NC_("layer-mode", "Screen"), NULL }, { GIMP_LAYER_MODE_ERASE, NC_("layer-mode", "Erase"), NULL }, { GIMP_LAYER_MODE_REPLACE, NC_("layer-mode", "Replace"), NULL }, { GIMP_LAYER_MODE_ANTI_ERASE, NC_("layer-mode", "Anti erase"), NULL }, diff --git a/app/core/core-enums.h b/app/core/core-enums.h index d49e50d5cd..7df91fab0e 100644 --- a/app/core/core-enums.h +++ b/app/core/core-enums.h @@ -158,7 +158,7 @@ typedef enum GIMP_LAYER_MODE_DISSOLVE, /*< desc="Dissolve" >*/ GIMP_LAYER_MODE_BEHIND, /*< desc="Behind" >*/ GIMP_LAYER_MODE_MULTIPLY_LEGACY, /*< desc="Multiply (legacy)" >*/ - GIMP_LAYER_MODE_SCREEN_LEGACY, /*< desc="Screen" >*/ + GIMP_LAYER_MODE_SCREEN_LEGACY, /*< desc="Screen (legacyy)" >*/ GIMP_LAYER_MODE_OVERLAY_LEGACY, /*< desc="Old broken Overlay" >*/ GIMP_LAYER_MODE_DIFFERENCE_LEGACY, /*< desc="Difference" >*/ GIMP_LAYER_MODE_ADDITION_LEGACY, /*< desc="Addition" >*/ @@ -186,6 +186,7 @@ typedef enum GIMP_LAYER_MODE_MULTIPLY, /*< desc="Multiply" >*/ GIMP_LAYER_MODE_MULTIPLY_LINEAR, /*< desc="Multiply (linear)" >*/ GIMP_LAYER_MODE_DODGE, /*< desc="Dodge" >*/ + GIMP_LAYER_MODE_SCREEN, /*< desc="Screen" >*/ /* internal modes, not available to the PDB */ GIMP_LAYER_MODE_ERASE = 1000, /*< pdb-skip, desc="Erase" >*/ diff --git a/app/gegl/gimp-gegl-nodes.c b/app/gegl/gimp-gegl-nodes.c index 5388346fae..10adca8b6e 100644 --- a/app/gegl/gimp-gegl-nodes.c +++ b/app/gegl/gimp-gegl-nodes.c @@ -171,8 +171,12 @@ gimp_gegl_mode_node_set_mode (GeglNode *node, operation = "gimp:multiply"; break; + case GIMP_LAYER_MODE_SCREEN: + operation = "gimp:screen"; + break; + case GIMP_LAYER_MODE_SCREEN_LEGACY: - operation = "gimp:screen-mode"; + operation = "gimp:screen-legacy"; break; case GIMP_LAYER_MODE_OVERLAY_LEGACY: @@ -310,6 +314,7 @@ gimp_gegl_mode_node_set_mode (GeglNode *node, case GIMP_LAYER_MODE_BEHIND: case GIMP_LAYER_MODE_MULTIPLY: case GIMP_LAYER_MODE_MULTIPLY_LEGACY: + case GIMP_LAYER_MODE_SCREEN: case GIMP_LAYER_MODE_SCREEN_LEGACY: case GIMP_LAYER_MODE_ADDITION_LEGACY: case GIMP_LAYER_MODE_SUBTRACT_LEGACY: diff --git a/app/operations/Makefile.am b/app/operations/Makefile.am index 27878dfb2f..9a39e8fe65 100644 --- a/app/operations/Makefile.am +++ b/app/operations/Makefile.am @@ -101,8 +101,6 @@ libappoperations_a_SOURCES = \ gimpoperationdissolvemode.h \ gimpoperationbehindmode.c \ gimpoperationbehindmode.h \ - gimpoperationscreenmode.c \ - gimpoperationscreenmode.h \ gimpoperationoverlaymode.c \ gimpoperationoverlaymode.h \ gimpoperationdifferencemode.c \ diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c index abbf7e1207..37f6c0c685 100644 --- a/app/operations/gimp-operations.c +++ b/app/operations/gimp-operations.c @@ -71,7 +71,8 @@ #include "gimpoperationbehindmode.h" #include "layer-modes/gimpoperationmultiply.h" #include "layer-modes-legacy/gimpoperationmultiplylegacy.h" -#include "gimpoperationscreenmode.h" +#include "layer-modes/gimpoperationscreen.h" +#include "layer-modes-legacy/gimpoperationscreenlegacy.h" #include "gimpoperationoverlaymode.h" #include "gimpoperationdifferencemode.h" #include "gimpoperationadditionmode.h" diff --git a/app/operations/gimplayermodefunctions.c b/app/operations/gimplayermodefunctions.c index 186cd9a0a7..545c86b04a 100644 --- a/app/operations/gimplayermodefunctions.c +++ b/app/operations/gimplayermodefunctions.c @@ -31,7 +31,8 @@ #include "gimpoperationbehindmode.h" #include "layer-modes/gimpoperationmultiply.h" #include "layer-modes-legacy/gimpoperationmultiplylegacy.h" -#include "gimpoperationscreenmode.h" +#include "layer-modes/gimpoperationscreen.h" +#include "layer-modes-legacy/gimpoperationscreenlegacy.h" #include "gimpoperationoverlaymode.h" #include "gimpoperationdifferencemode.h" #include "gimpoperationadditionmode.h" @@ -89,7 +90,11 @@ get_layer_mode_function (GimpLayerMode paint_mode, break; case GIMP_LAYER_MODE_SCREEN_LEGACY: - func = gimp_operation_screen_mode_process_pixels; + func = gimp_operation_screen_legacy_process_pixels; + break; + + case GIMP_LAYER_MODE_SCREEN: + func = gimp_operation_screen_process_pixels; break; case GIMP_LAYER_MODE_OVERLAY_LEGACY: diff --git a/app/operations/gimpoperationscreenmode.c b/app/operations/gimpoperationscreenmode.c deleted file mode 100644 index 0cce0f0e61..0000000000 --- a/app/operations/gimpoperationscreenmode.c +++ /dev/null @@ -1,137 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * gimpoperationscreenmode.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 "gimpoperationscreenmode.h" - - -static gboolean gimp_operation_screen_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 (GimpOperationScreenMode, gimp_operation_screen_mode, - GIMP_TYPE_OPERATION_POINT_LAYER_MODE) - - -static void -gimp_operation_screen_mode_class_init (GimpOperationScreenModeClass *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:screen-mode", - "description", "GIMP screen mode operation", - NULL); - - point_class->process = gimp_operation_screen_mode_process; -} - -static void -gimp_operation_screen_mode_init (GimpOperationScreenMode *self) -{ -} - -static gboolean -gimp_operation_screen_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_screen_mode_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level); -} - -gboolean -gimp_operation_screen_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 comp_alpha, new_alpha; - - comp_alpha = MIN (in[ALPHA], layer[ALPHA]) * opacity; - if (has_mask) - comp_alpha *= *mask; - - new_alpha = in[ALPHA] + (1.0 - in[ALPHA]) * comp_alpha; - - if (comp_alpha && new_alpha) - { - gfloat ratio = comp_alpha / new_alpha; - gint b; - - for (b = RED; b < ALPHA; b++) - { - gfloat comp = 1.0 - (1.0 - in[b]) * (1.0 - layer[b]); - - out[b] = comp * ratio + in[b] * (1.0 - ratio); - } - } - else - { - gint b; - - for (b = RED; b < ALPHA; b++) - { - out[b] = in[b]; - } - } - - out[ALPHA] = in[ALPHA]; - - in += 4; - layer += 4; - out += 4; - - if (has_mask) - mask++; - } - - return TRUE; -} diff --git a/app/operations/gimpoperationscreenmode.h b/app/operations/gimpoperationscreenmode.h deleted file mode 100644 index f279d52f07..0000000000 --- a/app/operations/gimpoperationscreenmode.h +++ /dev/null @@ -1,62 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * gimpoperationscreenmode.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_SCREEN_MODE_H__ -#define __GIMP_OPERATION_SCREEN_MODE_H__ - - -#include "gimpoperationpointlayermode.h" - - -#define GIMP_TYPE_OPERATION_SCREEN_MODE (gimp_operation_screen_mode_get_type ()) -#define GIMP_OPERATION_SCREEN_MODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_SCREEN_MODE, GimpOperationScreenMode)) -#define GIMP_OPERATION_SCREEN_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_SCREEN_MODE, GimpOperationScreenModeClass)) -#define GIMP_IS_OPERATION_SCREEN_MODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_SCREEN_MODE)) -#define GIMP_IS_OPERATION_SCREEN_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_SCREEN_MODE)) -#define GIMP_OPERATION_SCREEN_MODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_SCREEN_MODE, GimpOperationScreenModeClass)) - - -typedef struct _GimpOperationScreenMode GimpOperationScreenMode; -typedef struct _GimpOperationScreenModeClass GimpOperationScreenModeClass; - -struct _GimpOperationScreenMode -{ - GimpOperationPointLayerMode parent_instance; -}; - -struct _GimpOperationScreenModeClass -{ - GimpOperationPointLayerModeClass parent_class; -}; - - -GType gimp_operation_screen_mode_get_type (void) G_GNUC_CONST; - -gboolean gimp_operation_screen_mode_process_pixels (gfloat *in, - gfloat *layer, - gfloat *mask, - gfloat *out, - gfloat opacity, - glong samples, - const GeglRectangle *roi, - gint level); - - -#endif /* __GIMP_OPERATION_SCREEN_MODE_H__ */ diff --git a/app/operations/layer-modes-legacy/Makefile.am b/app/operations/layer-modes-legacy/Makefile.am index dd16e34088..f9cccf0d1c 100644 --- a/app/operations/layer-modes-legacy/Makefile.am +++ b/app/operations/layer-modes-legacy/Makefile.am @@ -18,4 +18,6 @@ libapplayermodeslegacy_a_SOURCES = \ gimpoperationmultiplylegacy.c \ gimpoperationmultiplylegacy.h \ gimpoperationdodgelegacy.c \ - gimpoperationdodgelegacy.h + gimpoperationdodgelegacy.h \ + gimpoperationscreenlegacy.c \ + gimpoperationscreenlegacy.h diff --git a/app/operations/layer-modes/Makefile.am b/app/operations/layer-modes/Makefile.am index 57c78d2fb7..1a49775d34 100644 --- a/app/operations/layer-modes/Makefile.am +++ b/app/operations/layer-modes/Makefile.am @@ -23,7 +23,9 @@ libapplayermodes_generic_a_sources = \ gimpoperationdodge.c \ gimpoperationdodge.h \ gimpoperationmultiply.c \ - gimpoperationmultiply.h + gimpoperationmultiply.h \ + gimpoperationscreen.c \ + gimpoperationscreen.h libapplayermodes_sse2_a_sources = \ gimpoperationnormal-sse2.c diff --git a/app/widgets/gimpwidgets-constructors.c b/app/widgets/gimpwidgets-constructors.c index ee6dfe0be9..69a4f04633 100644 --- a/app/widgets/gimpwidgets-constructors.c +++ b/app/widgets/gimpwidgets-constructors.c @@ -104,12 +104,13 @@ gimp_paint_mode_menu_new (gboolean with_behind_mode, GtkWidget *combo; store = gimp_enum_store_new_with_values (GIMP_TYPE_LAYER_MODE, - 27, + 30, GIMP_LAYER_MODE_NORMAL, GIMP_LAYER_MODE_NORMAL_NON_LINEAR, GIMP_LAYER_MODE_DISSOLVE, GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY, + GIMP_LAYER_MODE_SCREEN, GIMP_LAYER_MODE_SCREEN_LEGACY, GIMP_LAYER_MODE_DODGE, GIMP_LAYER_MODE_DODGE_LEGACY, diff --git a/libgimp/gimpenums.h b/libgimp/gimpenums.h index 006f97db20..12e9f66e19 100644 --- a/libgimp/gimpenums.h +++ b/libgimp/gimpenums.h @@ -100,7 +100,8 @@ typedef enum GIMP_LAYER_MODE_NORMAL, GIMP_LAYER_MODE_MULTIPLY, GIMP_LAYER_MODE_MULTIPLY_LINEAR, - GIMP_LAYER_MODE_DODGE + GIMP_LAYER_MODE_DODGE, + GIMP_LAYER_MODE_SCREEN } GimpLayerMode; diff --git a/tools/pdbgen/enums.pl b/tools/pdbgen/enums.pl index 95181d07f8..5071cfe870 100644 --- a/tools/pdbgen/enums.pl +++ b/tools/pdbgen/enums.pl @@ -723,7 +723,7 @@ package Gimp::CodeGen::enums; GIMP_LAYER_MODE_LCH_LIGHTNESS GIMP_LAYER_MODE_NORMAL GIMP_LAYER_MODE_MULTIPLY GIMP_LAYER_MODE_MULTIPLY_LINEAR - GIMP_LAYER_MODE_DODGE) ], + GIMP_LAYER_MODE_DODGE GIMP_LAYER_MODE_SCREEN) ], mapping => { GIMP_LAYER_MODE_NORMAL_NON_LINEAR => '0', GIMP_LAYER_MODE_DISSOLVE => '1', GIMP_LAYER_MODE_BEHIND => '2', @@ -755,7 +755,8 @@ package Gimp::CodeGen::enums; GIMP_LAYER_MODE_NORMAL => '28', GIMP_LAYER_MODE_MULTIPLY => '29', GIMP_LAYER_MODE_MULTIPLY_LINEAR => '30', - GIMP_LAYER_MODE_DODGE => '31' } + GIMP_LAYER_MODE_DODGE => '31', + GIMP_LAYER_MODE_SCREEN => '32' } }, GimpBrushApplicationMode => { contig => 1,