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:
Ell
2017-03-08 06:36:39 -05:00
parent a2f3616a13
commit 40c0ea4fe1
3 changed files with 18 additions and 2 deletions

View File

@ -405,7 +405,8 @@ static const GimpLayerModeInfo layer_mode_infos[] =
.function = gimp_operation_color_erase_process,
.flags = GIMP_LAYER_MODE_FLAG_BLEND_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 |
GIMP_LAYER_MODE_CONTEXT_FADE,
.paint_composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
@ -804,7 +805,8 @@ static const GimpLayerModeInfo layer_mode_infos[] =
.op_name = "gimp:erase",
.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,
.paint_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;
}
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
gimp_layer_mode_get_blend_space (GimpLayerMode mode)
{

View File

@ -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_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_composite_space (GimpLayerMode mode);
GimpLayerCompositeMode gimp_layer_mode_get_composite_mode (GimpLayerMode mode);

View File

@ -173,6 +173,7 @@ typedef enum /*< pdb-skip, skip >*/
GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE = 1 << 1,
GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE = 1 << 2,
GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE = 1 << 3,
GIMP_LAYER_MODE_FLAG_SUBTRACTIVE = 1 << 4
} GimpLayerModeFlags;