plug-ins: Read Xmp data from EXR files

This commit needs review as it uses an ugly hack to make
gimp_metadata_set_from_xmp() do what it wants.
This commit is contained in:
Tobias Ellinghaus 2016-04-22 17:01:58 +02:00
parent e81cef7c03
commit 4e144fea69
No known key found for this signature in database
GPG Key ID: 98D42E5ACB5448E8
4 changed files with 56 additions and 10 deletions

View File

@ -32,6 +32,7 @@ AM_CPPFLAGS = \
libexec_PROGRAMS = file-exr
file_exr_SOURCES = \
exr-attribute-blob.h \
file-exr.c \
openexr-wrapper.cc \
openexr-wrapper.h

View File

@ -171,8 +171,12 @@ load_image (const gchar *filename,
gint begin;
gint32 success = FALSE;
gchar *comment;
GimpMetadata *metadata;
gboolean have_metadata = FALSE;
guchar *exif_data;
guint exif_size;
guchar *xmp_data;
guint xmp_size;
gimp_progress_init_printf (_("Opening '%s'"),
@ -331,31 +335,49 @@ load_image (const gchar *filename,
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 */
exif_data = exr_loader_get_exif (loader, &exif_size);
if (exif_data)
{
GimpMetadata *metadata = gimp_image_get_metadata (image);
if (metadata)
g_object_ref (metadata);
else
metadata = gimp_metadata_new ();
if (gimp_metadata_set_from_exif (metadata,
exif_data,
exif_size,
NULL))
{
gimp_image_set_metadata (image, metadata);
have_metadata = TRUE;
}
g_object_unref (metadata);
g_free (exif_data);
}
// TODO: also read XMP data
/* try to read the Xmp data */
xmp_data = exr_loader_get_xmp (loader, &xmp_size);
if (xmp_data)
{
// FIXME:
// gimp_metadata_set_from_xmp skips the first 10 bytes.
// working around that like this might not be the right thing to do!
if (gimp_metadata_set_from_xmp (metadata,
xmp_data - 10,
xmp_size + 10,
NULL))
{
have_metadata = TRUE;
}
g_free (xmp_data);
}
if (have_metadata)
gimp_image_set_metadata (image, metadata);
g_object_unref (metadata);
gimp_progress_update (1.0);

View File

@ -272,6 +272,18 @@ struct _EXRLoader
return (guchar *)g_memdup (exif_data, *size);
}
guchar *getXmp(guint *size) const {
guchar *result = NULL;
*size = 0;
const Imf::StringAttribute *xmp = file_.header().findTypedAttribute<Imf::StringAttribute>("xmp");
if (xmp)
{
*size = xmp->value().size();
result = (guchar *) g_memdup (xmp->value().data(), *size);
}
return result;
}
size_t refcount_;
InputFile file_;
const Box2i data_window_;
@ -392,6 +404,13 @@ exr_loader_get_exif (EXRLoader *loader,
return loader->getExif (size);
}
guchar *
exr_loader_get_xmp (EXRLoader *loader,
guint *size)
{
return loader->getXmp (size);
}
int
exr_loader_read_pixel_row (EXRLoader *loader,
char *pixels,

View File

@ -60,6 +60,10 @@ guchar *
exr_loader_get_exif (EXRLoader *loader,
guint *size);
guchar *
exr_loader_get_xmp (EXRLoader *loader,
guint *size);
int
exr_loader_read_pixel_row (EXRLoader *loader,
char *pixels,