mirror of https://github.com/GNOME/gimp.git
app: factor file_gbr_drawable_to_brush() out of file_gbr_image_to_brush()
This commit is contained in:
parent
e742b4a95b
commit
861106a0b3
|
@ -254,6 +254,113 @@ file_gbr_brush_to_layer (GimpImage *image,
|
|||
return layer;
|
||||
}
|
||||
|
||||
GimpBrush *
|
||||
file_gbr_drawable_to_brush (GimpDrawable *drawable,
|
||||
const GeglRectangle *rect,
|
||||
const gchar *name,
|
||||
gdouble spacing)
|
||||
{
|
||||
GimpBrush *brush;
|
||||
GeglBuffer *buffer;
|
||||
GimpTempBuf *mask;
|
||||
GimpTempBuf *pixmap = NULL;
|
||||
gint width;
|
||||
gint height;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
|
||||
g_return_val_if_fail (rect != NULL, NULL);
|
||||
|
||||
buffer = gimp_drawable_get_buffer (drawable);
|
||||
width = rect->width;
|
||||
height = rect->height;
|
||||
|
||||
brush = g_object_new (GIMP_TYPE_BRUSH,
|
||||
"name", name,
|
||||
"mime-type", "image/x-gimp-gbr",
|
||||
"spacing", spacing,
|
||||
NULL);
|
||||
|
||||
mask = gimp_temp_buf_new (width, height, babl_format ("Y u8"));
|
||||
|
||||
if (gimp_drawable_is_gray (drawable))
|
||||
{
|
||||
guchar *m = gimp_temp_buf_get_data (mask);
|
||||
gint i;
|
||||
|
||||
if (gimp_drawable_has_alpha (drawable))
|
||||
{
|
||||
GeglBufferIterator *iter;
|
||||
GimpRGB white;
|
||||
|
||||
gimp_rgba_set_uchar (&white, 255, 255, 255, 255);
|
||||
|
||||
iter = gegl_buffer_iterator_new (buffer, rect, 0,
|
||||
babl_format ("Y'A u8"),
|
||||
GEGL_ACCESS_READ, GEGL_ABYSS_NONE,
|
||||
1);
|
||||
|
||||
while (gegl_buffer_iterator_next (iter))
|
||||
{
|
||||
guint8 *data = (guint8 *) iter->items[0].data;
|
||||
gint j;
|
||||
|
||||
for (j = 0; j < iter->length; j++)
|
||||
{
|
||||
GimpRGB gray;
|
||||
gint x, y;
|
||||
gint dest;
|
||||
|
||||
gimp_rgba_set_uchar (&gray,
|
||||
data[0], data[0], data[0],
|
||||
data[1]);
|
||||
|
||||
gimp_rgb_composite (&gray, &white,
|
||||
GIMP_RGB_COMPOSITE_BEHIND);
|
||||
|
||||
x = iter->items[0].roi.x + j % iter->items[0].roi.width;
|
||||
y = iter->items[0].roi.y + j / iter->items[0].roi.width;
|
||||
|
||||
dest = y * width + x;
|
||||
|
||||
gimp_rgba_get_uchar (&gray, &m[dest], NULL, NULL, NULL);
|
||||
|
||||
data += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_buffer_get (buffer, rect, 1.0,
|
||||
babl_format ("Y' u8"), m,
|
||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
||||
}
|
||||
|
||||
/* invert */
|
||||
for (i = 0; i < width * height; i++)
|
||||
m[i] = 255 - m[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
pixmap = gimp_temp_buf_new (width, height, babl_format ("R'G'B' u8"));
|
||||
|
||||
gegl_buffer_get (buffer, rect, 1.0,
|
||||
babl_format ("R'G'B' u8"),
|
||||
gimp_temp_buf_get_data (pixmap),
|
||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
||||
|
||||
gegl_buffer_get (buffer, rect, 1.0,
|
||||
babl_format ("A u8"),
|
||||
gimp_temp_buf_get_data (mask),
|
||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
||||
}
|
||||
|
||||
|
||||
brush->priv->mask = mask;
|
||||
brush->priv->pixmap = pixmap;
|
||||
|
||||
return brush;
|
||||
}
|
||||
|
||||
|
||||
/* private functions */
|
||||
|
||||
|
@ -301,100 +408,10 @@ file_gbr_image_to_brush (GimpImage *image,
|
|||
const gchar *name,
|
||||
gdouble spacing)
|
||||
{
|
||||
GimpBrush *brush;
|
||||
GeglBuffer *buffer;
|
||||
GimpTempBuf *mask;
|
||||
GimpTempBuf *pixmap = NULL;
|
||||
gint width;
|
||||
gint height;
|
||||
gint width = gimp_item_get_width (GIMP_ITEM (drawable));
|
||||
gint height = gimp_item_get_height (GIMP_ITEM (drawable));
|
||||
|
||||
buffer = gimp_drawable_get_buffer (drawable);
|
||||
width = gimp_item_get_width (GIMP_ITEM (drawable));
|
||||
height = gimp_item_get_height (GIMP_ITEM (drawable));
|
||||
|
||||
brush = g_object_new (GIMP_TYPE_BRUSH,
|
||||
"name", name,
|
||||
"mime-type", "image/x-gimp-gbr",
|
||||
"spacing", spacing,
|
||||
NULL);
|
||||
|
||||
mask = gimp_temp_buf_new (width, height, babl_format ("Y u8"));
|
||||
|
||||
if (gimp_drawable_is_gray (drawable))
|
||||
{
|
||||
guchar *m = gimp_temp_buf_get_data (mask);
|
||||
gint i;
|
||||
|
||||
if (gimp_drawable_has_alpha (drawable))
|
||||
{
|
||||
GeglBufferIterator *iter;
|
||||
GimpRGB white;
|
||||
|
||||
gimp_rgba_set_uchar (&white, 255, 255, 255, 255);
|
||||
|
||||
iter = gegl_buffer_iterator_new (buffer, NULL, 0,
|
||||
babl_format ("Y'A u8"),
|
||||
GEGL_ACCESS_READ, GEGL_ABYSS_NONE,
|
||||
1);
|
||||
|
||||
while (gegl_buffer_iterator_next (iter))
|
||||
{
|
||||
guint8 *data = (guint8 *) iter->items[0].data;
|
||||
gint j;
|
||||
|
||||
for (j = 0; j < iter->length; j++)
|
||||
{
|
||||
GimpRGB gray;
|
||||
gint x, y;
|
||||
gint dest;
|
||||
|
||||
gimp_rgba_set_uchar (&gray,
|
||||
data[0], data[0], data[0],
|
||||
data[1]);
|
||||
|
||||
gimp_rgb_composite (&gray, &white,
|
||||
GIMP_RGB_COMPOSITE_BEHIND);
|
||||
|
||||
x = iter->items[0].roi.x + j % iter->items[0].roi.width;
|
||||
y = iter->items[0].roi.y + j / iter->items[0].roi.width;
|
||||
|
||||
dest = y * width + x;
|
||||
|
||||
gimp_rgba_get_uchar (&gray, &m[dest], NULL, NULL, NULL);
|
||||
|
||||
data += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0,
|
||||
babl_format ("Y' u8"), m,
|
||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
||||
}
|
||||
|
||||
/* invert */
|
||||
for (i = 0; i < width * height; i++)
|
||||
m[i] = 255 - m[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
pixmap = gimp_temp_buf_new (width, height, babl_format ("R'G'B' u8"));
|
||||
|
||||
gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0,
|
||||
babl_format ("R'G'B' u8"),
|
||||
gimp_temp_buf_get_data (pixmap),
|
||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
||||
|
||||
gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0,
|
||||
babl_format ("A u8"),
|
||||
gimp_temp_buf_get_data (mask),
|
||||
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
|
||||
}
|
||||
|
||||
|
||||
brush->priv->mask = mask;
|
||||
brush->priv->pixmap = pixmap;
|
||||
|
||||
return brush;
|
||||
return file_gbr_drawable_to_brush (drawable,
|
||||
GEGL_RECTANGLE (0, 0, width, height),
|
||||
name, spacing);
|
||||
}
|
||||
|
|
|
@ -19,22 +19,26 @@
|
|||
#define __FILE_DATA_GBR_H__
|
||||
|
||||
|
||||
GimpValueArray * file_gbr_load_invoker (GimpProcedure *procedure,
|
||||
Gimp *gimp,
|
||||
GimpContext *context,
|
||||
GimpProgress *progress,
|
||||
const GimpValueArray *args,
|
||||
GError **error);
|
||||
GimpValueArray * file_gbr_load_invoker (GimpProcedure *procedure,
|
||||
Gimp *gimp,
|
||||
GimpContext *context,
|
||||
GimpProgress *progress,
|
||||
const GimpValueArray *args,
|
||||
GError **error);
|
||||
|
||||
GimpValueArray * file_gbr_save_invoker (GimpProcedure *procedure,
|
||||
Gimp *gimp,
|
||||
GimpContext *context,
|
||||
GimpProgress *progress,
|
||||
const GimpValueArray *args,
|
||||
GError **error);
|
||||
GimpValueArray * file_gbr_save_invoker (GimpProcedure *procedure,
|
||||
Gimp *gimp,
|
||||
GimpContext *context,
|
||||
GimpProgress *progress,
|
||||
const GimpValueArray *args,
|
||||
GError **error);
|
||||
|
||||
GimpLayer * file_gbr_brush_to_layer (GimpImage *image,
|
||||
GimpBrush *brush);
|
||||
GimpLayer * file_gbr_brush_to_layer (GimpImage *image,
|
||||
GimpBrush *brush);
|
||||
GimpBrush * file_gbr_drawable_to_brush (GimpDrawable *drawable,
|
||||
const GeglRectangle *rect,
|
||||
const gchar *name,
|
||||
gdouble spacing);
|
||||
|
||||
|
||||
#endif /* __FILE_DATA_GBR_H__ */
|
||||
|
|
Loading…
Reference in New Issue