app: use one gegl_buffer_copy() with the right Babl format to copy to the layer
instead of looping manually to extract pixels from the cairo surface.
This commit is contained in:
@ -651,19 +651,13 @@ static void
|
|||||||
gimp_text_layer_render_layout (GimpTextLayer *layer,
|
gimp_text_layer_render_layout (GimpTextLayer *layer,
|
||||||
GimpTextLayout *layout)
|
GimpTextLayout *layout)
|
||||||
{
|
{
|
||||||
GimpDrawable *drawable = GIMP_DRAWABLE (layer);
|
GimpDrawable *drawable = GIMP_DRAWABLE (layer);
|
||||||
GimpItem *item = GIMP_ITEM (layer);
|
GimpItem *item = GIMP_ITEM (layer);
|
||||||
GeglBuffer *buffer;
|
GeglBuffer *buffer;
|
||||||
const Babl *format;
|
cairo_t *cr;
|
||||||
const Babl *fish;
|
cairo_surface_t *surface;
|
||||||
GeglBufferIterator *iter;
|
gint width;
|
||||||
cairo_t *cr;
|
gint height;
|
||||||
cairo_surface_t *surface;
|
|
||||||
const guchar *data;
|
|
||||||
gint bytes;
|
|
||||||
gint rowstride;
|
|
||||||
gint width;
|
|
||||||
gint height;
|
|
||||||
|
|
||||||
g_return_if_fail (gimp_drawable_has_alpha (drawable));
|
g_return_if_fail (gimp_drawable_has_alpha (drawable));
|
||||||
|
|
||||||
@ -677,51 +671,19 @@ gimp_text_layer_render_layout (GimpTextLayer *layer,
|
|||||||
cairo_destroy (cr);
|
cairo_destroy (cr);
|
||||||
|
|
||||||
cairo_surface_flush (surface);
|
cairo_surface_flush (surface);
|
||||||
data = cairo_image_surface_get_data (surface);
|
|
||||||
rowstride = cairo_image_surface_get_stride (surface);
|
|
||||||
|
|
||||||
buffer = gimp_drawable_get_buffer (drawable);
|
buffer =
|
||||||
format = gimp_drawable_get_format (drawable);
|
gegl_buffer_linear_new_from_data (cairo_image_surface_get_data (surface),
|
||||||
fish = babl_fish (babl_format ("R'G'B'A u8"), format);
|
babl_format ("cairo-ARGB32"),
|
||||||
bytes = babl_format_get_bytes_per_pixel (format);
|
GIMP_GEGL_RECT (0, 0, width, height),
|
||||||
|
cairo_image_surface_get_stride (surface),
|
||||||
|
(GDestroyNotify) cairo_surface_destroy,
|
||||||
|
surface);
|
||||||
|
|
||||||
iter = gegl_buffer_iterator_new (buffer, NULL, 0, format,
|
gegl_buffer_copy (buffer, NULL,
|
||||||
GEGL_BUFFER_WRITE, GEGL_ABYSS_NONE);
|
gimp_drawable_get_buffer (drawable), NULL);
|
||||||
|
|
||||||
while (gegl_buffer_iterator_next (iter))
|
g_object_unref (buffer);
|
||||||
{
|
|
||||||
const guchar *src = data + iter->roi[0].y * rowstride + iter->roi[0].x * 4;
|
|
||||||
guchar *dest = iter->data[0];
|
|
||||||
gint rows = iter->roi[0].height;
|
|
||||||
|
|
||||||
while (rows--)
|
|
||||||
{
|
|
||||||
const guchar *s = src;
|
|
||||||
guchar *d = dest;
|
|
||||||
gint w = iter->roi[0].width;
|
|
||||||
|
|
||||||
while (w--)
|
|
||||||
{
|
|
||||||
guchar color[4];
|
|
||||||
|
|
||||||
GIMP_CAIRO_ARGB32_GET_PIXEL (s,
|
|
||||||
color[0],
|
|
||||||
color[1],
|
|
||||||
color[2],
|
|
||||||
color[3]);
|
|
||||||
|
|
||||||
babl_process (fish, color, d, 1);
|
|
||||||
|
|
||||||
s += 4;
|
|
||||||
d += bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
src += rowstride;
|
|
||||||
dest += iter->roi[0].width * bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_surface_destroy (surface);
|
|
||||||
|
|
||||||
gimp_drawable_update (drawable, 0, 0, width, height);
|
gimp_drawable_update (drawable, 0, 0, width, height);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user