gthumb r2244 - in trunk: . libgthumb src
- From: mjc svn gnome org
- To: svn-commits-list gnome org
- Subject: gthumb r2244 - in trunk: . libgthumb src
- Date: Sat, 2 Feb 2008 20:33:18 +0000 (GMT)
Author: mjc
Date: Sat Feb 2 20:33:17 2008
New Revision: 2244
URL: http://svn.gnome.org/viewvc/gthumb?rev=2244&view=rev
Log:
2008-02-02 Michael J. Chudobiak <mjc svn gnome org>
* libgthumb/file-data.c: (fd_free_metadata), (file_data_new),
(file_data_unref), (file_data_update), (file_data_update_info):
* libgthumb/gth-exif-utils.c: (free_metadata_entry),
(free_metadata), (simple_add_metadata),
(update_and_save_metadatum), (update_and_save_metadata),
(write_orientation_field):
* libgthumb/gth-exif-utils.h:
* libgthumb/gth-exiv2-utils.cpp:
* libgthumb/gth-exiv2-utils.hpp:
* src/catalog-web-exporter.c:
(copy_exif_from_orig_and_reset_orientation):
* src/dlg-change-date.c: (ok_clicked):
Changed code to permit the updating of more than one metadata tags
at a time (i.e., one file write operation).
* libgthumb/gth-gstreamer-utils.c: (tag_iterate):
Fixed compiler warning.
Modified:
trunk/ChangeLog
trunk/libgthumb/file-data.c
trunk/libgthumb/gth-exif-utils.c
trunk/libgthumb/gth-exif-utils.h
trunk/libgthumb/gth-exiv2-utils.cpp
trunk/libgthumb/gth-exiv2-utils.hpp
trunk/libgthumb/gth-gstreamer-utils.c
trunk/src/catalog-web-exporter.c
trunk/src/dlg-change-date.c
Modified: trunk/libgthumb/file-data.c
==============================================================================
--- trunk/libgthumb/file-data.c (original)
+++ trunk/libgthumb/file-data.c Sat Feb 2 20:33:17 2008
@@ -37,28 +37,12 @@
static void
-free_metadata_entry (GthMetadata *entry)
+fd_free_metadata (FileData *fd)
{
- if (entry != NULL) {
- g_free (entry->full_name);
- g_free (entry->display_name);
- g_free (entry->formatted_value);
- g_free (entry->raw_value);
- g_free (entry);
- }
-}
-
-static void
-free_metadata (FileData *fd)
-{
- if (fd->metadata != NULL) {
- g_list_foreach (fd->metadata, (GFunc) free_metadata_entry, NULL);
- g_list_free (fd->metadata);
- fd->metadata = NULL;
- }
-
+ free_metadata (fd->metadata);
+ fd->metadata = NULL;
fd->exif_data_loaded = FALSE;
- fd->exif_time = (time_t) 0;
+ fd->exif_time = (time_t) 0;
}
@@ -106,7 +90,7 @@
DateTime sorts. The tag in memory is refreshed if the file mtime has
changed, so it is recorded as well. */
- free_metadata (fd);
+ fd_free_metadata (fd);
fd->error = FALSE;
fd->thumb_loaded = FALSE;
@@ -185,7 +169,7 @@
if (fd->comment_data != NULL)
comment_data_free (fd->comment_data);
g_free (fd->comment);
- free_metadata (fd);
+ fd_free_metadata (fd);
g_free (fd);
}
}
@@ -232,7 +216,7 @@
fd->mtime = info->mtime;
fd->ctime = info->ctime;
- free_metadata (fd);
+ fd_free_metadata (fd);
gnome_vfs_file_info_unref (info);
}
@@ -279,7 +263,7 @@
fd->mtime = info->mtime;
fd->ctime = info->ctime;
- free_metadata (fd);
+ fd_free_metadata (fd);
gnome_vfs_file_info_unref (info);
}
Modified: trunk/libgthumb/gth-exif-utils.c
==============================================================================
--- trunk/libgthumb/gth-exif-utils.c (original)
+++ trunk/libgthumb/gth-exif-utils.c Sat Feb 2 20:33:17 2008
@@ -124,7 +124,30 @@
GList * read_exiv2_file (const char *uri, GList *metadata);
GList * read_exiv2_sidecar (const char *uri, GList *metadata);
-void write_metadata (const char *from_file, const char *to_file, const char *key, const char *value);
+void write_metadata (const char *from_file, const char *to_file, GList *metadata);
+
+
+static void
+free_metadata_entry (GthMetadata *entry)
+{
+ if (entry != NULL) {
+ g_free (entry->full_name);
+ g_free (entry->display_name);
+ g_free (entry->formatted_value);
+ g_free (entry->raw_value);
+ g_free (entry);
+ }
+}
+
+
+void
+free_metadata (GList *metadata)
+{
+ if (metadata != NULL) {
+ g_list_foreach (metadata, (GFunc) free_metadata_entry, NULL);
+ g_list_free (metadata);
+ }
+}
time_t
@@ -251,7 +274,7 @@
update_metadata (fd);
- for (i = 0; (tagnames[i] != NULL) && (string == NULL); i++) {
+ for (i = 0; (tagnames[i] != NULL) && (string == NULL); i++) {
GList *search_result = g_list_find_custom (fd->metadata, tagnames[i], (GCompareFunc) metadata_search);
if (search_result != NULL) {
GthMetadata *md_entry = search_result->data;
@@ -264,11 +287,53 @@
}
+GList *
+simple_add_metadata (GList *metadata,
+ const gchar *key,
+ const gchar *value)
+{
+ /* This function is only used when we want to pack several
+ metadata items into a single structure, to supply to
+ update_and_save_metadata. */
+
+ GthMetadata *new_entry;
+
+ if (value != NULL) {
+ new_entry = g_new (GthMetadata, 1);
+ new_entry->category = GTH_METADATA_CATEGORY_OTHER;
+ new_entry->full_name = g_strdup (key);
+ new_entry->display_name = g_strdup (key);
+ new_entry->formatted_value = g_strdup (value);
+ new_entry->raw_value = g_strdup (value);
+ new_entry->position = 0;
+ new_entry->writeable = TRUE;
+ metadata = g_list_prepend (metadata, new_entry);
+ }
+
+ return metadata;
+}
+
+
+void
+update_and_save_metadatum (const char *uri_src,
+ const char *uri_dest,
+ char *tag_name,
+ char *tag_value)
+{
+ /* This is a convenience function, to simplify the API */
+ GList *metadata = NULL;
+
+ metadata = simple_add_metadata (metadata, tag_name, tag_value);
+ update_and_save_metadata (uri_src, uri_dest, metadata);
+
+ free_metadata (metadata);
+}
+
+
void
update_and_save_metadata (const char *uri_src,
const char *uri_dest,
- const char *tag_name,
- const char *tag_value)
+ GList *metadata)
{
char *from_local_file;
char *to_local_file;
@@ -299,7 +364,7 @@
to_info,
GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS|GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- write_metadata (from_local_file, to_local_file, tag_name, tag_value);
+ write_metadata (from_local_file, to_local_file, metadata);
if (!to_is_local) {
remote_copy_ok = copy_cache_file_to_remote_uri (to_local_file, uri_dest);
@@ -331,7 +396,7 @@
tf = 1;
string_tf = g_strdup_printf ("%d", tf);
- update_and_save_metadata (local_file, local_file, "Exif.Image.Orientation", string_tf);
+ update_and_save_metadatum (local_file, local_file, "Exif.Image.Orientation", string_tf);
g_free (string_tf);
}
Modified: trunk/libgthumb/gth-exif-utils.h
==============================================================================
--- trunk/libgthumb/gth-exif-utils.h (original)
+++ trunk/libgthumb/gth-exif-utils.h Sat Feb 2 20:33:17 2008
@@ -75,6 +75,7 @@
};
+void free_metadata (GList *metadata);
GthTransform get_orientation_from_fd (FileData *fd);
time_t get_exif_time (FileData *fd);
time_t get_exif_time_or_mtime (FileData *fd);
@@ -84,10 +85,16 @@
GList *md);
char * get_metadata_string_from_fd (FileData *fd,
const char *tagnames[]);
+GList * simple_add_metadata (GList *metadata,
+ const gchar *key,
+ const gchar *value);
+void update_and_save_metadatum (const char *uri_src,
+ const char *uri_dest,
+ char *tag_name,
+ char *tag_value);
void update_and_save_metadata (const char *uri_src,
const char *uri_dest,
- const char *tag_name,
- const char *tag_value);
+ GList *metdata);
void write_orientation_field (const char *filename,
GthTransform transform);
GList * gth_read_exiv2 (const char *filename,
Modified: trunk/libgthumb/gth-exiv2-utils.cpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.cpp (original)
+++ trunk/libgthumb/gth-exiv2-utils.cpp Sat Feb 2 20:33:17 2008
@@ -36,6 +36,9 @@
#include <exiv2/xmp.hpp>
#endif
+#include <glib.h>
+
+
using namespace std;
#define MAX_TAGS_PER_CATEGORY 50
@@ -530,11 +533,12 @@
extern "C"
void
write_metadata (const char *from_file,
- const char *to_file,
- const char *key,
- const char *value)
+ const char *to_file,
+ GList *metadata_in)
{
try {
+ GList *scan;
+
//Open first image
Exiv2::Image::AutoPtr image1 = Exiv2::ImageFactory::open (from_file);
g_assert (image1.get() != 0);
@@ -542,27 +546,27 @@
// Load existing metadata
image1->readMetadata();
- // TODO: accept a GthMetadata structure instead of a single
- // key/value pair.
-
- // Update the requested tag
- if (key != NULL) {
- if (g_str_has_prefix (key, "Exif")) {
- Exiv2::ExifData &md = image1->exifData();
- md[key] = value;
+ for (scan = metadata_in; scan; scan = scan->next) {
+ // Update the requested tag
+ GthMetadata *metadatum = (GthMetadata *) scan->data;
+ if (metadatum->full_name != NULL) {
+ if (g_str_has_prefix (metadatum->full_name, "Exif")) {
+ Exiv2::ExifData &md = image1->exifData();
+ md[metadatum->full_name] = metadatum->raw_value;
- // TODO: update PixelX/YDimension tags
-
- // TODO: add any missing mandatory tags
+ // TODO: update PixelX/YDimension tags
+
+ // TODO: add any missing mandatory tags
+ }
+ else if (g_str_has_prefix (metadatum->full_name, "Iptc")) {
+ Exiv2::IptcData &md = image1->iptcData();
+ md[metadatum->full_name] = metadatum->raw_value;
+ }
+ else if (g_str_has_prefix (metadatum->full_name, "Xmp")) {
+ Exiv2::XmpData &md = image1->xmpData();
+ md[metadatum->full_name] = metadatum->raw_value;
+ }
}
- else if (g_str_has_prefix (key, "Iptc")) {
- Exiv2::IptcData &md = image1->iptcData();
- md[key] = value;
- }
- else if (g_str_has_prefix (key, "Xmp")) {
- Exiv2::XmpData &md = image1->xmpData();
- md[key] = value;
- }
}
// Delete thumbnail and IFD1 tags, because the main image may
Modified: trunk/libgthumb/gth-exiv2-utils.hpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.hpp (original)
+++ trunk/libgthumb/gth-exiv2-utils.hpp Sat Feb 2 20:33:17 2008
@@ -35,8 +35,7 @@
extern "C" void
write_metadata (const char *from_file,
- const char *to_file,
- const char *key,
- const char *value);
+ const char *to_file,
+ GList *metadata);
#endif
Modified: trunk/libgthumb/gth-gstreamer-utils.c
==============================================================================
--- trunk/libgthumb/gth-gstreamer-utils.c (original)
+++ trunk/libgthumb/gth-gstreamer-utils.c Sat Feb 2 20:33:17 2008
@@ -463,7 +463,7 @@
if (tag_type == G_TYPE_ULONG) {
gulong ret = 0;
if (gst_tag_list_get_ulong (list, tag, &ret))
- *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%u", ret));
+ *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%lu", ret));
else
g_free (tag_name);
}
@@ -473,7 +473,7 @@
if (tag_type == G_TYPE_LONG) {
glong ret = 0;
if (gst_tag_list_get_long (list, tag, &ret))
- *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%d", ret));
+ *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%ld", ret));
else
g_free (tag_name);
}
Modified: trunk/src/catalog-web-exporter.c
==============================================================================
--- trunk/src/catalog-web-exporter.c (original)
+++ trunk/src/catalog-web-exporter.c Sat Feb 2 20:33:17 2008
@@ -2090,7 +2090,7 @@
copy_exif_from_orig_and_reset_orientation (FileData *file,
const char *dest_uri)
{
- update_and_save_metadata (file->path, dest_uri, "Exif.Image.Orientation", "1");
+ update_and_save_metadatum (file->path, dest_uri, "Exif.Image.Orientation", "1");
}
Modified: trunk/src/dlg-change-date.c
==============================================================================
--- trunk/src/dlg-change-date.c (original)
+++ trunk/src/dlg-change-date.c Sat Feb 2 20:33:17 2008
@@ -165,6 +165,7 @@
is_active (data->cd_exif_dig_checkbutton)) {
char *buf;
struct tm tm;
+ GList *add_metadata = NULL;
localtime_r (&mtime, &tm);
buf = g_strdup_printf ("%04d:%02d:%02d %02d:%02d:%02d ",
@@ -176,14 +177,17 @@
tm.tm_sec );
if (is_active (data->cd_exif_checkbutton))
- update_and_save_metadata (fdata->path, fdata->path, "Exif.Image.DateTime", buf);
+ add_metadata = simple_add_metadata (add_metadata, "Exif.Image.DateTime", buf);
if (is_active (data->cd_exif_orig_checkbutton))
- update_and_save_metadata (fdata->path, fdata->path, "Exif.Photo.DateTimeOriginal", buf);
+ add_metadata = simple_add_metadata (add_metadata, "Exif.Photo.DateTimeOriginal", buf);
if (is_active (data->cd_exif_dig_checkbutton))
- update_and_save_metadata (fdata->path, fdata->path, "Exif.Photo.DateTimeDigitized", buf);
+ add_metadata = simple_add_metadata (add_metadata, "Exif.Photo.DateTimeDigitized", buf);
+ update_and_save_metadata (fdata->path, fdata->path, add_metadata);
+
+ free_metadata (add_metadata);
g_free (buf);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]