libgimp: add GEGL branch to gimp_layer_new_from_surface()

This commit is contained in:
Michael Natterer 2012-05-03 04:13:39 +02:00
parent 00b3a9c745
commit ffa1546853
1 changed files with 98 additions and 80 deletions

View File

@ -22,8 +22,9 @@
#include <string.h>
#define GIMP_DISABLE_DEPRECATION_WARNINGS
#include "gimp.h"
#include "gimplayer.h"
/**
@ -243,18 +244,11 @@ gimp_layer_new_from_surface (gint32 image_ID,
gdouble progress_start,
gdouble progress_end)
{
GimpDrawable *drawable;
GimpPixelRgn rgn;
const guchar *pixels;
gpointer pr;
gint32 layer;
cairo_format_t format;
gint width;
gint height;
gint rowstride;
gdouble range = progress_end - progress_start;
guint count = 0;
guint done = 0;
gint32 layer;
gint width;
gint height;
cairo_format_t format;
gdouble range = progress_end - progress_start;
g_return_val_if_fail (surface != NULL, -1);
g_return_val_if_fail (cairo_surface_get_type (surface) ==
@ -285,82 +279,106 @@ gimp_layer_new_from_surface (gint32 image_ID,
if (layer == -1)
return -1;
drawable = gimp_drawable_get (layer);
gimp_pixel_rgn_init (&rgn, drawable, 0, 0, width, height, TRUE, FALSE);
rowstride = cairo_image_surface_get_stride (surface);
pixels = cairo_image_surface_get_data (surface);
for (pr = gimp_pixel_rgns_register (1, &rgn);
pr != NULL;
pr = gimp_pixel_rgns_process (pr))
if (gimp_plugin_precision_enabled ())
{
const guchar *src = pixels + rgn.y * rowstride + rgn.x * 4;
guchar *dest = rgn.data;
gint y;
GeglBuffer *src_buffer;
GeglBuffer *dest_buffer;
switch (format)
{
case CAIRO_FORMAT_RGB24:
for (y = 0; y < rgn.h; y++)
{
const guchar *s = src;
guchar *d = dest;
gint w = rgn.w;
src_buffer = gimp_cairo_surface_create_buffer (surface);
dest_buffer = gimp_drawable_get_buffer (layer);
while (w--)
{
GIMP_CAIRO_RGB24_GET_PIXEL (s, d[0], d[1], d[2]);
gegl_buffer_copy (src_buffer, NULL, dest_buffer, NULL);
s += 4;
d += 3;
}
src += rowstride;
dest += rgn.rowstride;
}
break;
case CAIRO_FORMAT_ARGB32:
for (y = 0; y < rgn.h; y++)
{
const guchar *s = src;
guchar *d = dest;
gint w = rgn.w;
while (w--)
{
GIMP_CAIRO_ARGB32_GET_PIXEL (s, d[0], d[1], d[2], d[3]);
s += 4;
d += 4;
}
src += rowstride;
dest += rgn.rowstride;
}
break;
default:
break;
}
if (range > 0.0)
{
done += rgn.h * rgn.w;
if (count++ % 32 == 0)
gimp_progress_update (progress_start +
(gdouble) done / (width * height) * range);
}
g_object_unref (src_buffer);
g_object_unref (dest_buffer);
}
else
{
GimpDrawable *drawable;
GimpPixelRgn rgn;
const guchar *pixels;
gpointer pr;
gint rowstride;
guint count = 0;
guint done = 0;
drawable = gimp_drawable_get (layer);
gimp_pixel_rgn_init (&rgn, drawable, 0, 0, width, height, TRUE, FALSE);
rowstride = cairo_image_surface_get_stride (surface);
pixels = cairo_image_surface_get_data (surface);
for (pr = gimp_pixel_rgns_register (1, &rgn);
pr != NULL;
pr = gimp_pixel_rgns_process (pr))
{
const guchar *src = pixels + rgn.y * rowstride + rgn.x * 4;
guchar *dest = rgn.data;
gint y;
switch (format)
{
case CAIRO_FORMAT_RGB24:
for (y = 0; y < rgn.h; y++)
{
const guchar *s = src;
guchar *d = dest;
gint w = rgn.w;
while (w--)
{
GIMP_CAIRO_RGB24_GET_PIXEL (s, d[0], d[1], d[2]);
s += 4;
d += 3;
}
src += rowstride;
dest += rgn.rowstride;
}
break;
case CAIRO_FORMAT_ARGB32:
for (y = 0; y < rgn.h; y++)
{
const guchar *s = src;
guchar *d = dest;
gint w = rgn.w;
while (w--)
{
GIMP_CAIRO_ARGB32_GET_PIXEL (s, d[0], d[1], d[2], d[3]);
s += 4;
d += 4;
}
src += rowstride;
dest += rgn.rowstride;
}
break;
default:
break;
}
if (range > 0.0)
{
done += rgn.h * rgn.w;
if (count++ % 32 == 0)
gimp_progress_update (progress_start +
(gdouble) done / (width * height) * range);
}
}
gimp_drawable_detach (drawable);
}
if (range > 0.0)
gimp_progress_update (progress_end);
gimp_drawable_detach (drawable);
return layer;
}