app: use GEGL to create a layer mask from a grayscale copy of the layer

This commit is contained in:
Michael Natterer 2012-03-16 15:15:53 +01:00
parent f15e8a1ea2
commit 5c71411502
1 changed files with 24 additions and 13 deletions

View File

@ -20,9 +20,11 @@
#include <stdlib.h>
#include <string.h>
#include <cairo.h>
#include <gegl.h>
#include "libgimpbase/gimpbase.h"
#include "libgimpcolor/gimpcolor.h"
#include "libgimpmath/gimpmath.h"
#include "core-types.h"
@ -37,6 +39,7 @@
#include "gegl/gimp-gegl-nodes.h"
#include "gegl/gimp-gegl-utils.h"
#include "gimp-apply-operation.h"
#include "gimpchannel-select.h"
#include "gimpcontext.h"
#include "gimpcontainer.h"
@ -1719,6 +1722,8 @@ gimp_layer_create_mask (const GimpLayer *layer,
case GIMP_ADD_COPY_MASK:
{
TileManager *copy_tiles = NULL;
GeglBuffer *src_buffer;
GeglBuffer *dest_buffer;
if (! gimp_drawable_is_gray (drawable))
{
@ -1733,32 +1738,38 @@ gimp_layer_create_mask (const GimpLayer *layer,
gimp_drawable_convert_tiles_grayscale (drawable, copy_tiles);
pixel_region_init (&srcPR, copy_tiles,
0, 0,
gimp_item_get_width (item),
gimp_item_get_height (item),
FALSE);
src_buffer = gimp_tile_manager_create_buffer (copy_tiles, FALSE);
}
else
{
pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
0, 0,
gimp_item_get_width (item),
gimp_item_get_height (item),
FALSE);
src_buffer = gimp_drawable_get_read_buffer (drawable);
g_object_ref (src_buffer);
}
dest_buffer = gimp_drawable_get_write_buffer (GIMP_DRAWABLE (mask));
if (gimp_drawable_has_alpha (drawable))
{
guchar black_uchar[] = { 0, 0, 0, 0 };
GeglNode *flatten;
GimpRGB background;
flatten_region (&srcPR, &destPR, black_uchar);
gimp_rgba_set (&background, 0.0, 0.0, 0.0, 0.0);
flatten = gimp_gegl_create_flatten_node (&background);
gimp_apply_operation (src_buffer,
NULL, NULL,
flatten, TRUE,
dest_buffer, NULL);
g_object_unref (flatten);
}
else
{
copy_region (&srcPR, &destPR);
gegl_buffer_copy (src_buffer, NULL, dest_buffer, NULL);
}
g_object_unref (src_buffer);
if (copy_tiles)
tile_manager_unref (copy_tiles);
}