app: factor file_gbr_drawable_to_brush() out of file_gbr_image_to_brush()
(cherry picked from commit 861106a0b3
)
This commit is contained in:
@ -254,6 +254,113 @@ file_gbr_brush_to_layer (GimpImage *image,
|
|||||||
return layer;
|
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 */
|
/* private functions */
|
||||||
|
|
||||||
@ -301,100 +408,10 @@ file_gbr_image_to_brush (GimpImage *image,
|
|||||||
const gchar *name,
|
const gchar *name,
|
||||||
gdouble spacing)
|
gdouble spacing)
|
||||||
{
|
{
|
||||||
GimpBrush *brush;
|
gint width = gimp_item_get_width (GIMP_ITEM (drawable));
|
||||||
GeglBuffer *buffer;
|
gint height = gimp_item_get_height (GIMP_ITEM (drawable));
|
||||||
GimpTempBuf *mask;
|
|
||||||
GimpTempBuf *pixmap = NULL;
|
|
||||||
gint width;
|
|
||||||
gint height;
|
|
||||||
|
|
||||||
buffer = gimp_drawable_get_buffer (drawable);
|
return file_gbr_drawable_to_brush (drawable,
|
||||||
width = gimp_item_get_width (GIMP_ITEM (drawable));
|
GEGL_RECTANGLE (0, 0, width, height),
|
||||||
height = gimp_item_get_height (GIMP_ITEM (drawable));
|
name, spacing);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
@ -19,22 +19,26 @@
|
|||||||
#define __FILE_DATA_GBR_H__
|
#define __FILE_DATA_GBR_H__
|
||||||
|
|
||||||
|
|
||||||
GimpValueArray * file_gbr_load_invoker (GimpProcedure *procedure,
|
GimpValueArray * file_gbr_load_invoker (GimpProcedure *procedure,
|
||||||
Gimp *gimp,
|
Gimp *gimp,
|
||||||
GimpContext *context,
|
GimpContext *context,
|
||||||
GimpProgress *progress,
|
GimpProgress *progress,
|
||||||
const GimpValueArray *args,
|
const GimpValueArray *args,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
GimpValueArray * file_gbr_save_invoker (GimpProcedure *procedure,
|
GimpValueArray * file_gbr_save_invoker (GimpProcedure *procedure,
|
||||||
Gimp *gimp,
|
Gimp *gimp,
|
||||||
GimpContext *context,
|
GimpContext *context,
|
||||||
GimpProgress *progress,
|
GimpProgress *progress,
|
||||||
const GimpValueArray *args,
|
const GimpValueArray *args,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
GimpLayer * file_gbr_brush_to_layer (GimpImage *image,
|
GimpLayer * file_gbr_brush_to_layer (GimpImage *image,
|
||||||
GimpBrush *brush);
|
GimpBrush *brush);
|
||||||
|
GimpBrush * file_gbr_drawable_to_brush (GimpDrawable *drawable,
|
||||||
|
const GeglRectangle *rect,
|
||||||
|
const gchar *name,
|
||||||
|
gdouble spacing);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __FILE_DATA_GBR_H__ */
|
#endif /* __FILE_DATA_GBR_H__ */
|
||||||
|
Reference in New Issue
Block a user