app: add gimp_drawable_apply_buffer() and port edit, bucket fill, stroke
This commit is contained in:
@ -458,12 +458,9 @@ gimp_edit_fill_full (GimpImage *image,
|
||||
GimpLayerModeEffects paint_mode,
|
||||
const gchar *undo_desc)
|
||||
{
|
||||
TileManager *buf_tiles;
|
||||
GeglBuffer *dest_buffer;
|
||||
PixelRegion bufPR;
|
||||
gint x, y, width, height;
|
||||
gint tiles_bytes;
|
||||
const Babl *format;
|
||||
GeglBuffer *dest_buffer;
|
||||
const Babl *format;
|
||||
gint x, y, width, height;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
|
||||
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE);
|
||||
@ -474,22 +471,19 @@ gimp_edit_fill_full (GimpImage *image,
|
||||
if (! gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height))
|
||||
return TRUE; /* nothing to do, but the fill succeded */
|
||||
|
||||
tiles_bytes = gimp_drawable_bytes (drawable);
|
||||
format = gimp_drawable_get_format (drawable);
|
||||
format = gimp_drawable_get_format (drawable);
|
||||
|
||||
if (pattern)
|
||||
{
|
||||
if (! gimp_drawable_has_alpha (drawable) &&
|
||||
(pattern->mask->bytes == 2 || pattern->mask->bytes == 4))
|
||||
{
|
||||
tiles_bytes++;
|
||||
format = gimp_drawable_get_format_with_alpha (drawable);
|
||||
}
|
||||
}
|
||||
|
||||
buf_tiles = tile_manager_new (width, height, tiles_bytes);
|
||||
|
||||
dest_buffer = gimp_tile_manager_create_buffer (buf_tiles, format);
|
||||
dest_buffer = gimp_gegl_buffer_new (GIMP_GEGL_RECT (0, 0, width, height),
|
||||
format);
|
||||
|
||||
if (pattern)
|
||||
{
|
||||
@ -506,15 +500,13 @@ gimp_edit_fill_full (GimpImage *image,
|
||||
g_object_unref (gegl_color);
|
||||
}
|
||||
|
||||
g_object_unref (dest_buffer);
|
||||
|
||||
pixel_region_init (&bufPR, buf_tiles, 0, 0, width, height, FALSE);
|
||||
gimp_drawable_apply_region (drawable, &bufPR,
|
||||
gimp_drawable_apply_buffer (drawable, dest_buffer,
|
||||
GIMP_GEGL_RECT (0, 0, width, height),
|
||||
TRUE, undo_desc,
|
||||
opacity, paint_mode,
|
||||
NULL, NULL, x, y);
|
||||
|
||||
tile_manager_unref (buf_tiles);
|
||||
g_object_unref (dest_buffer);
|
||||
|
||||
gimp_drawable_update (drawable, x, y, width, height);
|
||||
|
||||
|
||||
@ -26,9 +26,6 @@
|
||||
|
||||
#include "core-types.h"
|
||||
|
||||
#include "base/pixel-region.h"
|
||||
#include "base/tile-manager.h"
|
||||
|
||||
#include "gegl/gimp-gegl-nodes.h"
|
||||
#include "gegl/gimp-gegl-utils.h"
|
||||
|
||||
@ -140,11 +137,9 @@ gimp_drawable_bucket_fill_internal (GimpDrawable *drawable,
|
||||
{
|
||||
GimpImage *image;
|
||||
GimpChannel *mask;
|
||||
TileManager *tiles;
|
||||
GeglBuffer *buffer;
|
||||
GeglBuffer *mask_buffer;
|
||||
GeglNode *apply_opacity;
|
||||
PixelRegion bufPR;
|
||||
gint x1, y1, x2, y2;
|
||||
gint mask_offset_x = 0;
|
||||
gint mask_offset_y = 0;
|
||||
@ -225,10 +220,8 @@ gimp_drawable_bucket_fill_internal (GimpDrawable *drawable,
|
||||
mask_offset_y = y1;
|
||||
}
|
||||
|
||||
tiles = tile_manager_new ((x2 - x1), (y2 - y1),
|
||||
gimp_drawable_bytes_with_alpha (drawable));
|
||||
buffer = gimp_tile_manager_create_buffer (tiles,
|
||||
gimp_drawable_get_format_with_alpha (drawable));
|
||||
buffer = gimp_gegl_buffer_new (GIMP_GEGL_RECT (0, 0, x2 - x1, y2 - y1),
|
||||
gimp_drawable_get_format_with_alpha (drawable));
|
||||
|
||||
switch (fill_mode)
|
||||
{
|
||||
@ -261,18 +254,16 @@ gimp_drawable_bucket_fill_internal (GimpDrawable *drawable,
|
||||
buffer, NULL);
|
||||
|
||||
g_object_unref (apply_opacity);
|
||||
|
||||
g_object_unref (buffer);
|
||||
g_object_unref (mask);
|
||||
|
||||
/* Apply it to the image */
|
||||
pixel_region_init (&bufPR, tiles, 0, 0, (x2 - x1), (y2 - y1), FALSE);
|
||||
gimp_drawable_apply_region (drawable, &bufPR,
|
||||
gimp_drawable_apply_buffer (drawable, buffer,
|
||||
GIMP_GEGL_RECT (0, 0, x2 - x1, y2 - y1),
|
||||
TRUE, C_("undo-type", "Bucket Fill"),
|
||||
opacity, paint_mode,
|
||||
NULL, NULL, x1, y1);
|
||||
|
||||
tile_manager_unref (tiles);
|
||||
g_object_unref (buffer);
|
||||
|
||||
gimp_drawable_update (drawable, x1, y1, x2 - x1, y2 - y1);
|
||||
|
||||
|
||||
@ -29,9 +29,6 @@
|
||||
|
||||
#include "core-types.h"
|
||||
|
||||
#include "base/pixel-region.h"
|
||||
#include "base/tile-manager.h"
|
||||
|
||||
#include "gegl/gimp-gegl-nodes.h"
|
||||
#include "gegl/gimp-gegl-utils.h"
|
||||
|
||||
@ -284,18 +281,14 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
|
||||
gboolean do_stroke,
|
||||
gboolean push_undo)
|
||||
{
|
||||
GimpContext *context = GIMP_CONTEXT (options);
|
||||
GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
|
||||
TileManager *base;
|
||||
GeglBuffer *base_buffer;
|
||||
GeglBuffer *mask_buffer;
|
||||
GeglNode *apply_opacity;
|
||||
GeglRectangle rect = { 0, };
|
||||
gint x, y, w, h;
|
||||
gint bytes;
|
||||
gint off_x;
|
||||
gint off_y;
|
||||
PixelRegion basePR;
|
||||
GimpContext *context = GIMP_CONTEXT (options);
|
||||
GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
|
||||
GeglBuffer *base_buffer;
|
||||
GeglBuffer *mask_buffer;
|
||||
GeglNode *apply_opacity;
|
||||
gint x, y, w, h;
|
||||
gint off_x;
|
||||
gint off_y;
|
||||
|
||||
/* must call gimp_channel_is_empty() instead of relying on
|
||||
* gimp_item_mask_intersect() because the selection pretends to
|
||||
@ -345,9 +338,8 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
|
||||
/* fill a 1-bpp GeglBuffer with black, this will describe the shape
|
||||
* of the stroke.
|
||||
*/
|
||||
rect.width = w;
|
||||
rect.height = h;
|
||||
mask_buffer = gegl_buffer_new (&rect, babl_format ("Y u8"));
|
||||
mask_buffer = gegl_buffer_new (GIMP_GEGL_RECT (0, 0, w, h),
|
||||
babl_format ("Y u8"));
|
||||
|
||||
gegl_buffer_clear (mask_buffer, NULL);
|
||||
|
||||
@ -358,11 +350,8 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
|
||||
x + off_x, y + off_y,
|
||||
gimp_fill_options_get_antialias (options));
|
||||
|
||||
bytes = gimp_drawable_bytes_with_alpha (drawable);
|
||||
|
||||
base = tile_manager_new (w, h, bytes);
|
||||
base_buffer = gimp_tile_manager_create_buffer (base,
|
||||
gimp_drawable_get_format_with_alpha (drawable));
|
||||
base_buffer = gimp_gegl_buffer_new (GIMP_GEGL_RECT (0, 0, w, h),
|
||||
gimp_drawable_get_format_with_alpha (drawable));
|
||||
|
||||
switch (gimp_fill_options_get_style (options))
|
||||
{
|
||||
@ -400,18 +389,17 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
|
||||
|
||||
g_object_unref (apply_opacity);
|
||||
|
||||
g_object_unref (base_buffer);
|
||||
g_object_unref (mask_buffer);
|
||||
|
||||
/* Apply to drawable */
|
||||
pixel_region_init (&basePR, base, 0, 0, w, h, FALSE);
|
||||
gimp_drawable_apply_region (drawable, &basePR,
|
||||
gimp_drawable_apply_buffer (drawable, base_buffer,
|
||||
GIMP_GEGL_RECT (0, 0, w, h),
|
||||
push_undo, C_("undo-type", "Render Stroke"),
|
||||
gimp_context_get_opacity (context),
|
||||
gimp_context_get_paint_mode (context),
|
||||
NULL, NULL, x, y);
|
||||
|
||||
tile_manager_unref (base);
|
||||
g_object_unref (base_buffer);
|
||||
|
||||
gimp_drawable_update (drawable, x, y, w, h);
|
||||
}
|
||||
|
||||
@ -1234,6 +1234,38 @@ gimp_drawable_convert_type (GimpDrawable *drawable,
|
||||
new_base_type, push_undo);
|
||||
}
|
||||
|
||||
void
|
||||
gimp_drawable_apply_buffer (GimpDrawable *drawable,
|
||||
GeglBuffer *buffer,
|
||||
const GeglRectangle *buffer_rect,
|
||||
gboolean push_undo,
|
||||
const gchar *undo_desc,
|
||||
gdouble opacity,
|
||||
GimpLayerModeEffects mode,
|
||||
TileManager *src1_tiles,
|
||||
PixelRegion *destPR,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
PixelRegion src2PR;
|
||||
|
||||
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
|
||||
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)));
|
||||
g_return_if_fail (GEGL_IS_BUFFER (buffer));
|
||||
g_return_if_fail (buffer_rect != NULL);
|
||||
|
||||
pixel_region_init (&src2PR, gimp_gegl_buffer_get_tiles (buffer),
|
||||
buffer_rect->x, buffer_rect->y,
|
||||
buffer_rect->width, buffer_rect->height,
|
||||
FALSE);
|
||||
|
||||
GIMP_DRAWABLE_GET_CLASS (drawable)->apply_region (drawable,& src2PR,
|
||||
push_undo, undo_desc,
|
||||
opacity, mode,
|
||||
src1_tiles, destPR,
|
||||
x, y);
|
||||
}
|
||||
|
||||
void
|
||||
gimp_drawable_apply_region (GimpDrawable *drawable,
|
||||
PixelRegion *src2PR,
|
||||
|
||||
@ -140,6 +140,17 @@ void gimp_drawable_convert_type (GimpDrawable *drawable,
|
||||
GimpImageBaseType new_base_type,
|
||||
gboolean push_undo);
|
||||
|
||||
void gimp_drawable_apply_buffer (GimpDrawable *drawable,
|
||||
GeglBuffer *buffer,
|
||||
const GeglRectangle *buffer_rect,
|
||||
gboolean push_undo,
|
||||
const gchar *undo_desc,
|
||||
gdouble opacity,
|
||||
GimpLayerModeEffects mode,
|
||||
TileManager *src1_tiles,
|
||||
PixelRegion *destPR,
|
||||
gint x,
|
||||
gint y);
|
||||
void gimp_drawable_apply_region (GimpDrawable *drawable,
|
||||
PixelRegion *src2PR,
|
||||
gboolean push_undo,
|
||||
|
||||
Reference in New Issue
Block a user