head 1.2; access; symbols pkgsrc-2013Q2:1.2.0.8 pkgsrc-2013Q2-base:1.2 pkgsrc-2012Q4:1.2.0.6 pkgsrc-2012Q4-base:1.2 pkgsrc-2011Q4:1.2.0.4 pkgsrc-2011Q4-base:1.2 pkgsrc-2011Q2:1.2.0.2 pkgsrc-2011Q2-base:1.2 pkgsrc-2010Q4:1.1.0.2 pkgsrc-2010Q4-base:1.1; locks; strict; comment @# @; 1.2 date 2011.01.12.18.46.36; author drochner; state dead; branches; next 1.1; 1.1 date 2010.12.03.16.51.04; author drochner; state Exp; branches; next ; desc @@ 1.2 log @update to 0.3.0 changes: -bugfixes -adaption to exiv2-0.21 API @ text @$NetBSD: patch-ae,v 1.1 2010/12/03 16:51:04 drochner Exp $ --- gexiv2/gexiv2-metadata.cpp.orig 2010-09-10 21:52:54.000000000 +0000 +++ gexiv2/gexiv2-metadata.cpp @@@@ -380,62 +380,51 @@@@ gchar* gexiv2_metadata_get_date_time (GE g_return_val_if_fail(GEXIV2_IS_METADATA (self), NULL); g_return_val_if_fail(self->priv->image.get() != NULL, NULL); - Exiv2::ExifData& exif_data = self->priv->image->exifData(); - - if (!exif_data.empty ()) { - Exiv2::ExifKey key ("Exif.Photo.DateTimeOriginal"); - Exiv2::ExifData::iterator it = exif_data.findKey (key); - if (it != exif_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::ExifKey ("Exif.Image.DateTime"); - it = exif_data.findKey (key); - if (it != exif_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::ExifKey ("Exif.Photo.DateTimeDigitized"); - it = exif_data.findKey (key); - if (it != exif_data.end ()) - return g_strdup (it->toString ().c_str ()); + if (gexiv2_metadata_has_exif(self)) { + gchar *datetime = gexiv2_metadata_get_exif_tag_interpreted_string(self, + "Exif.Photo.DateTimeOriginal");; + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_exif_tag_interpreted_string(self, "Exif.Image.DateTime"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_exif_tag_interpreted_string(self, + "Exif.Image.DateTimeDigitized"); + if (datetime != NULL) + return datetime; } - Exiv2::XmpData& xmp_data = self->priv->image->xmpData(); - - if (!xmp_data.empty ()) { - Exiv2::XmpKey key ("Xmp.exif.DateTimeOriginal"); - Exiv2::XmpData::iterator it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::XmpKey ("Xmp.xmp.CreateDate"); - it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::XmpKey ("Xmp.exif.DateTimeDigitized"); - it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::XmpKey ("Xmp.tiff.DateTime"); - it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::XmpKey ("Xmp.photoshop.DateCreated"); - it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::XmpKey ("Xmp.xmp.ModifyDate"); - it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); - - key = Exiv2::XmpKey ("Xmp.xmp.MetadataDate"); - it = xmp_data.findKey (key); - if (it != xmp_data.end ()) - return g_strdup (it->toString ().c_str ()); + if (gexiv2_metadata_has_xmp(self)) { + gchar *datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, + "Xmp.exif.DateTimeOriginal"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.xmp.CreateDate"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.exif.DateTimeDigitized"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.tiff.DateTime"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.photoshop.DateCreated"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.xmp.ModifyDate"); + if (datetime != NULL) + return datetime; + + datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.xmp.MetadataDate"); + if (datetime != NULL) + return datetime; } /* FIXME: handle IPTC Date */ @@@@ -471,76 +460,43 @@@@ GExiv2Orientation gexiv2_metadata_get_or g_return_val_if_fail(GEXIV2_IS_METADATA (self), GEXIV2_ORIENTATION_UNSPECIFIED); g_return_val_if_fail(self->priv->image.get() != NULL, GEXIV2_ORIENTATION_UNSPECIFIED); - Exiv2::ExifData& exif_data = self->priv->image->exifData(); - - if (!exif_data.empty ()) { - /* Because some camera set a wrong standard exif orientation tag, - We need to check makernote tags first! - */ - Exiv2::ExifKey minolta_key1 ("Exif.MinoltaCs7D.Rotation"); - Exiv2::ExifData::iterator it = exif_data.findKey (minolta_key1); - if (it != exif_data.end ()) { - switch (it->toLong ()) { + if (gexiv2_metadata_has_exif(self)) { + // Because some camera set a wrong standard exif orientation tag, + // We need to check makernote tags first! + if (gexiv2_metadata_has_exif_tag(self, "Exif.MinoltaCs7D.Rotation")) { + switch (gexiv2_metadata_get_exif_tag_long(self, "Exif.MinoltaCs7D.Rotation")) { case 76: return GEXIV2_ORIENTATION_ROT_90; + case 82: return GEXIV2_ORIENTATION_ROT_270; - default: - return GEXIV2_ORIENTATION_NORMAL; } } - Exiv2::ExifKey minolta_key2 ("Exif.MinoltaCs5D.Rotation"); - it = exif_data.findKey (minolta_key2); - if (it != exif_data.end ()) { - switch (it->toLong ()) { + if (gexiv2_metadata_has_exif_tag(self, "Exif.MinoltaCs5D.Rotation")) { + switch (gexiv2_metadata_get_exif_tag_long(self, "Exif.MinoltaCs5D.Rotation")) { case 76: return GEXIV2_ORIENTATION_ROT_90; + case 82: return GEXIV2_ORIENTATION_ROT_270; - default: - return GEXIV2_ORIENTATION_NORMAL; } } - - Exiv2::ExifKey std_key ("Exif.Image.Orientation"); - it = exif_data.findKey (std_key); - // TODO: This was added in response to http://trac.yorba.org/ticket/2514 - // The user supplied a file to us with two Exif.Image.Orientation fields, one reported (the - // first) as zero by exiv2. I discovered that field has a count() of zero, or is emtpy, - // which causes a segfault when the iterator is dereferenced. - // - // This searches for the first matching non-empty key. A better solution would be to guard - // against this in all searches for all domains, but that's too much of a change for now. - // We'll probably need to do this for the next release. - while (it != exif_data.end() && it->count() == 0) - it++; - - if (it != exif_data.end ()) { - GExiv2Orientation orientation = (GExiv2Orientation) it->toLong (); - - return ((orientation < GEXIV2_ORIENTATION_MIN || - orientation > GEXIV2_ORIENTATION_MAX) ? - GEXIV2_ORIENTATION_UNSPECIFIED : orientation); - } + GExiv2Orientation orientation = (GExiv2Orientation) gexiv2_metadata_get_exif_tag_long(self, + "Exif.Image.Orientation"); + if (orientation >= GEXIV2_ORIENTATION_MIN && orientation <= GEXIV2_ORIENTATION_MAX) + return orientation; } - Exiv2::XmpData& xmp_data = self->priv->image->xmpData(); - - if (!xmp_data.empty ()) { - Exiv2::XmpKey tiff_width_key ("Xmp.tiff.ImageWidth"); - Exiv2::XmpData::iterator it = xmp_data.findKey (tiff_width_key); - if (it != xmp_data.end ()) { - GExiv2Orientation orientation = (GExiv2Orientation) it->toLong (); - - return ((orientation < GEXIV2_ORIENTATION_MIN || - orientation > GEXIV2_ORIENTATION_MAX) ? - GEXIV2_ORIENTATION_UNSPECIFIED : orientation); - } + GExiv2Orientation orientation = GEXIV2_ORIENTATION_UNSPECIFIED; + if (gexiv2_metadata_has_xmp_tag(self, "Xmp.tiff.ImageWidth")) { + orientation = (GExiv2Orientation) gexiv2_metadata_get_xmp_tag_long(self, + "Xmp.tiff.ImageWidth"); } - return GEXIV2_ORIENTATION_UNSPECIFIED; + return (orientation < GEXIV2_ORIENTATION_MIN || orientation > GEXIV2_ORIENTATION_MAX) + ? GEXIV2_ORIENTATION_UNSPECIFIED : orientation; } gboolean gexiv2_metadata_get_supports_exif (GExiv2Metadata *self) { @@@@ -576,15 +532,8 @@@@ void gexiv2_metadata_set_orientation (GE exif_data["Exif.Image.Orientation"] = static_cast (orientation); xmp_data["Xmp.tiff.ImageWidth"] = static_cast (orientation); - Exiv2::ExifKey minolta_key1 ("Exif.MinoltaCs7D.Rotation"); - Exiv2::ExifData::iterator it = exif_data.findKey (minolta_key1); - if (it != exif_data.end ()) - exif_data.erase (it); - - Exiv2::ExifKey minolta_key2 ("Exif.MinoltaCs5D.Rotation"); - it = exif_data.findKey (minolta_key2); - if (it != exif_data.end ()) - exif_data.erase (it); + gexiv2_metadata_clear_exif_tag(self, "Exif.MinoltaCs7D.Rotation"); + gexiv2_metadata_clear_exif_tag(self, "Exif.MinoltaCs5D.Rotation"); } gint gexiv2_metadata_get_pixel_width (GExiv2Metadata *self) { @@@@ -605,32 +554,20 @@@@ gint gexiv2_metadata_get_metadata_pixel_ g_return_val_if_fail (GEXIV2_IS_METADATA (self), -1); g_return_val_if_fail(self->priv->image.get() != NULL, -1); - Exiv2::ExifData& exif_data = self->priv->image->exifData(); - - if (!exif_data.empty ()) { - Exiv2::ExifKey pixel_dim_key ("Exif.Photo.PixelXDimension"); - Exiv2::ExifData::iterator it = exif_data.findKey (pixel_dim_key); - if (it != exif_data.end ()) - return it->toLong (); - - Exiv2::ExifKey image_width_key ("Exif.Image.ImageWidth"); - it = exif_data.findKey (image_width_key); - if (it != exif_data.end ()) - return it->toLong (); + if (gexiv2_metadata_has_exif(self)) { + if (gexiv2_metadata_has_exif_tag(self, "Exif.Photo.PixelXDimension")) + return gexiv2_metadata_get_exif_tag_long(self, "Exif.Photo.PixelXDimension"); + + if (gexiv2_metadata_has_exif_tag(self, "Exif.Image.ImageWidth")) + return gexiv2_metadata_get_exif_tag_long(self, "Exif.Image.ImageWidth"); } - Exiv2::XmpData& xmp_data = self->priv->image->xmpData(); - - if (!exif_data.empty ()) { - Exiv2::XmpKey tiff_width_key ("Xmp.tiff.ImageWidth"); - Exiv2::XmpData::iterator it = xmp_data.findKey (tiff_width_key); - if (it != xmp_data.end ()) - return it->toLong (); - - Exiv2::XmpKey xmp_exif_key ("Xmp.exif.PixelXDimension"); - it = xmp_data.findKey (xmp_exif_key); - if (it != xmp_data.end ()) - return it->toLong (); + if (gexiv2_metadata_has_xmp(self)) { + if (gexiv2_metadata_has_xmp_tag(self, "Xmp.tiff.ImageWidth")) + return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.tiff.ImageWidth"); + + if (gexiv2_metadata_has_xmp_tag(self, "Xmp.exif.PixelXDimension")) + return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.exif.PixelXDimension"); } return -1; @@@@ -640,32 +577,20 @@@@ gint gexiv2_metadata_get_metadata_pixel_ g_return_val_if_fail (GEXIV2_IS_METADATA (self), -1); g_return_val_if_fail(self->priv->image.get() != NULL, -1); - Exiv2::ExifData& exif_data = self->priv->image->exifData(); - - if (!exif_data.empty ()) { - Exiv2::ExifKey pixel_dim_key ("Exif.Photo.PixelYDimension"); - Exiv2::ExifData::iterator it = exif_data.findKey (pixel_dim_key); - if (it != exif_data.end ()) - return it->toLong (); - - Exiv2::ExifKey image_height_key ("Exif.Image.ImageHeight"); - it = exif_data.findKey (image_height_key); - if (it != exif_data.end ()) - return it->toLong (); + if (gexiv2_metadata_has_exif(self)) { + if (gexiv2_metadata_has_exif_tag(self, "Exif.Photo.PixelYDimension")) + return gexiv2_metadata_get_exif_tag_long(self, "Exif.Photo.PixelYDimension"); + + if (gexiv2_metadata_has_exif_tag(self, "Exif.Image.ImageHeight")) + return gexiv2_metadata_get_exif_tag_long(self, "Exif.Image.ImageHeight"); } - Exiv2::XmpData& xmp_data = self->priv->image->xmpData(); - - if (!exif_data.empty ()) { - Exiv2::XmpKey tiff_height_key ("Xmp.tiff.ImageHeight"); - Exiv2::XmpData::iterator it = xmp_data.findKey (tiff_height_key); - if (it != xmp_data.end ()) - return it->toLong (); - - Exiv2::XmpKey xmp_exif_key ("Xmp.exif.PixelYDimension"); - it = xmp_data.findKey (xmp_exif_key); - if (it != xmp_data.end ()) - return it->toLong (); + if (gexiv2_metadata_has_xmp(self)) { + if (gexiv2_metadata_has_xmp_tag(self, "Xmp.tiff.ImageHeight")) + return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.tiff.ImageHeight"); + + if (gexiv2_metadata_has_xmp_tag(self, "Xmp.exif.PixelYDimension")) + return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.exif.PixelYDimension"); } return -1; @ 1.1 log @add patch from upstream (trac changeset 2260) to fix crash when importing photos with weird Exif tags (upstream ticket #2514) bump PKGREVISION @ text @d1 1 a1 1 $NetBSD$ @