app: port the entire GimpScanConvert API to GeglBuffer

This commit is contained in:
Michael Natterer 2012-03-20 23:34:11 +01:00
parent 113f01feb2
commit f67bcfa82b
6 changed files with 75 additions and 85 deletions

View File

@ -236,8 +236,9 @@ gimp_channel_select_scan_convert (GimpChannel *channel,
add_on = gimp_channel_new_mask (gimp_item_get_image (item),
gimp_item_get_width (item),
gimp_item_get_height (item));
gimp_scan_convert_render (scan_convert,
gimp_drawable_get_tiles (GIMP_DRAWABLE (add_on)),
gimp_drawable_get_write_buffer (GIMP_DRAWABLE (add_on)),
offset_x, offset_y, antialias);
if (feather)

View File

@ -284,18 +284,18 @@ 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;
TileManager *mask;
GeglBuffer *base_buffer;
GeglBuffer *mask_buffer;
GeglNode *apply_opacity;
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));
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;
/* must call gimp_channel_is_empty() instead of relying on
* gimp_item_mask_intersect() because the selection pretends to
@ -342,18 +342,19 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
gimp_stroke_options_get_dash_info (stroke_options));
}
/* fill a 1-bpp Tilemanager with black, this will describe the shape
/* fill a 1-bpp GeglBuffer with black, this will describe the shape
* of the stroke.
*/
mask = tile_manager_new (w, h, 1);
mask_buffer = gimp_tile_manager_create_buffer (mask, NULL, TRUE);
rect.width = w;
rect.height = h;
mask_buffer = gegl_buffer_new (&rect, babl_format ("Y u8"));
gegl_buffer_clear (mask_buffer, NULL);
/* render the stroke into it */
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
gimp_scan_convert_render (scan_convert, mask,
gimp_scan_convert_render (scan_convert, mask_buffer,
x + off_x, y + off_y,
gimp_fill_options_get_antialias (options));
@ -411,7 +412,6 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
gimp_context_get_paint_mode (context),
NULL, NULL, x, y);
tile_manager_unref (mask);
tile_manager_unref (base);
gimp_drawable_update (drawable, x, y, w, h);

View File

@ -28,8 +28,6 @@
#include "core-types.h"
#include "base/tile-manager.h"
#include "gegl/gimp-gegl-utils.h"
#include "gimpbezierdesc.h"
@ -330,35 +328,35 @@ gimp_scan_convert_stroke (GimpScanConvert *sc,
/**
* gimp_scan_convert_render:
* @sc: a #GimpScanConvert context
* @tile_manager: the #TileManager to render to
* @off_x: horizontal offset into the @tile_manager
* @off_y: vertical offset into the @tile_manager
* @antialias: whether to apply antialiasiing
* @sc: a #GimpScanConvert context
* @bufferr: the #GeglBuffer to render to
* @off_x: horizontal offset into the @buffer
* @off_y: vertical offset into the @buffer
* @antialias: whether to apply antialiasiing
*
* This is a wrapper around gimp_scan_convert_render_full() that replaces the
* content of the @tile_manager with a rendered form of the path passed in.
* content of the @buffer with a rendered form of the path passed in.
*
* You cannot add additional polygons after this command.
*/
void
gimp_scan_convert_render (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
gboolean antialias)
{
gimp_scan_convert_render_full (sc, tile_manager, off_x, off_y,
gimp_scan_convert_render_full (sc, buffer, off_x, off_y,
TRUE, antialias, 255);
}
/**
* gimp_scan_convert_render_value:
* @sc: a #GimpScanConvert context
* @tile_manager: the #TileManager to render to
* @off_x: horizontal offset into the @tile_manager
* @off_y: vertical offset into the @tile_manager
* @value: value to use for covered pixels
* @sc: a #GimpScanConvert context
* @buffer: the #GeglBuffer to render to
* @off_x: horizontal offset into the @buffer
* @off_y: vertical offset into the @buffer
* @value: value to use for covered pixels
*
* This is a wrapper around gimp_scan_convert_render_full() that
* doesn't do antialiasing but gives control over the value that
@ -369,93 +367,89 @@ gimp_scan_convert_render (GimpScanConvert *sc,
*/
void
gimp_scan_convert_render_value (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
guchar value)
{
gimp_scan_convert_render_full (sc, tile_manager, off_x, off_y,
gimp_scan_convert_render_full (sc, buffer, off_x, off_y,
TRUE, FALSE, value);
}
/**
* gimp_scan_convert_compose:
* @sc: a #GimpScanConvert context
* @tile_manager: the #TileManager to render to
* @off_x: horizontal offset into the @tile_manager
* @off_y: vertical offset into the @tile_manager
* @sc: a #GimpScanConvert context
* @buffer: the #GeglBuffer to render to
* @off_x: horizontal offset into the @buffer
* @off_y: vertical offset into the @buffer
*
* This is a wrapper around of gimp_scan_convert_render_full() that composes
* the (aliased) scan conversion on top of the content of the @tile_manager.
* the (aliased) scan conversion on top of the content of the @buffer.
*
* You cannot add additional polygons after this command.
*/
void
gimp_scan_convert_compose (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y)
{
gimp_scan_convert_render_full (sc, tile_manager, off_x, off_y,
gimp_scan_convert_render_full (sc, buffer, off_x, off_y,
FALSE, FALSE, 255);
}
/**
* gimp_scan_convert_compose_value:
* @sc: a #GimpScanConvert context
* @tile_manager: the #TileManager to render to
* @off_x: horizontal offset into the @tile_manager
* @off_y: vertical offset into the @tile_manager
* @value: value to use for covered pixels
* @sc: a #GimpScanConvert context
* @buffer: the #GeglBuffer to render to
* @off_x: horizontal offset into the @buffer
* @off_y: vertical offset into the @buffer
* @value: value to use for covered pixels
*
* This is a wrapper around gimp_scan_convert_render_full() that
* composes the (aliased) scan conversion with value @value on top of the
* content of the @tile_manager.
* content of the @buffer.
*
* You cannot add additional polygons after this command.
*/
void
gimp_scan_convert_compose_value (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
gint value)
{
gimp_scan_convert_render_full (sc, tile_manager, off_x, off_y,
gimp_scan_convert_render_full (sc, buffer, off_x, off_y,
FALSE, FALSE, value);
}
/**
* gimp_scan_convert_render_full:
* @sc: a #GimpScanConvert context
* @tiles: the #TileManager to render to
* @off_x: horizontal offset into the @tiles
* @off_y: vertical offset into the @tiles
* @replace: if true the original content of the @tiles gets
* destroyed
* @antialias: if true the rendering happens antialiased
* @value: value to use for covered pixels
* @sc: a #GimpScanConvert context
* @buffer: the #GeglBuffer to render to
* @off_x: horizontal offset into the @buffer
* @off_y: vertical offset into the @buffer
* @replace: if true the original content of the @buffer gets estroyed
* @antialias: if true the rendering happens antialiased
* @value: value to use for covered pixels
*
* This function renders the area described by the path to the @tiles,
* taking the offset @off_x and @off_y in the tilemanager into account.
* The rendering can happen antialiased and be rendered on top of existing
* content or replacing it completely. The @value specifies the opacity value
* to be used for the objects in the @sc.
*
* This function expects a tile manager of depth 1.
* This function renders the area described by the path to the
* @buffer, taking the offset @off_x and @off_y in the buffer into
* account. The rendering can happen antialiased and be rendered on
* top of existing content or replacing it completely. The @value
* specifies the opacity value to be used for the objects in the @sc.
*
* You cannot add additional polygons after this command.
*/
void
gimp_scan_convert_render_full (GimpScanConvert *sc,
TileManager *tiles,
GeglBuffer *buffer,
gint off_x,
gint off_y,
gboolean replace,
gboolean antialias,
guchar value)
{
GeglBuffer *buffer;
const Babl *format;
GeglBufferIterator *iter;
GeglRectangle *roi;
@ -467,13 +461,12 @@ gimp_scan_convert_render_full (GimpScanConvert *sc,
gint width, height;
g_return_if_fail (sc != NULL);
g_return_if_fail (tiles != NULL);
g_return_if_fail (tile_manager_bpp (tiles) == 1);
g_return_if_fail (GEGL_IS_BUFFER (buffer));
x = 0;
y = 0;
width = tile_manager_width (tiles);
height = tile_manager_height (tiles);
width = gegl_buffer_get_width (buffer);
height = gegl_buffer_get_height (buffer);
if (sc->clip && ! gimp_rectangle_intersect (x, y, width, height,
sc->clip_x, sc->clip_y,
@ -485,10 +478,8 @@ gimp_scan_convert_render_full (GimpScanConvert *sc,
path.data = (cairo_path_data_t *) sc->path_data->data;
path.num_data = sc->path_data->len;
buffer = gimp_tile_manager_create_buffer (tiles, NULL, TRUE);
format = gegl_buffer_get_format (buffer);
bpp = babl_format_get_bytes_per_pixel (format);
format = babl_format ("Y u8");
bpp = babl_format_get_bytes_per_pixel (format);
iter = gegl_buffer_iterator_new (buffer, NULL, format,
GEGL_BUFFER_WRITE);
@ -598,6 +589,4 @@ gimp_scan_convert_render_full (GimpScanConvert *sc,
}
}
}
g_object_unref (buffer);
}

View File

@ -43,7 +43,7 @@ void gimp_scan_convert_stroke (GimpScanConvert *sc,
gdouble dash_offset,
GArray *dash_info);
void gimp_scan_convert_render_full (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
gboolean replace,
@ -51,21 +51,21 @@ void gimp_scan_convert_render_full (GimpScanConvert *sc,
guchar value);
void gimp_scan_convert_render (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
gboolean antialias);
void gimp_scan_convert_render_value (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
guchar value);
void gimp_scan_convert_compose (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y);
void gimp_scan_convert_compose_value (GimpScanConvert *sc,
TileManager *tile_manager,
GeglBuffer *buffer,
gint off_x,
gint off_y,
gint value);

View File

@ -633,7 +633,7 @@ gimp_foreground_select_tool_select (GimpFreeSelectTool *free_sel,
"foreground-extraction", NULL);
gimp_scan_convert_render_value (scan_convert,
gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
gimp_drawable_get_write_buffer (GIMP_DRAWABLE (mask)),
0, 0, 128);
gimp_scan_convert_free (scan_convert);
@ -789,7 +789,7 @@ gimp_foreground_select_tool_stroke (GimpChannel *mask,
GIMP_JOIN_ROUND, GIMP_CAP_ROUND, 10.0,
0.0, NULL);
gimp_scan_convert_compose_value (scan_convert,
gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
gimp_drawable_get_write_buffer (GIMP_DRAWABLE (mask)),
0, 0, stroke->background ? 0 : 255);
gimp_scan_convert_free (scan_convert);
}

View File

@ -542,7 +542,7 @@ iscissors_convert (GimpIscissorsTool *iscissors,
gimp_image_get_width (image),
gimp_image_get_height (image));
gimp_scan_convert_render (sc,
gimp_drawable_get_tiles (GIMP_DRAWABLE (iscissors->mask)),
gimp_drawable_get_write_buffer (GIMP_DRAWABLE (iscissors->mask)),
0, 0, options->antialias);
gimp_scan_convert_free (sc);
}