[gimp] plug-ins: improve/fix metadata handling in file-exr
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: improve/fix metadata handling in file-exr
- Date: Tue, 25 Jun 2019 15:58:21 +0000 (UTC)
commit e2bacf918ca4ac6e6c9ea3cf065f428535e7573e
Author: Michael Natterer <mitch gimp org>
Date: Tue Jun 25 17:55:49 2019 +0200
plug-ins: improve/fix metadata handling in file-exr
Use gimp_image_metadata_load_finish() and pass the right flags
depending on whether comment and profile were loaded. Also, set the
profile before creating the layer so its space is correct
automatically.
plug-ins/file-exr/file-exr.c | 99 +++++++++++++++++---------------------------
1 file changed, 39 insertions(+), 60 deletions(-)
---
diff --git a/plug-ins/file-exr/file-exr.c b/plug-ins/file-exr/file-exr.c
index 895d7e9d78..c99266f701 100644
--- a/plug-ins/file-exr/file-exr.c
+++ b/plug-ins/file-exr/file-exr.c
@@ -173,15 +173,13 @@ load_image (const gchar *filename,
gchar *pixels = NULL;
gint begin;
gint32 success = FALSE;
- gchar *comment;
- GimpMetadata *metadata;
- gboolean have_metadata = FALSE;
+ gchar *comment = NULL;
+ GimpColorProfile *profile = NULL;
guchar *exif_data;
guint exif_size;
guchar *xmp_data;
guint xmp_size;
-
gimp_progress_init_printf (_("Opening '%s'"),
gimp_filename_to_utf8 (filename));
@@ -255,6 +253,17 @@ load_image (const gchar *filename,
gimp_image_set_filename (image, filename);
+ /* try to load an icc profile, it will be generated on the fly if
+ * chromaticities are given
+ */
+ if (image_type == GIMP_RGB)
+ {
+ profile = exr_loader_get_profile (loader);
+
+ if (profile)
+ gimp_image_set_color_profile (image, profile);
+ }
+
layer = gimp_layer_new (image, _("Background"), width, height,
layer_type, 100,
gimp_image_get_default_new_layer_mode (image));
@@ -298,21 +307,6 @@ load_image (const gchar *filename,
gimp_progress_update ((gdouble) begin / (gdouble) height);
}
- /* try to load an icc profile, it will be generated on the fly if
- * chromaticities are given
- */
- if (image_type == GIMP_RGB)
- {
- GimpColorProfile *profile;
-
- profile = exr_loader_get_profile (loader);
- if (profile)
- {
- gimp_image_set_color_profile (image, profile);
- g_object_unref (profile);
- }
- }
-
/* try to read the file comment */
comment = exr_loader_get_comment (loader);
if (comment)
@@ -326,65 +320,50 @@ load_image (const gchar *filename,
comment);
gimp_image_attach_parasite (image, parasite);
gimp_parasite_free (parasite);
-
- g_free (comment);
}
- metadata = gimp_image_get_metadata (image);
-
- if (metadata)
- g_object_ref (metadata);
- else
- metadata = gimp_metadata_new ();
-
- /* check if the image contains Exif data and read it */
+ /* check if the image contains Exif or Xmp data and read it */
exif_data = exr_loader_get_exif (loader, &exif_size);
- if (exif_data)
+ xmp_data = exr_loader_get_xmp (loader, &xmp_size);
+
+ if (exif_data || xmp_data)
{
- if (gimp_metadata_set_from_exif (metadata,
- exif_data,
- exif_size,
- NULL))
+ GimpMetadata *metadata = gimp_metadata_new ();
+ GimpMetadataLoadFlags flags = GIMP_METADATA_LOAD_ALL;
+
+ if (exif_data)
{
- have_metadata = TRUE;
+ gimp_metadata_set_from_exif (metadata, exif_data, exif_size, NULL);
+ g_free (exif_data);
}
- g_free (exif_data);
- }
-
- /* try to read the Xmp data */
- xmp_data = exr_loader_get_xmp (loader, &xmp_size);
- if (xmp_data)
- {
- if (gimp_metadata_set_from_xmp (metadata,
- xmp_data,
- xmp_size,
- NULL))
+ if (xmp_data)
{
- have_metadata = TRUE;
+ gimp_metadata_set_from_xmp (metadata, xmp_data, xmp_size, NULL);
+ g_free (xmp_data);
}
- g_free (xmp_data);
- }
+ if (comment)
+ flags &= ~GIMP_METADATA_LOAD_COMMENT;
- if (have_metadata)
- gimp_image_set_metadata (image, metadata);
+ if (profile)
+ flags &= ~GIMP_METADATA_LOAD_COLORSPACE;
- g_object_unref (metadata);
+ gimp_image_metadata_load_finish (image, "image/exr",
+ metadata, flags, interactive);
+ g_object_unref (metadata);
+ }
gimp_progress_update (1.0);
success = TRUE;
out:
- if (buffer)
- g_object_unref (buffer);
-
- if (pixels)
- g_free (pixels);
-
- if (loader)
- exr_loader_unref (loader);
+ g_clear_object (&profile);
+ g_clear_object (&buffer);
+ g_clear_pointer (&pixels, g_free);
+ g_clear_pointer (&comment, g_free);
+ g_clear_pointer (&loader, exr_loader_unref);
if (success)
return image;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]