app, pdb: do not push undos on rasterizables when loading a XCF.

Fixing:

> GIMP-CRITICAL: gimp_image_undo_push_rasterizable: assertion 'gimp_item_is_attached (GIMP_ITEM (rasterizable))' failed

… when loading the XCF from #14131.
This commit is contained in:
Jehan 2025-10-23 01:11:32 +02:00
parent 75d9fc6d9a
commit 2edd6ccb95
9 changed files with 27 additions and 19 deletions

View file

@ -1137,7 +1137,7 @@ layers_rasterize_cmd_callback (GimpAction *action,
for (iter = layers; iter; iter = iter->next)
{
if (GIMP_IS_RASTERIZABLE (iter->data) && ! gimp_rasterizable_is_rasterized (iter->data))
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (iter->data));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (iter->data), TRUE);
}
gimp_image_undo_group_end (image);

View file

@ -86,11 +86,11 @@ gimp_rasterizable_default_init (GimpRasterizableInterface *iface)
* Rasterize @rasterizable.
**/
void
gimp_rasterizable_rasterize (GimpRasterizable *rasterizable)
gimp_rasterizable_rasterize (GimpRasterizable *rasterizable,
gboolean push_undo)
{
GimpRasterizablePrivate *private;
GimpImage *image;
gchar *undo_text;
g_return_if_fail (GIMP_IS_RASTERIZABLE (rasterizable));
g_return_if_fail (! gimp_rasterizable_is_rasterized (rasterizable));
@ -98,17 +98,24 @@ gimp_rasterizable_rasterize (GimpRasterizable *rasterizable)
private = GIMP_RASTERIZABLE_GET_PRIVATE (rasterizable);
image = gimp_item_get_image (GIMP_ITEM (rasterizable));
/* TRANSLATORS: the %s will be a type of item, i.e. "Text Layer". */
undo_text = g_strdup_printf (_("Rasterize %s"),
GIMP_VIEWABLE_GET_CLASS (rasterizable)->default_name);
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_PROPERTIES, undo_text);
if (push_undo)
{
gchar *undo_text;
gimp_image_undo_push_rasterizable (image, NULL, rasterizable);
/* TRANSLATORS: the %s will be a type of item, i.e. "Text Layer". */
undo_text = g_strdup_printf (_("Rasterize %s"),
GIMP_VIEWABLE_GET_CLASS (rasterizable)->default_name);
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_PROPERTIES, undo_text);
gimp_image_undo_push_rasterizable (image, NULL, rasterizable);
g_free (undo_text);
}
private->rasterized = TRUE;
g_signal_emit (rasterizable, gimp_rasterizable_signals[SET_RASTERIZED], 0, TRUE);
gimp_image_undo_group_end (image);
if (push_undo)
gimp_image_undo_group_end (image);
/* Triggers thumbnail update. */
gimp_drawable_update_all (GIMP_DRAWABLE (rasterizable));

View file

@ -36,7 +36,8 @@ struct _GimpRasterizableInterface
};
void gimp_rasterizable_rasterize (GimpRasterizable *rasterizable);
void gimp_rasterizable_rasterize (GimpRasterizable *rasterizable,
gboolean push_undo);
void gimp_rasterizable_restore (GimpRasterizable *rasterizable);
gboolean gimp_rasterizable_is_rasterized (GimpRasterizable *rasterizable);

View file

@ -329,7 +329,7 @@ gimp_vector_layer_set_buffer (GimpDrawable *drawable,
if (push_undo && ! is_rasterized)
{
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer), push_undo);
gimp_image_undo_group_end (image);
}
}
@ -358,7 +358,7 @@ gimp_vector_layer_push_undo (GimpDrawable *drawable,
if (! is_rasterized)
{
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer), TRUE);
gimp_image_undo_group_end (image);
}
}
@ -809,7 +809,7 @@ gimp_vector_layer_changed_options (GimpVectorLayer *layer)
GimpItem *item = GIMP_ITEM (layer);
if (layer->options && ! layer->options->path)
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer), TRUE);
else if (gimp_item_is_attached (item))
gimp_vector_layer_refresh (layer);
}

View file

@ -57,7 +57,7 @@ rasterizable_rasterize_invoker (GimpProcedure *procedure,
{
if (! gimp_rasterizable_is_rasterized (GIMP_RASTERIZABLE (item)))
{
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (item));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (item), TRUE);
}
else
{

View file

@ -170,5 +170,5 @@ gimp_text_layer_set_xcf_flags (GimpTextLayer *text_layer,
(flags & TEXT_LAYER_XCF_DONT_AUTO_RENAME) == 0);
if ((flags & TEXT_LAYER_XCF_MODIFIED) != 0)
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (text_layer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (text_layer), FALSE);
}

View file

@ -348,7 +348,7 @@ gimp_text_layer_set_buffer (GimpDrawable *drawable,
if (push_undo && ! is_rasterized)
{
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer), push_undo);
gimp_image_undo_group_end (image);
}
}
@ -377,7 +377,7 @@ gimp_text_layer_push_undo (GimpDrawable *drawable,
if (! is_rasterized)
{
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (layer), TRUE);
gimp_image_undo_group_end (image);
}
}

View file

@ -1024,7 +1024,7 @@ xcf_load_image (Gimp *gimp,
g_object_unref (options);
if (vdata->modified)
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (vlayer));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (vlayer), FALSE);
if (selected)
{

View file

@ -43,7 +43,7 @@ HELP
{
if (! gimp_rasterizable_is_rasterized (GIMP_RASTERIZABLE (item)))
{
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (item));
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (item), TRUE);
}
else
{