[gimp: 1/5] Merges the exif-data to the xmp-model.
- From: Roman Joost <romanofski src gnome org>
- To: svn-commits-list gnome org
- Subject: [gimp: 1/5] Merges the exif-data to the xmp-model.
- Date: Wed, 1 Jul 2009 00:42:11 +0000 (UTC)
commit 7230d2673c89e4e7b29d5ca43a7a12b94c6a8168
Author: Roman Joost <romanofski gimp org>
Date: Sat Jun 20 22:16:55 2009 +1000
Merges the exif-data to the xmp-model.
Added a function to merge the Exif data into the xmp model. The function
is using the image id and to access the Exif data parasite. For each
Exif property a corresponding value in the XMP model is created.
plug-ins/file-jpeg/gimpexif.c | 10 +++
plug-ins/metadata/Makefile.am | 12 ++--
plug-ins/metadata/exif-decode.c | 84 +++++++++++++++++++++++++++
plug-ins/metadata/exif-decode.h | 35 +++++++++++
plug-ins/metadata/metadata.c | 119 +++++++++++++++++++++------------------
5 files changed, 200 insertions(+), 60 deletions(-)
---
diff --git a/plug-ins/file-jpeg/gimpexif.c b/plug-ins/file-jpeg/gimpexif.c
index 57cccab..7f4f752 100644
--- a/plug-ins/file-jpeg/gimpexif.c
+++ b/plug-ins/file-jpeg/gimpexif.c
@@ -50,6 +50,8 @@
void gimp_metadata_store_exif (gint32 image_ID,
ExifData *exif_data)
{
+ GimpParam *return_vals;
+ gint nreturn_vals;
GimpParasite *parasite = NULL;
guchar *exif_buf = NULL;
guint exif_buf_len = 0;
@@ -64,6 +66,14 @@ void gimp_metadata_store_exif (gint32 image_ID,
gimp_image_parasite_attach (image_ID, parasite);
gimp_parasite_free (parasite);
}
+ return_vals = gimp_run_procedure ("plug-in-metadata-decode-exif",
+ &nreturn_vals,
+ GIMP_PDB_IMAGE, image_ID,
+ GIMP_PDB_INT32, exif_data->size,
+ GIMP_PDB_INT8ARRAY, exif_data,
+ GIMP_PDB_END);
+ if (return_vals[0].data.d_status != GIMP_PDB_SUCCESS)
+ g_warning ("JPEG Exif -> XMP Merge failed");
free (exif_buf);
}
diff --git a/plug-ins/metadata/Makefile.am b/plug-ins/metadata/Makefile.am
index dd9bb3d..78bbb67 100644
--- a/plug-ins/metadata/Makefile.am
+++ b/plug-ins/metadata/Makefile.am
@@ -30,11 +30,11 @@ metadata_SOURCES = \
xmp-encode.h \
xmp-encode.c \
xmp-schemas.h \
- xmp-schemas.c
-# interface.h \
-# interface.c \
-# exif-decode.h \
-# exif-decode.c \
+ xmp-schemas.c \
+ interface.h \
+ interface.c \
+ exif-decode.h \
+ exif-decode.c
# exif-encode.h \
# exif-encode.c \
# iptc-decode.h \
@@ -56,10 +56,12 @@ INCLUDES = \
LDADD = \
$(libgimp) \
+ $(libgimpui) \
$(libgimpconfig) \
$(libgimpcolor) \
$(libgimpbase) \
$(libgimpmath) \
+ $(EXIF_LIBS) \
$(GTK_LIBS) \
$(RT_LIBS) \
$(INTLLIBS)
diff --git a/plug-ins/metadata/exif-decode.c b/plug-ins/metadata/exif-decode.c
new file mode 100644
index 0000000..7e0968a
--- /dev/null
+++ b/plug-ins/metadata/exif-decode.c
@@ -0,0 +1,84 @@
+/* exif-decode.c - decodes exif data and converts it to XMP
+ *
+ * Copyright (C) 2004-2005, Róman Joost <romanofski gimp org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include <glib.h>
+
+#include <libgimp/gimp.h>
+
+#include <libexif/exif-data.h>
+
+#include "xmp-model.h"
+#include "xmp-schemas.h"
+
+#include "exif-decode.h"
+
+/* prototypes of local functions */
+// static void exif_iter_content (XMPModel *xmp_model,
+// ExifData *data);
+static void exif_foreach_content_cb (ExifContent *content,
+ XMPModel *xmp_model);
+static void exif_foreach_entry_cb (ExifEntry *entry,
+ XMPModel *xmp_model);
+
+
+gboolean
+xmp_merge_from_exifbuffer (XMPModel *xmp_model,
+ gint32 image_ID,
+ GError **error)
+{
+ ExifData *exif_data;
+ GimpParasite *parasite = gimp_image_parasite_find(image_ID, "exif-data");
+
+ if (parasite)
+ {
+ g_warning ("Found parasite, extracting exif");
+ exif_data = exif_data_new_from_data (gimp_parasite_data (parasite),
+ gimp_parasite_data_size (parasite));
+ if (exif_data) {
+ exif_data_foreach_content (exif_data,
+ (void *) exif_foreach_content_cb,
+ xmp_model);
+ } else {
+ g_printerr ("\nSomething went wrong, when reading from buffer.\n");
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+exif_foreach_content_cb (ExifContent *content,
+ XMPModel *xmp_model)
+{
+ exif_content_foreach_entry (content, (void *) exif_foreach_entry_cb, xmp_model);
+}
+
+static void
+exif_foreach_entry_cb (ExifEntry *entry,
+ XMPModel *xmp_model)
+{
+ g_printerr ("\nWuff! Wuff!:");
+
+}
diff --git a/plug-ins/metadata/exif-decode.h b/plug-ins/metadata/exif-decode.h
new file mode 100644
index 0000000..80f9791
--- /dev/null
+++ b/plug-ins/metadata/exif-decode.h
@@ -0,0 +1,35 @@
+/* exif-decode.h - decode exif data and convert it to XMP
+ *
+ * Copyright (C) 2008, Róman Joost <romanofski gimp org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef EXIF_DECODE_H
+#define EXIF_DECODE_H
+
+G_BEGIN_DECLS
+
+gboolean exif_merge_to_xmp (XMPModel *xmp_model,
+ const gchar *filename,
+ GError **error);
+
+gboolean xmp_merge_from_exifbuffer (XMPModel *xmp_model,
+ gint32 image_ID,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* EXIF_DECODE_H */
diff --git a/plug-ins/metadata/metadata.c b/plug-ins/metadata/metadata.c
index c45c30c..78fc7d5 100644
--- a/plug-ins/metadata/metadata.c
+++ b/plug-ins/metadata/metadata.c
@@ -23,14 +23,16 @@
#include <libgimp/gimp.h>
+#include <libexif/exif-data.h>
+
#include "libgimp/stdplugins-intl.h"
#include "metadata.h"
#include "xmp-encode.h"
-/* FIXME: uncomment when these are working
#include "interface.h"
#include "exif-decode.h"
+/* FIXME: uncomment when these are working
#include "exif-encode.h"
#include "iptc-decode.h"
*/
@@ -65,14 +67,12 @@ MAIN ()
static void
query (void)
{
-/* FIXME: uncomment when these are working
static const GimpParamDef editor_args[] =
{
{ GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" },
{ GIMP_PDB_IMAGE, "image", "Input image" },
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable (unused)" }
};
-*/
static const GimpParamDef decode_xmp_args[] =
{
@@ -89,7 +89,6 @@ query (void)
{ GIMP_PDB_STRING, "xmp", "XMP packet" }
};
-/* FIXME: uncomment when these are working
static const GimpParamDef decode_exif_args[] =
{
{ GIMP_PDB_IMAGE, "image", "Input image" },
@@ -97,6 +96,7 @@ query (void)
{ GIMP_PDB_INT8ARRAY, "exif", "EXIF block" }
};
+/* FIXME: uncomment when these are working
static const GimpParamDef encode_exif_args[] =
{
{ GIMP_PDB_IMAGE, "image", "Input image" }
@@ -179,17 +179,16 @@ query (void)
{ GIMP_PDB_INT32, "overwrite", "Overwrite existing file: { FALSE (0), TRUE (1) }" }
};
-/* FIXME: uncomment when these are working
gimp_install_procedure (EDITOR_PROC,
- N_("View and edit metadata (EXIF, IPTC, XMP)"),
+ N_("View and edit metadata (EXIF, IPTC, XMP)"),
"View and edit metadata information attached to the "
"current image. This can include EXIF, IPTC and/or "
"XMP information. Some or all of this metadata "
"will be saved in the file, depending on the output "
"file format.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2004-2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2004-2005",
N_("Propert_ies"),
"RGB*, INDEXED*, GRAY*",
GIMP_PLUGIN,
@@ -197,18 +196,17 @@ query (void)
editor_args, NULL);
gimp_plugin_menu_register (EDITOR_PROC, "<Image>/File/Info");
- gimp_plugin_icon_register (EDITOR_PROC, GIMP_ICON_TYPE_STOCK_ID,
- */
+ // XXX gimp_plugin_icon_register (EDITOR_PROC, GIMP_ICON_TYPE_STOCK_ID,
gimp_install_procedure (DECODE_XMP_PROC,
- "Decode an XMP packet",
+ "Decode an XMP packet",
"Parse an XMP packet and merge the results with "
"any metadata already attached to the image. This "
"should be used when an XMP packet is read from an "
"image file.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -216,13 +214,13 @@ query (void)
decode_xmp_args, NULL);
gimp_install_procedure (ENCODE_XMP_PROC,
- "Encode metadata into an XMP packet",
+ "Encode metadata into an XMP packet",
"Generate an XMP packet from the metadata "
"information attached to the image. The new XMP "
"packet can then be saved into a file.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Róman Joost <romanofski gimp org>",
+ "Róman Joost <romanofski gimp org>",
+ "2008",
NULL,
NULL,
GIMP_PLUGIN,
@@ -230,30 +228,30 @@ query (void)
G_N_ELEMENTS (encode_xmp_return_vals),
encode_xmp_args, encode_xmp_return_vals);
-/* FIXME: uncomment when these are working
gimp_install_procedure (DECODE_EXIF_PROC,
- "Decode an EXIF block",
+ "Decode an EXIF block",
"Parse an EXIF block and merge the results with "
"any metadata already attached to the image. This "
"should be used when an EXIF block is read from an "
"image file.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
G_N_ELEMENTS (decode_exif_args), 0,
decode_exif_args, NULL);
+/* FIXME: uncomment when these are working
gimp_install_procedure (ENCODE_EXIF_PROC,
- "Encode metadata into an EXIF block",
+ "Encode metadata into an EXIF block",
"Generate an EXIF block from the metadata "
"information attached to the image. The new EXIF "
"block can then be saved into a file.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -263,12 +261,12 @@ query (void)
*/
gimp_install_procedure (GET_PROC,
- "Retrieve the values of an XMP property",
+ "Retrieve the values of an XMP property",
"Retrieve the list of values associated with "
"an XMP property.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -277,13 +275,13 @@ query (void)
get_args, get_return_vals);
gimp_install_procedure (SET_PROC,
- "Set the values of an XMP property",
+ "Set the values of an XMP property",
"Set the list of values associated with "
"an XMP property. If a property with the same "
"name already exists, it will be replaced.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -291,15 +289,15 @@ query (void)
set_args, NULL);
gimp_install_procedure (GET_SIMPLE_PROC,
- "Retrieve the value of an XMP property",
+ "Retrieve the value of an XMP property",
"Retrieve value associated with a scalar XMP "
"property. This can only be done for simple "
"property types such as text or integers. "
"Structured types must be retrieved with "
"plug_in_metadata_get().",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -308,14 +306,14 @@ query (void)
get_simple_args, get_simple_return_vals);
gimp_install_procedure (SET_SIMPLE_PROC,
- "Set the value of an XMP property",
+ "Set the value of an XMP property",
"Set the value of a scalar XMP property. This "
"can only be done for simple property types such "
"as text or integers. Structured types need to "
"be set with plug_in_metadata_set().",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -323,14 +321,14 @@ query (void)
set_simple_args, NULL);
gimp_install_procedure (IMPORT_PROC,
- "Import XMP from a file into the current image",
+ "Import XMP from a file into the current image",
"Load an XMP packet from a file and import it into "
"the current image. This can be used to add a "
"license statement or some other predefined "
"metadata to an image",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -338,16 +336,16 @@ query (void)
import_args, NULL);
gimp_install_procedure (EXPORT_PROC,
- "Export XMP from the current image to a file",
+ "Export XMP from the current image to a file",
"Export the metadata associated with the current "
"image into a file. The metadata will be saved as "
"an XMP packet. If overwrite is TRUE, then any "
"existing file will be overwritten without warning. "
"If overwrite is FALSE, then an error will occur if "
"the file already exists.",
- "Raphaël Quinet <raphael gimp org>",
- "Raphaël Quinet <raphael gimp org>",
- "2005",
+ "Raphaël Quinet <raphael gimp org>",
+ "Raphaël Quinet <raphael gimp org>",
+ "2005",
NULL,
NULL,
GIMP_PLUGIN,
@@ -388,6 +386,7 @@ run (const gchar *name,
if (parasite)
{
GError *error = NULL;
+ g_warning ("Parsing Metadata XMP parasite.");
if (!! strncmp (gimp_parasite_data (parasite),
METADATA_MARKER, METADATA_MARKER_LEN)
@@ -396,7 +395,7 @@ run (const gchar *name,
+ METADATA_MARKER_LEN,
gimp_parasite_data_size (parasite)
- METADATA_MARKER_LEN,
- FALSE, &error))
+ TRUE, &error))
{
g_printerr ("Metadata parasite seems to be corrupt");
/* continue anyway, we will attach a clean parasite later */
@@ -432,11 +431,23 @@ run (const gchar *name,
if (! xmp_model_parse_buffer (xmp_model, buffer, strlen (buffer),
FALSE, &error))
status = GIMP_PDB_EXECUTION_ERROR;
+
}
else if (! strcmp (name, ENCODE_XMP_PROC))
{
/* done below together with the parasite */
}
+ else if (! strcmp (name, DECODE_EXIF_PROC))
+ {
+#ifdef HAVE_EXIF
+ GError *error = NULL;
+
+ if (! xmp_merge_from_exifbuffer (xmp_model,
+ image_ID,
+ &error))
+ status = GIMP_PDB_EXECUTION_ERROR;
+#endif
+ }
else if (! strcmp (name, GET_PROC))
{
g_printerr ("Not implemented yet (GET_PROC)\n"); /* FIXME */
@@ -509,7 +520,6 @@ run (const gchar *name,
}
else if (! strcmp (name, EDITOR_PROC))
{
- /* FIXME: uncomment when these are working
GimpRunMode run_mode;
run_mode = param[0].data.d_int32;
@@ -519,7 +529,6 @@ run (const gchar *name,
status = GIMP_PDB_CANCEL;
}
- */
g_printerr ("Not implemented yet (EDITOR_PROC)\n");
status = GIMP_PDB_EXECUTION_ERROR;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]