mirror of https://github.com/GNOME/gimp.git
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.
This commit is contained in:
parent
19fc49a972
commit
d146cc40ea
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,15 +134,8 @@ 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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue