[gimp] app: require a Babl for all buffers created on top of tiles
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: require a Babl for all buffers created on top of tiles
- Date: Wed, 2 May 2012 16:05:07 +0000 (UTC)
commit d146cc40ea15a64b69162d9d195d157a3a779060
Author: Michael Natterer <mitch gimp org>
Date: Sat Mar 17 21:21:36 2012 +0100
app: require a Babl for all buffers created on top of tiles
Fixes quite some introduced glitches with indexed mode because
the buffers use the right pixel format now.
app/core/gimp-edit.c | 13 ++++++++---
app/core/gimpchannel.c | 9 +++----
app/core/gimpdrawable-convert.c | 4 +-
app/core/gimpdrawable-offset.c | 4 ++-
app/core/gimpdrawable-operation.c | 5 +++-
app/core/gimpdrawable-stroke.c | 2 +-
app/core/gimpdrawable.c | 39 ++++++++++++++++++++++++++++++++--
app/core/gimpdrawable.h | 2 +
app/core/gimpimagemap.c | 14 +++++++++---
app/core/gimplayer.c | 13 +++++++----
app/core/gimpprojection-construct.c | 2 +-
app/core/gimpprojection.c | 6 ++--
app/gegl/gimp-gegl-utils.c | 34 +-----------------------------
app/gegl/gimp-gegl-utils.h | 8 +-----
14 files changed, 86 insertions(+), 69 deletions(-)
---
diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c
index 68a5bd9..040a3af 100644
--- a/app/core/gimp-edit.c
+++ b/app/core/gimp-edit.c
@@ -520,7 +520,7 @@ gimp_edit_extract (GimpImage *image,
GeglBuffer *temp;
GimpBuffer *buffer;
- temp = gimp_tile_manager_create_buffer (tiles, TRUE);
+ temp = gimp_tile_manager_create_buffer (tiles, NULL, TRUE);
tile_manager_unref (tiles);
buffer = gimp_buffer_new (temp, _("Global Buffer"),
@@ -549,6 +549,7 @@ gimp_edit_fill_internal (GimpImage *image,
gint x, y, width, height;
GimpImageType drawable_type;
gint tiles_bytes;
+ const Babl *format;
guchar col[MAX_CHANNELS];
TempBuf *pat_buf = NULL;
gboolean new_buf;
@@ -558,6 +559,7 @@ gimp_edit_fill_internal (GimpImage *image,
drawable_type = gimp_drawable_type (drawable);
tiles_bytes = gimp_drawable_bytes (drawable);
+ format = gimp_drawable_get_babl_format (drawable);
switch (fill_type)
{
@@ -588,7 +590,10 @@ gimp_edit_fill_internal (GimpImage *image,
if (! gimp_drawable_has_alpha (drawable) &&
(pat_buf->bytes == 2 || pat_buf->bytes == 4))
- tiles_bytes++;
+ {
+ tiles_bytes++;
+ format = gimp_drawable_get_babl_format_with_alpha (drawable);
+ }
}
break;
@@ -598,7 +603,7 @@ gimp_edit_fill_internal (GimpImage *image,
buf_tiles = tile_manager_new (width, height, tiles_bytes);
- dest_buffer = gimp_tile_manager_create_buffer (buf_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (buf_tiles, format, TRUE);
if (pat_buf)
{
@@ -609,7 +614,7 @@ gimp_edit_fill_internal (GimpImage *image,
rect.height = pat_buf->height;
src_buffer = gegl_buffer_linear_new_from_data (temp_buf_get_data (pat_buf),
- gimp_bpp_to_babl_format (tiles_bytes, TRUE),
+ format,
&rect,
rect.width * pat_buf->bytes,
NULL, NULL);
diff --git a/app/core/gimpchannel.c b/app/core/gimpchannel.c
index 3dc2d7e..d66429f 100644
--- a/app/core/gimpchannel.c
+++ b/app/core/gimpchannel.c
@@ -1660,9 +1660,9 @@ gimp_channel_new_from_alpha (GimpImage *image,
gimp_channel_clear (channel, NULL, FALSE);
dest_tiles = gimp_drawable_get_tiles (GIMP_DRAWABLE (channel));
- dest_buffer = gimp_tile_manager_create_buffer_with_format (dest_tiles,
- babl_format ("A u8"),
- TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (dest_tiles,
+ babl_format ("A u8"),
+ TRUE);
gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL,
dest_buffer, NULL);
@@ -1706,8 +1706,7 @@ gimp_channel_new_from_component (GimpImage *image,
channel = gimp_channel_new (image, width, height, name, color);
dest_tiles = gimp_drawable_get_tiles (GIMP_DRAWABLE (channel));
- dest_buffer = gimp_tile_manager_create_buffer_with_format (dest_tiles,
- format, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (dest_tiles, format, TRUE);
gegl_buffer_copy (src_buffer, NULL, dest_buffer, NULL);
diff --git a/app/core/gimpdrawable-convert.c b/app/core/gimpdrawable-convert.c
index 96a7e7e..babdac6 100644
--- a/app/core/gimpdrawable-convert.c
+++ b/app/core/gimpdrawable-convert.c
@@ -101,7 +101,7 @@ gimp_drawable_convert_tiles_rgb (GimpDrawable *drawable,
g_return_if_fail (tile_manager_bpp (new_tiles) == (has_alpha ? 4 : 3));
- dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles, NULL, TRUE);
gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL,
dest_buffer, NULL);
@@ -124,7 +124,7 @@ gimp_drawable_convert_tiles_grayscale (GimpDrawable *drawable,
g_return_if_fail (tile_manager_bpp (new_tiles) == (has_alpha ? 2 : 1));
- dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles, NULL, TRUE);
gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL,
dest_buffer, NULL);
diff --git a/app/core/gimpdrawable-offset.c b/app/core/gimpdrawable-offset.c
index 19ff529..c8cc30d 100644
--- a/app/core/gimpdrawable-offset.c
+++ b/app/core/gimpdrawable-offset.c
@@ -89,7 +89,9 @@ gimp_drawable_offset (GimpDrawable *drawable,
new_tiles = tile_manager_new (width, height, gimp_drawable_bytes (drawable));
src_buffer = gimp_drawable_get_read_buffer (drawable);
- dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles,
+ gimp_drawable_get_babl_format (drawable),
+ TRUE);
if (! wrap_around)
{
diff --git a/app/core/gimpdrawable-operation.c b/app/core/gimpdrawable-operation.c
index c26c2f9..4d4a996 100644
--- a/app/core/gimpdrawable-operation.c
+++ b/app/core/gimpdrawable-operation.c
@@ -63,6 +63,7 @@ gimp_drawable_apply_operation (GimpDrawable *drawable,
dest_buffer =
gimp_tile_manager_create_buffer (gimp_drawable_get_shadow_tiles (drawable),
+ gimp_drawable_get_babl_format (drawable),
TRUE);
gimp_apply_operation (gimp_drawable_get_read_buffer (drawable),
@@ -149,7 +150,9 @@ gimp_drawable_apply_operation_to_tiles (GimpDrawable *drawable,
g_return_if_fail (GEGL_IS_NODE (operation));
g_return_if_fail (dest_tiles != NULL);
- dest_buffer = gimp_tile_manager_create_buffer (dest_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (dest_tiles,
+ gimp_drawable_get_babl_format (drawable),
+ TRUE);
gimp_drawable_apply_operation_to_buffer (drawable,
progress,
diff --git a/app/core/gimpdrawable-stroke.c b/app/core/gimpdrawable-stroke.c
index 25cc9d1..a63330e 100644
--- a/app/core/gimpdrawable-stroke.c
+++ b/app/core/gimpdrawable-stroke.c
@@ -346,7 +346,7 @@ gimp_drawable_stroke_scan_convert (GimpDrawable *drawable,
*/
mask = tile_manager_new (w, h, 1);
- tmp_buffer = gimp_tile_manager_create_buffer (mask, TRUE);
+ tmp_buffer = gimp_tile_manager_create_buffer (mask, NULL, TRUE);
gegl_buffer_clear (tmp_buffer, NULL);
g_object_unref (tmp_buffer);
diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c
index 5e249b0..e9acf46 100644
--- a/app/core/gimpdrawable.c
+++ b/app/core/gimpdrawable.c
@@ -576,7 +576,9 @@ gimp_drawable_resize (GimpItem *item,
new_tiles = tile_manager_new (new_width, new_height,
gimp_drawable_bytes (drawable));
- dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles,
+ gimp_drawable_get_babl_format (drawable),
+ TRUE);
if (copy_width != new_width ||
copy_height != new_height)
@@ -924,7 +926,9 @@ gimp_drawable_real_push_undo (GimpDrawable *drawable,
tiles = tile_manager_new (width, height, gimp_drawable_bytes (drawable));
- dest_buffer = gimp_tile_manager_create_buffer (tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (tiles,
+ gimp_drawable_get_babl_format (drawable),
+ TRUE);
src_rect.x = x;
src_rect.y = y;
@@ -1503,7 +1507,7 @@ gimp_drawable_create_buffer (GimpDrawable *drawable,
TileManager *tiles = gimp_drawable_get_tiles (drawable);
const Babl *format = gimp_drawable_get_babl_format (drawable);
- return gimp_tile_manager_create_buffer_with_format (tiles, format, write);
+ return gimp_tile_manager_create_buffer (tiles, format, write);
}
GeglBuffer *
@@ -1877,6 +1881,35 @@ gimp_drawable_get_babl_format (const GimpDrawable *drawable)
return NULL;
}
+const Babl *
+gimp_drawable_get_babl_format_with_alpha (const GimpDrawable *drawable)
+{
+ GimpImageType type;
+
+ g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
+
+ type = gimp_drawable_type (drawable);
+
+ switch (type)
+ {
+ case GIMP_RGB_IMAGE:
+ case GIMP_RGBA_IMAGE: return babl_format ("RGBA u8");
+ case GIMP_GRAY_IMAGE:
+ case GIMP_GRAYA_IMAGE: return babl_format ("YA u8");
+ case GIMP_INDEXED_IMAGE:
+ case GIMP_INDEXEDA_IMAGE:
+ {
+ GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
+
+ return gimp_image_colormap_get_rgba_format (image);
+ }
+ }
+
+ g_warn_if_reached ();
+
+ return NULL;
+}
+
gboolean
gimp_drawable_has_alpha (const GimpDrawable *drawable)
{
diff --git a/app/core/gimpdrawable.h b/app/core/gimpdrawable.h
index c99ff43..6fd6662 100644
--- a/app/core/gimpdrawable.h
+++ b/app/core/gimpdrawable.h
@@ -226,6 +226,8 @@ void gimp_drawable_fill_by_type (GimpDrawable *drawable,
GimpFillType fill_type);
const Babl * gimp_drawable_get_babl_format (const GimpDrawable *drawable);
+const Babl * gimp_drawable_get_babl_format_with_alpha
+ (const GimpDrawable *drawable);
gboolean gimp_drawable_has_alpha (const GimpDrawable *drawable);
GimpImageType gimp_drawable_type (const GimpDrawable *drawable);
GimpImageType gimp_drawable_type_with_alpha (const GimpDrawable *drawable);
diff --git a/app/core/gimpimagemap.c b/app/core/gimpimagemap.c
index 2295a15..ed8ad18 100644
--- a/app/core/gimpimagemap.c
+++ b/app/core/gimpimagemap.c
@@ -298,6 +298,7 @@ gimp_image_map_get_buffer (GimpPickable *pickable)
if (! image_map->undo_buffer)
image_map->undo_buffer =
gimp_tile_manager_create_buffer (image_map->undo_tiles,
+ gimp_drawable_get_babl_format (image_map->drawable),
FALSE);
return image_map->undo_buffer;
@@ -415,13 +416,14 @@ gimp_image_map_apply (GimpImageMap *image_map,
if (image_map->operation)
{
+ const Babl *format = gimp_drawable_get_babl_format (image_map->drawable);
GeglBuffer *input_buffer;
GeglBuffer *output_buffer;
input_buffer =
- gimp_tile_manager_create_buffer (image_map->undo_tiles, FALSE);
+ gimp_tile_manager_create_buffer (image_map->undo_tiles, format, FALSE);
output_buffer =
- gimp_tile_manager_create_buffer (gimp_drawable_get_shadow_tiles (image_map->drawable), TRUE);
+ gimp_tile_manager_create_buffer (gimp_drawable_get_shadow_tiles (image_map->drawable), format, TRUE);
if (! image_map->gegl)
{
@@ -710,7 +712,9 @@ gimp_image_map_update_undo_tiles (GimpImageMap *image_map,
/* Copy from the image to the new tiles */
src = gimp_drawable_get_read_buffer (image_map->drawable);
- dest = gimp_tile_manager_create_buffer (image_map->undo_tiles, TRUE);
+ dest = gimp_tile_manager_create_buffer (image_map->undo_tiles,
+ gimp_drawable_get_babl_format (image_map->drawable),
+ TRUE);
gegl_buffer_copy (src, rect, dest, &dest_rect);
@@ -870,7 +874,9 @@ gimp_image_map_data_written (GObject *operation,
GeglRectangle src_rect;
GeglRectangle dest_rect;
- src = gimp_tile_manager_create_buffer (image_map->undo_tiles, FALSE);
+ src = gimp_tile_manager_create_buffer (image_map->undo_tiles,
+ gimp_drawable_get_babl_format (image_map->drawable),
+ FALSE);
dest = gimp_drawable_get_write_buffer (image_map->drawable);
src_rect.x = extent->x - image_map->undo_offset_x;
diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c
index 64f54e8..5fc0168 100644
--- a/app/core/gimplayer.c
+++ b/app/core/gimplayer.c
@@ -1647,9 +1647,9 @@ gimp_layer_create_mask (const GimpLayer *layer,
GeglBuffer *dest_buffer;
dest_tiles = gimp_drawable_get_tiles (GIMP_DRAWABLE (mask));
- dest_buffer = gimp_tile_manager_create_buffer_with_format (dest_tiles,
- babl_format ("A u8"),
- TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (dest_tiles,
+ babl_format ("A u8"),
+ TRUE);
gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL,
dest_buffer, NULL);
@@ -1756,7 +1756,8 @@ gimp_layer_create_mask (const GimpLayer *layer,
gimp_drawable_convert_tiles_grayscale (drawable, copy_tiles);
- src_buffer = gimp_tile_manager_create_buffer (copy_tiles, FALSE);
+ src_buffer = gimp_tile_manager_create_buffer (copy_tiles, NULL,
+ FALSE);
}
else
{
@@ -2032,7 +2033,9 @@ gimp_layer_add_alpha (GimpLayer *layer)
gimp_item_get_height (item),
GIMP_IMAGE_TYPE_BYTES (new_type));
- dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles,
+ gimp_drawable_get_babl_format_with_alpha (GIMP_DRAWABLE (layer)),
+ TRUE);
gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL,
dest_buffer, NULL);
diff --git a/app/core/gimpprojection-construct.c b/app/core/gimpprojection-construct.c
index 27ed9d1..ead45d9 100644
--- a/app/core/gimpprojection-construct.c
+++ b/app/core/gimpprojection-construct.c
@@ -264,7 +264,7 @@ gimp_projection_initialize (GimpProjection *proj,
{
TileManager *tiles = gimp_pickable_get_tiles (GIMP_PICKABLE (proj));
- buffer = gimp_tile_manager_create_buffer (tiles, TRUE);
+ buffer = gimp_tile_manager_create_buffer (tiles, NULL, TRUE);
}
gegl_buffer_clear (buffer, &rect);
diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c
index 1f1863c..2de3323 100644
--- a/app/core/gimpprojection.c
+++ b/app/core/gimpprojection.c
@@ -355,7 +355,7 @@ gimp_projection_get_buffer (GimpPickable *pickable)
{
TileManager *tiles = gimp_projection_get_tiles (pickable);
- proj->buffer = gimp_tile_manager_create_buffer (tiles, FALSE);
+ proj->buffer = gimp_tile_manager_create_buffer (tiles, NULL, FALSE);
}
return proj->buffer;
@@ -442,7 +442,7 @@ gimp_projection_get_sink_node (GimpProjection *proj)
gegl_node_add_child (proj->graph, graph);
tiles = gimp_projection_get_tiles (GIMP_PICKABLE (proj));
- buffer = gimp_tile_manager_create_buffer (tiles, TRUE);
+ buffer = gimp_tile_manager_create_buffer (tiles, NULL, TRUE);
proj->sink_node =
gegl_node_new_child (proj->graph,
@@ -485,7 +485,7 @@ gimp_projection_get_tiles_at_level (GimpProjection *proj,
GeglBuffer *buffer;
tiles = tile_pyramid_get_tiles (proj->pyramid, 0, NULL);
- buffer = gimp_tile_manager_create_buffer (tiles, TRUE);
+ buffer = gimp_tile_manager_create_buffer (tiles, NULL, TRUE);
gegl_node_set (proj->sink_node,
"buffer", buffer,
diff --git a/app/gegl/gimp-gegl-utils.c b/app/gegl/gimp-gegl-utils.c
index 3b2b5d7..02f667d 100644
--- a/app/gegl/gimp-gegl-utils.c
+++ b/app/gegl/gimp-gegl-utils.c
@@ -78,31 +78,6 @@ gimp_bpp_to_babl_format (guint bpp,
return NULL;
}
-static gint
-gimp_babl_format_to_legacy_bpp (const Babl *format)
-{
- return babl_format_get_n_components (format);
-}
-
-TileManager *
-gimp_buffer_to_tiles (GeglBuffer *buffer)
-{
- TileManager *new_tiles;
- GeglBuffer *temp;
- gint width = gegl_buffer_get_width (buffer);
- gint height = gegl_buffer_get_height (buffer);
- const Babl *format = gegl_buffer_get_format (buffer);
-
- new_tiles = tile_manager_new (width, height,
- gimp_babl_format_to_legacy_bpp (format));
-
- temp = gimp_tile_manager_create_buffer (new_tiles, TRUE);
- gegl_buffer_copy (buffer, NULL, temp, NULL);
- g_object_unref (temp);
-
- return new_tiles;
-}
-
const gchar *
gimp_layer_mode_to_gegl_operation (GimpLayerModeEffects mode)
{
@@ -159,16 +134,9 @@ gimp_interpolation_to_gegl_filter (GimpInterpolationType interpolation)
GeglBuffer *
gimp_tile_manager_create_buffer (TileManager *tm,
+ const Babl *format,
gboolean write)
{
- return gimp_tile_manager_create_buffer_with_format (tm, NULL, write);
-}
-
-GeglBuffer *
-gimp_tile_manager_create_buffer_with_format (TileManager *tm,
- const Babl *format,
- gboolean write)
-{
GeglTileBackend *backend;
GeglBuffer *buffer;
diff --git a/app/gegl/gimp-gegl-utils.h b/app/gegl/gimp-gegl-utils.h
index cb5dd99..95be309 100644
--- a/app/gegl/gimp-gegl-utils.h
+++ b/app/gegl/gimp-gegl-utils.h
@@ -25,16 +25,12 @@
const Babl * gimp_bpp_to_babl_format (guint bpp,
gboolean linear) G_GNUC_CONST;
-TileManager * gimp_buffer_to_tiles (GeglBuffer *buffer);
-
const gchar * gimp_layer_mode_to_gegl_operation (GimpLayerModeEffects mode) G_GNUC_CONST;
const gchar * gimp_interpolation_to_gegl_filter (GimpInterpolationType interpolation) G_GNUC_CONST;
-GeglBuffer * gimp_tile_manager_create_buffer (TileManager *tm,
+GeglBuffer * gimp_tile_manager_create_buffer (TileManager *tm,
+ const Babl *format,
gboolean write);
-GeglBuffer * gimp_tile_manager_create_buffer_with_format (TileManager *tm,
- const Babl *format,
- gboolean write);
void gimp_gegl_buffer_refetch_tiles (GeglBuffer *buffer);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]