app: let Babl handle all color conversion in gimp_edit_fill_internal()

also for indexed, thanks to the new palette format.
This commit is contained in:
Michael Natterer
2012-03-17 21:39:47 +01:00
parent d146cc40ea
commit 733a98d33b

View File

@ -547,54 +547,40 @@ gimp_edit_fill_internal (GimpImage *image,
GeglBuffer *dest_buffer; GeglBuffer *dest_buffer;
PixelRegion bufPR; PixelRegion bufPR;
gint x, y, width, height; gint x, y, width, height;
GimpImageType drawable_type;
gint tiles_bytes; gint tiles_bytes;
const Babl *format; const Babl *format;
guchar col[MAX_CHANNELS]; GimpRGB color;
TempBuf *pat_buf = NULL; GimpPattern *pattern = NULL;
gboolean new_buf;
if (! gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height)) if (! gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height))
return TRUE; /* nothing to do, but the fill succeded */ return TRUE; /* nothing to do, but the fill succeded */
drawable_type = gimp_drawable_type (drawable);
tiles_bytes = gimp_drawable_bytes (drawable); tiles_bytes = gimp_drawable_bytes (drawable);
format = gimp_drawable_get_babl_format (drawable); format = gimp_drawable_get_babl_format (drawable);
switch (fill_type) switch (fill_type)
{ {
case GIMP_FOREGROUND_FILL: case GIMP_FOREGROUND_FILL:
gimp_image_get_foreground (image, context, drawable_type, col); gimp_context_get_foreground (context, &color);
break; break;
case GIMP_BACKGROUND_FILL: case GIMP_BACKGROUND_FILL:
case GIMP_TRANSPARENT_FILL: case GIMP_TRANSPARENT_FILL:
gimp_image_get_background (image, context, drawable_type, col); gimp_context_get_background (context, &color);
break; break;
case GIMP_WHITE_FILL: case GIMP_WHITE_FILL:
{ gimp_rgb_set (&color, 1.0, 1.0, 1.0);
GimpRGB white;
gimp_rgb_set (&white, 1.0, 1.0, 1.0);
gimp_image_transform_rgb (image, drawable_type, &white, col);
}
break; break;
case GIMP_PATTERN_FILL: case GIMP_PATTERN_FILL:
{ pattern = gimp_context_get_pattern (context);
GimpPattern *pattern = gimp_context_get_pattern (context);
pat_buf = gimp_image_transform_temp_buf (image, drawable_type,
pattern->mask, &new_buf);
if (! gimp_drawable_has_alpha (drawable) && if (! gimp_drawable_has_alpha (drawable) &&
(pat_buf->bytes == 2 || pat_buf->bytes == 4)) (pattern->mask->bytes == 2 || pattern->mask->bytes == 4))
{ {
tiles_bytes++; tiles_bytes++;
format = gimp_drawable_get_babl_format_with_alpha (drawable); format = gimp_drawable_get_babl_format_with_alpha (drawable);
} }
}
break; break;
case GIMP_NO_FILL: case GIMP_NO_FILL:
@ -605,40 +591,42 @@ gimp_edit_fill_internal (GimpImage *image,
dest_buffer = gimp_tile_manager_create_buffer (buf_tiles, format, TRUE); dest_buffer = gimp_tile_manager_create_buffer (buf_tiles, format, TRUE);
if (pat_buf) if (pattern)
{ {
GeglBuffer *src_buffer; GeglBuffer *src_buffer;
GeglRectangle rect = { 0, }; GeglRectangle rect = { 0, };
gint pat_bytes;
rect.width = pat_buf->width; rect.width = pattern->mask->width;
rect.height = pat_buf->height; rect.height = pattern->mask->height;
src_buffer = gegl_buffer_linear_new_from_data (temp_buf_get_data (pat_buf), pat_bytes = pattern->mask->bytes;
format,
src_buffer =
gegl_buffer_linear_new_from_data (temp_buf_get_data (pattern->mask),
gimp_bpp_to_babl_format (pat_bytes,
TRUE),
&rect, &rect,
rect.width * pat_buf->bytes, rect.width * pat_bytes,
NULL, NULL); NULL, NULL);
gegl_buffer_set_pattern (dest_buffer, NULL, src_buffer, 0, 0); gegl_buffer_set_pattern (dest_buffer, NULL, src_buffer, 0, 0);
g_object_unref (src_buffer); g_object_unref (src_buffer);
if (new_buf)
temp_buf_free (pat_buf);
} }
else else
{ {
GeglColor *color; GeglColor *gegl_color;
if (gimp_drawable_has_alpha (drawable)) if (gimp_drawable_has_alpha (drawable))
col[gimp_drawable_bytes (drawable) - 1] = OPAQUE_OPACITY; gimp_rgb_set_alpha (&color, 1.0);
color = gegl_color_new (NULL); gegl_color = gegl_color_new (NULL);
gegl_color_set_pixel (color, gimp_drawable_get_babl_format (drawable), col); gimp_gegl_color_set_rgba (gegl_color, &color);
gegl_buffer_set_color (dest_buffer, NULL, color); gegl_buffer_set_color (dest_buffer, NULL, gegl_color);
g_object_unref (color); g_object_unref (gegl_color);
} }
g_object_unref (dest_buffer); g_object_unref (dest_buffer);