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
84 lines
3.7 KiB
C
84 lines
3.7 KiB
C
/* GIMP - The GNU Image Manipulation Program
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
*
|
|
* gimpoperationlayermode.h
|
|
* Copyright (C) 2008 Michael Natterer <mitch@gimp.org>
|
|
*
|
|
* 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 <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __GIMP_OPERATION_LAYER_MODE_H__
|
|
#define __GIMP_OPERATION_LAYER_MODE_H__
|
|
|
|
|
|
#include <gegl-plugin.h>
|
|
|
|
|
|
#define GIMP_TYPE_OPERATION_LAYER_MODE (gimp_operation_layer_mode_get_type ())
|
|
#define GIMP_OPERATION_LAYER_MODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_LAYER_MODE, GimpOperationLayerMode))
|
|
#define GIMP_OPERATION_LAYER_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_LAYER_MODE, GimpOperationLayerModeClass))
|
|
#define GIMP_IS_OPERATION_LAYER_MODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_LAYER_MODE))
|
|
#define GIMP_IS_OPERATION_LAYER_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_LAYER_MODE))
|
|
#define GIMP_OPERATION_LAYER_MODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_LAYER_MODE, GimpOperationLayerModeClass))
|
|
|
|
|
|
typedef struct _GimpOperationLayerModeClass GimpOperationLayerModeClass;
|
|
|
|
struct _GimpOperationLayerMode
|
|
{
|
|
GeglOperationPointComposer3 parent_instance;
|
|
|
|
GimpLayerMode layer_mode;
|
|
gdouble opacity;
|
|
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;
|
|
GimpLayerModeBlendFunc blend_function;
|
|
gboolean is_last_node;
|
|
};
|
|
|
|
struct _GimpOperationLayerModeClass
|
|
{
|
|
GeglOperationPointComposer3Class parent_class;
|
|
|
|
/* virtual functions */
|
|
gboolean (* process) (GeglOperation *operation,
|
|
void *in,
|
|
void *aux,
|
|
void *mask,
|
|
void *out,
|
|
glong samples,
|
|
const GeglRectangle *roi,
|
|
gint level);
|
|
|
|
/* Returns the composite region (any combination of the layer and the
|
|
* backdrop) that the layer mode affects. Most modes only affect the
|
|
* overlapping region, and don't need to override this function.
|
|
*/
|
|
GimpLayerCompositeRegion (* get_affected_region) (GimpOperationLayerMode *layer_mode);
|
|
};
|
|
|
|
|
|
GType gimp_operation_layer_mode_get_type (void) G_GNUC_CONST;
|
|
|
|
GimpLayerCompositeRegion gimp_operation_layer_mode_get_affected_region (GimpOperationLayerMode *layer_mode);
|
|
|
|
|
|
#endif /* __GIMP_OPERATION_LAYER_MODE_H__ */
|