app: create a meta-op to apply mask and opacity
and use it to apply the layer mask.
This commit is contained in:
@ -1789,7 +1789,6 @@ gimp_layer_apply_mask (GimpLayer *layer,
|
|||||||
GimpItem *item;
|
GimpItem *item;
|
||||||
GimpImage *image;
|
GimpImage *image;
|
||||||
GimpLayerMask *mask;
|
GimpLayerMask *mask;
|
||||||
PixelRegion srcPR, maskPR;
|
|
||||||
gboolean view_changed = FALSE;
|
gboolean view_changed = FALSE;
|
||||||
|
|
||||||
g_return_if_fail (GIMP_IS_LAYER (layer));
|
g_return_if_fail (GIMP_IS_LAYER (layer));
|
||||||
@ -1835,6 +1834,10 @@ gimp_layer_apply_mask (GimpLayer *layer,
|
|||||||
|
|
||||||
if (mode == GIMP_MASK_APPLY)
|
if (mode == GIMP_MASK_APPLY)
|
||||||
{
|
{
|
||||||
|
GeglBuffer *mask_buffer;
|
||||||
|
GeglBuffer *dest_buffer;
|
||||||
|
GeglNode *apply_opacity;
|
||||||
|
|
||||||
if (push_undo)
|
if (push_undo)
|
||||||
gimp_drawable_push_undo (GIMP_DRAWABLE (layer), NULL,
|
gimp_drawable_push_undo (GIMP_DRAWABLE (layer), NULL,
|
||||||
0, 0,
|
0, 0,
|
||||||
@ -1843,20 +1846,15 @@ gimp_layer_apply_mask (GimpLayer *layer,
|
|||||||
NULL, FALSE);
|
NULL, FALSE);
|
||||||
|
|
||||||
/* Combine the current layer's alpha channel and the mask */
|
/* Combine the current layer's alpha channel and the mask */
|
||||||
pixel_region_init (&srcPR,
|
mask_buffer = gimp_drawable_get_read_buffer (GIMP_DRAWABLE (mask));
|
||||||
gimp_drawable_get_tiles (GIMP_DRAWABLE (layer)),
|
dest_buffer = gimp_drawable_get_write_buffer (GIMP_DRAWABLE (layer));
|
||||||
0, 0,
|
|
||||||
gimp_item_get_width (item),
|
|
||||||
gimp_item_get_height (item),
|
|
||||||
TRUE);
|
|
||||||
pixel_region_init (&maskPR,
|
|
||||||
gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
|
|
||||||
0, 0,
|
|
||||||
gimp_item_get_width (item),
|
|
||||||
gimp_item_get_height (item),
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
apply_mask_to_region (&srcPR, &maskPR, OPAQUE_OPACITY);
|
apply_opacity = gimp_gegl_create_apply_opacity_node (mask_buffer, 1.0);
|
||||||
|
|
||||||
|
gimp_drawable_apply_operation_to_buffer (GIMP_DRAWABLE (layer), NULL, NULL,
|
||||||
|
apply_opacity, TRUE, dest_buffer);
|
||||||
|
|
||||||
|
g_object_unref (apply_opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_signal_handlers_disconnect_by_func (mask,
|
g_signal_handlers_disconnect_by_func (mask,
|
||||||
|
@ -67,3 +67,39 @@ gimp_gegl_create_flatten_node (const GimpRGB *background)
|
|||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GeglNode *
|
||||||
|
gimp_gegl_create_apply_opacity_node (GeglBuffer *mask,
|
||||||
|
gdouble opacity)
|
||||||
|
{
|
||||||
|
GeglNode *node;
|
||||||
|
GeglNode *input;
|
||||||
|
GeglNode *output;
|
||||||
|
GeglNode *opacity_node;
|
||||||
|
GeglNode *mask_source;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GEGL_IS_BUFFER (mask), NULL);
|
||||||
|
|
||||||
|
node = gegl_node_new ();
|
||||||
|
|
||||||
|
input = gegl_node_get_input_proxy (node, "input");
|
||||||
|
output = gegl_node_get_output_proxy (node, "output");
|
||||||
|
|
||||||
|
opacity_node = gegl_node_new_child (node,
|
||||||
|
"operation", "gegl:opacity",
|
||||||
|
"value", opacity,
|
||||||
|
NULL);
|
||||||
|
mask_source = gegl_node_new_child (node,
|
||||||
|
"operation", "gegl:buffer-source",
|
||||||
|
"buffer", mask,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
gegl_node_connect_to (input, "output",
|
||||||
|
opacity_node, "input");
|
||||||
|
gegl_node_connect_to (mask_source, "output",
|
||||||
|
opacity_node, "aux");
|
||||||
|
gegl_node_connect_to (opacity_node, "output",
|
||||||
|
output, "input");
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
@ -22,7 +22,9 @@
|
|||||||
#define __GIMP_GEGL_NODES_H__
|
#define __GIMP_GEGL_NODES_H__
|
||||||
|
|
||||||
|
|
||||||
GeglNode * gimp_gegl_create_flatten_node (const GimpRGB *background);
|
GeglNode * gimp_gegl_create_flatten_node (const GimpRGB *background);
|
||||||
|
GeglNode * gimp_gegl_create_apply_opacity_node (GeglBuffer *mask,
|
||||||
|
gdouble opacity);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __GIMP_GEGL_NODES_H__ */
|
#endif /* __GIMP_GEGL_NODES_H__ */
|
||||||
|
Reference in New Issue
Block a user