plug-ins: fix #3480 decompose extension needs to be .xcf

When decomposing, the plug-in sets the filename without changing the
extension. However, gimp_image_set_file requires the filename to be
an .xcf file.

To fix this we simplified `generate_filename` to always add an
.xcf extension.
While doing this we also fixed a critical that happened when no
filename was set (new image), by testing `gimp_image_get_file` for
being NULL first.
When no filename was set it also didn't use the type when
config_as_layers was set, this is also fixed.
This commit is contained in:
Jacob Boerema 2024-04-17 16:41:37 -04:00
parent 2af0218d23
commit 4aa3e7a475
1 changed files with 17 additions and 20 deletions

View File

@ -882,7 +882,8 @@ generate_filename (GimpImage *image,
guint channel)
{
/* Build a filename like <imagename>-<channel>.<extension> */
gchar *fname;
GFile *file;
gchar *fname = NULL;
gchar *filename;
gchar *extension;
gboolean config_as_layers;
@ -891,7 +892,9 @@ generate_filename (GimpImage *image,
"layers-mode", &config_as_layers,
NULL);
fname = g_file_get_path (gimp_image_get_file (image));
file = gimp_image_get_file (image);
if (file)
fname = g_file_get_path (file);
if (fname)
{
@ -907,29 +910,23 @@ generate_filename (GimpImage *image,
if (extension >= fname)
{
*(extension++) = '\0';
}
if (config_as_layers)
filename = g_strdup_printf ("%s-%s.%s", fname,
gettext (extract[colorspace].type),
extension);
else
filename = g_strdup_printf ("%s-%s.%s", fname,
gettext (extract[colorspace].component[channel].channel_name),
extension);
}
if (config_as_layers)
filename = g_strdup_printf ("%s-%s.xcf", fname,
gettext (extract[colorspace].type));
else
{
if (config_as_layers)
filename = g_strdup_printf ("%s-%s", fname,
gettext (extract[colorspace].type));
else
filename = g_strdup_printf ("%s-%s", fname,
gettext (extract[colorspace].component[channel].channel_name));
}
filename = g_strdup_printf ("%s-%s.xcf", fname,
gettext (extract[colorspace].component[channel].channel_name));
}
else
{
filename = g_strdup (gettext (extract[colorspace].component[channel].channel_name));
if (config_as_layers)
filename = g_strdup_printf ("%s.xcf",
gettext (extract[colorspace].type));
else
filename = g_strdup_printf ("%s.xcf",
gettext (extract[colorspace].component[channel].channel_name));
}
g_free (fname);