diff --git a/app/gegl/gimp-gegl.c b/app/gegl/gimp-gegl.c index 64046b607a..8dd13cec6c 100644 --- a/app/gegl/gimp-gegl.c +++ b/app/gegl/gimp-gegl.c @@ -104,6 +104,7 @@ gimp_gegl_exit (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); + gimp_operations_exit (gimp); gimp_parallel_exit (gimp); } diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c index 7cb30fd2dd..96668a317d 100644 --- a/app/operations/gimp-operations.c +++ b/app/operations/gimp-operations.c @@ -223,3 +223,11 @@ gimp_operations_init (Gimp *gimp) set_settings_folder (GIMP_TYPE_LEVELS_CONFIG, "levels"); } + +void +gimp_operations_exit (Gimp *gimp) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + + gimp_layer_modes_exit (); +} diff --git a/app/operations/gimp-operations.h b/app/operations/gimp-operations.h index 6f2b222fd7..8e41e45241 100644 --- a/app/operations/gimp-operations.h +++ b/app/operations/gimp-operations.h @@ -22,6 +22,7 @@ void gimp_operations_init (Gimp *gimp); +void gimp_operations_exit (Gimp *gimp); #endif /* __GIMP_OPERATIONS_H__ */ diff --git a/app/operations/layer-modes/gimp-layer-modes.c b/app/operations/layer-modes/gimp-layer-modes.c index 587e1c0b9c..4f4da5a825 100644 --- a/app/operations/layer-modes/gimp-layer-modes.c +++ b/app/operations/layer-modes/gimp-layer-modes.c @@ -1110,6 +1110,7 @@ static const GimpLayerMode layer_mode_groups[][2] = } }; +static GeglOperation *ops[G_N_ELEMENTS (layer_mode_infos)] = { 0 }; /* public functions */ @@ -1124,6 +1125,15 @@ gimp_layer_modes_init (void) } } +void +gimp_layer_modes_exit (void) +{ + gint i; + + for (i = 0; i < G_N_ELEMENTS (layer_mode_infos); i++) + g_clear_object (&ops[i]); +} + static const GimpLayerModeInfo * gimp_layer_mode_info (GimpLayerMode mode) { @@ -1265,55 +1275,54 @@ gimp_layer_mode_get_operation_name (GimpLayerMode mode) return info->op_name; } +/** + * gimp_layer_mode_get_operation: + * @mode: + * + * Returns: a #GeglOperation for @mode which may be reused and must not + * be freed. + */ GeglOperation * gimp_layer_mode_get_operation (GimpLayerMode mode) { const GimpLayerModeInfo *info = gimp_layer_mode_info (mode); - GeglNode *node; - GeglOperation *operation; + const gchar *op_name; - if (! info) - info = layer_mode_infos; - - node = gegl_node_new_child (NULL, - "operation", info->op_name, - NULL); - - operation = gegl_node_get_gegl_operation (node); - g_object_ref (operation); - g_object_unref (node); - - return operation; -} - -GimpLayerModeFunc -gimp_layer_mode_get_function (GimpLayerMode mode) -{ - const GimpLayerModeInfo *info = gimp_layer_mode_info (mode); - static GimpLayerModeFunc funcs[G_N_ELEMENTS (layer_mode_infos)]; + op_name = gimp_layer_mode_get_operation_name (mode); if (! info) info = layer_mode_infos; mode = info - layer_mode_infos; - if (! funcs[mode]) + if (! ops[mode]) { GeglNode *node; GeglOperation *operation; node = gegl_node_new_child (NULL, - "operation", info->op_name, + "operation", op_name, NULL); operation = gegl_node_get_gegl_operation (node); - funcs[mode] = GIMP_OPERATION_LAYER_MODE_GET_CLASS (operation)->process; - + g_object_ref (operation); g_object_unref (node); + + ops[mode] = operation; } - return funcs[mode]; + return ops[mode]; +} + +GimpLayerModeFunc +gimp_layer_mode_get_function (GimpLayerMode mode) +{ + GeglOperation *operation; + + operation = gimp_layer_mode_get_operation (mode); + + return GIMP_OPERATION_LAYER_MODE_GET_CLASS (operation)->process; } GimpLayerModeBlendFunc diff --git a/app/operations/layer-modes/gimp-layer-modes.h b/app/operations/layer-modes/gimp-layer-modes.h index c98a392c61..34ebf64d2e 100644 --- a/app/operations/layer-modes/gimp-layer-modes.h +++ b/app/operations/layer-modes/gimp-layer-modes.h @@ -24,6 +24,7 @@ void gimp_layer_modes_init (void); +void gimp_layer_modes_exit (void); gboolean gimp_layer_mode_is_legacy (GimpLayerMode mode); diff --git a/app/paint/gimppaintcore-loops.cc b/app/paint/gimppaintcore-loops.cc index 8aec8ca8fe..664fe0476f 100644 --- a/app/paint/gimppaintcore-loops.cc +++ b/app/paint/gimppaintcore-loops.cc @@ -1876,13 +1876,12 @@ struct DoLayerBlend : Base static constexpr gint max_n_iterators = Base::max_n_iterators + 2; - const Babl *iterator_format; - GimpOperationLayerMode *layer_mode = NULL; - const GimpPaintCoreLoopsParams *params; + const Babl *iterator_format; + GimpOperationLayerMode *layer_mode = NULL; explicit DoLayerBlend (const GimpPaintCoreLoopsParams *params) : - Base (params), params(params) + Base (params) { layer_mode = GIMP_OPERATION_LAYER_MODE (gimp_layer_mode_get_operation (params->paint_mode)); layer_mode->layer_mode = params->paint_mode; @@ -1902,18 +1901,6 @@ struct DoLayerBlend : Base g_return_if_fail (gimp_temp_buf_get_format (params->paint_buf) == iterator_format); } - DoLayerBlend (const DoLayerBlend &algorithm) : - Base (algorithm.params), params(algorithm.params) - { - layer_mode = GIMP_OPERATION_LAYER_MODE (g_object_ref (algorithm.layer_mode)); - iterator_format = algorithm.iterator_format; - } - - ~DoLayerBlend () - { - g_clear_object (&layer_mode); - } - template struct State : Base::template State {