app: add GIMP_LAYER_MODE_FLAG_SUBTRACTIVE
Most modes only modify the *color* of overlapping dest/src regions, however, erase and color-erase may also reduce their *alpha*, i.e., eliminate some of the overlapping content. Flag these modes with the new SUBTRACTIVE flag, as they require more general compositing code. The next commit adds the said code.
This commit is contained in:
@ -405,7 +405,8 @@ static const GimpLayerModeInfo layer_mode_infos[] =
|
|||||||
.function = gimp_operation_color_erase_process,
|
.function = gimp_operation_color_erase_process,
|
||||||
.flags = GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE |
|
.flags = GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE |
|
||||||
GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
|
GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
|
||||||
GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
|
GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE |
|
||||||
|
GIMP_LAYER_MODE_FLAG_SUBTRACTIVE,
|
||||||
.context = GIMP_LAYER_MODE_CONTEXT_PAINT |
|
.context = GIMP_LAYER_MODE_CONTEXT_PAINT |
|
||||||
GIMP_LAYER_MODE_CONTEXT_FADE,
|
GIMP_LAYER_MODE_CONTEXT_FADE,
|
||||||
.paint_composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
|
.paint_composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
|
||||||
@ -804,7 +805,8 @@ static const GimpLayerModeInfo layer_mode_infos[] =
|
|||||||
|
|
||||||
.op_name = "gimp:erase",
|
.op_name = "gimp:erase",
|
||||||
.function = gimp_operation_erase_process,
|
.function = gimp_operation_erase_process,
|
||||||
.flags = GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
|
.flags = GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE |
|
||||||
|
GIMP_LAYER_MODE_FLAG_SUBTRACTIVE,
|
||||||
.context = GIMP_LAYER_MODE_CONTEXT_FADE,
|
.context = GIMP_LAYER_MODE_CONTEXT_FADE,
|
||||||
.paint_composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
|
.paint_composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
|
||||||
.composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
|
.composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
|
||||||
@ -1149,6 +1151,17 @@ gimp_layer_mode_is_composite_mode_mutable (GimpLayerMode mode)
|
|||||||
return (info->flags & GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE) == 0;
|
return (info->flags & GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gimp_layer_mode_is_subtractive (GimpLayerMode mode)
|
||||||
|
{
|
||||||
|
const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
|
||||||
|
|
||||||
|
if (! info)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return (info->flags & GIMP_LAYER_MODE_FLAG_SUBTRACTIVE) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
GimpLayerColorSpace
|
GimpLayerColorSpace
|
||||||
gimp_layer_mode_get_blend_space (GimpLayerMode mode)
|
gimp_layer_mode_get_blend_space (GimpLayerMode mode)
|
||||||
{
|
{
|
||||||
|
@ -31,6 +31,8 @@ gboolean gimp_layer_mode_is_blend_space_mutable (GimpLayerMode
|
|||||||
gboolean gimp_layer_mode_is_composite_space_mutable (GimpLayerMode mode);
|
gboolean gimp_layer_mode_is_composite_space_mutable (GimpLayerMode mode);
|
||||||
gboolean gimp_layer_mode_is_composite_mode_mutable (GimpLayerMode mode);
|
gboolean gimp_layer_mode_is_composite_mode_mutable (GimpLayerMode mode);
|
||||||
|
|
||||||
|
gboolean gimp_layer_mode_is_subtractive (GimpLayerMode mode);
|
||||||
|
|
||||||
GimpLayerColorSpace gimp_layer_mode_get_blend_space (GimpLayerMode mode);
|
GimpLayerColorSpace gimp_layer_mode_get_blend_space (GimpLayerMode mode);
|
||||||
GimpLayerColorSpace gimp_layer_mode_get_composite_space (GimpLayerMode mode);
|
GimpLayerColorSpace gimp_layer_mode_get_composite_space (GimpLayerMode mode);
|
||||||
GimpLayerCompositeMode gimp_layer_mode_get_composite_mode (GimpLayerMode mode);
|
GimpLayerCompositeMode gimp_layer_mode_get_composite_mode (GimpLayerMode mode);
|
||||||
|
@ -173,6 +173,7 @@ typedef enum /*< pdb-skip, skip >*/
|
|||||||
GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE = 1 << 1,
|
GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE = 1 << 1,
|
||||||
GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE = 1 << 2,
|
GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE = 1 << 2,
|
||||||
GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE = 1 << 3,
|
GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE = 1 << 3,
|
||||||
|
GIMP_LAYER_MODE_FLAG_SUBTRACTIVE = 1 << 4
|
||||||
} GimpLayerModeFlags;
|
} GimpLayerModeFlags;
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user