Commit dbc88137 authored by Michael Natterer's avatar Michael Natterer 😴

app: add gimp_drawable_apply_buffer() and port edit, bucket fill, stroke

parent 6534ebb8
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment