mirror of https://github.com/GNOME/gimp.git
app: cache fishes per operation instance in layer-modes
There was a global 3x3 array of babl fishes used for converting between blending and compositing pixel representations, these were all hard-coded to operate within the sRGB babl-space family. This commit updates a per-instance array during operation prepare instead, that comes preconfigured with fishes derived from the correct space. Since the same operation instance might get different space input during its life time we store and compare the cached fishes with the current format (which is unique depending on space). This should address the problem seen in issue #2592
This commit is contained in:
parent
d71efdec20
commit
4dd3e2197a
|
@ -117,9 +117,6 @@ G_DEFINE_TYPE (GimpOperationLayerMode, gimp_operation_layer_mode,
|
|||
|
||||
#define parent_class gimp_operation_layer_mode_parent_class
|
||||
|
||||
|
||||
static const Babl *gimp_layer_color_space_fish[3 /* from */][3 /* to */];
|
||||
|
||||
static CompositeFunc composite_union = gimp_operation_layer_mode_composite_union;
|
||||
static CompositeFunc composite_clip_to_backdrop = gimp_operation_layer_mode_composite_clip_to_backdrop;
|
||||
static CompositeFunc composite_clip_to_layer = gimp_operation_layer_mode_composite_clip_to_layer;
|
||||
|
@ -192,32 +189,6 @@ gimp_operation_layer_mode_class_init (GimpOperationLayerModeClass *klass)
|
|||
GIMP_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT));
|
||||
|
||||
gimp_layer_color_space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
|
||||
babl_fish ("RGBA float", "R'G'B'A float");
|
||||
gimp_layer_color_space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
|
||||
babl_fish ("RGBA float", "CIE Lab alpha float");
|
||||
|
||||
gimp_layer_color_space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
|
||||
babl_fish ("R'G'B'A float", "RGBA float");
|
||||
gimp_layer_color_space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
|
||||
babl_fish ("R'G'B'A float", "CIE Lab alpha float");
|
||||
|
||||
gimp_layer_color_space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
|
||||
babl_fish ("CIE Lab alpha float", "RGBA float");
|
||||
gimp_layer_color_space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
|
||||
babl_fish ("CIE Lab alpha float", "R'G'B'A float");
|
||||
|
||||
#if COMPILE_SSE2_INTRINISICS
|
||||
if (gimp_cpu_accel_get_support () & GIMP_CPU_ACCEL_X86_SSE2)
|
||||
|
@ -362,6 +333,43 @@ gimp_operation_layer_mode_prepare (GeglOperation *operation)
|
|||
self->composite_space,
|
||||
self->blend_space,
|
||||
preferred_format);
|
||||
if (self->cached_fish_format != format)
|
||||
{
|
||||
self->cached_fish_format = format;
|
||||
|
||||
self->space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
|
||||
babl_fish (babl_format_with_space ("RGBA float", format),
|
||||
babl_format_with_space ("R'G'B'A float", format));
|
||||
self->space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
|
||||
babl_fish (babl_format_with_space ("RGBA float", format),
|
||||
babl_format_with_space ("CIE Lab alpha float", format));
|
||||
|
||||
self->space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
|
||||
babl_fish (babl_format_with_space("R'G'B'A float", format),
|
||||
babl_format_with_space ( "RGBA float", format));
|
||||
self->space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
|
||||
babl_fish (babl_format_with_space("R'G'B'A float", format),
|
||||
babl_format_with_space ( "CIE Lab alpha float", format));
|
||||
|
||||
self->space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
|
||||
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
|
||||
babl_format_with_space ( "RGBA float", format));
|
||||
self->space_fish
|
||||
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
|
||||
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
|
||||
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
|
||||
babl_format_with_space ( "R'G'B'A float", format));
|
||||
}
|
||||
|
||||
gegl_operation_set_format (operation, "input", format);
|
||||
gegl_operation_set_format (operation, "output", format);
|
||||
|
@ -582,11 +590,11 @@ gimp_operation_layer_mode_real_process (GeglOperation *operation,
|
|||
gimp_assert (composite_space >= 1 && composite_space < 4);
|
||||
gimp_assert (blend_space >= 1 && blend_space < 4);
|
||||
|
||||
composite_to_blend_fish = gimp_layer_color_space_fish [composite_space - 1]
|
||||
[blend_space - 1];
|
||||
composite_to_blend_fish = layer_mode->space_fish [composite_space - 1]
|
||||
[blend_space - 1];
|
||||
|
||||
blend_to_composite_fish = gimp_layer_color_space_fish [blend_space - 1]
|
||||
[composite_space - 1];
|
||||
blend_to_composite_fish = layer_mode->space_fish [blend_space - 1]
|
||||
[composite_space - 1];
|
||||
}
|
||||
|
||||
/* if we need to convert the samples between the composite and blend
|
||||
|
|
|
@ -44,6 +44,8 @@ struct _GimpOperationLayerMode
|
|||
GimpLayerColorSpace blend_space;
|
||||
GimpLayerColorSpace composite_space;
|
||||
GimpLayerCompositeMode composite_mode;
|
||||
const Babl *cached_fish_format;
|
||||
const Babl *space_fish[3 /* from */][3 /* to */];
|
||||
|
||||
GimpLayerCompositeMode real_composite_mode;
|
||||
GimpLayerModeFunc function;
|
||||
|
|
Loading…
Reference in New Issue