[gimp] plug-ins: improve/fix metadata handling in file-exr



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]