Mercurial > geeqie
comparison src/exiv2.cc @ 200:1a38eef1129a
exiv2 version checks
author | nadvornik |
---|---|
date | Mon, 24 Mar 2008 14:03:46 +0000 |
parents | 889cfa008789 |
children | 0ca12db715b7 |
comparison
equal
deleted
inserted
replaced
199:80d0701de0f9 | 200:1a38eef1129a |
---|---|
6 #ifdef HAVE_EXIV2 | 6 #ifdef HAVE_EXIV2 |
7 | 7 |
8 #include <exiv2/image.hpp> | 8 #include <exiv2/image.hpp> |
9 #include <exiv2/exif.hpp> | 9 #include <exiv2/exif.hpp> |
10 #include <iostream> | 10 #include <iostream> |
11 | |
12 // EXIV2_TEST_VERSION is defined in Exiv2 0.15 and newer. | |
13 #ifndef EXIV2_TEST_VERSION | |
14 # define EXIV2_TEST_VERSION(major,minor,patch) \ | |
15 ( EXIV2_VERSION >= EXIV2_MAKE_VERSION(major,minor,patch) ) | |
16 #endif | |
17 | |
11 | 18 |
12 #include <sys/types.h> | 19 #include <sys/types.h> |
13 #include <sys/stat.h> | 20 #include <sys/stat.h> |
14 #include <unistd.h> | 21 #include <unistd.h> |
15 #include <fcntl.h> | 22 #include <fcntl.h> |
19 #include <exiv2/tiffcomposite.hpp> | 26 #include <exiv2/tiffcomposite.hpp> |
20 #include <exiv2/tiffvisitor.hpp> | 27 #include <exiv2/tiffvisitor.hpp> |
21 #include <exiv2/tiffimage.hpp> | 28 #include <exiv2/tiffimage.hpp> |
22 #include <exiv2/cr2image.hpp> | 29 #include <exiv2/cr2image.hpp> |
23 #include <exiv2/crwimage.hpp> | 30 #include <exiv2/crwimage.hpp> |
31 #if EXIV2_TEST_VERSION(0,16,0) | |
24 #include <exiv2/orfimage.hpp> | 32 #include <exiv2/orfimage.hpp> |
33 #endif | |
34 #if EXIV2_TEST_VERSION(0,13,0) | |
25 #include <exiv2/rafimage.hpp> | 35 #include <exiv2/rafimage.hpp> |
36 #endif | |
26 #include <exiv2/futils.hpp> | 37 #include <exiv2/futils.hpp> |
27 | 38 |
28 | 39 |
29 | 40 |
30 extern "C" { | 41 extern "C" { |
38 { | 49 { |
39 Exiv2::Image::AutoPtr image; | 50 Exiv2::Image::AutoPtr image; |
40 Exiv2::Image::AutoPtr sidecar; | 51 Exiv2::Image::AutoPtr sidecar; |
41 Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */ | 52 Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */ |
42 Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */ | 53 Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */ |
54 #if EXIV2_TEST_VERSION(0,16,0) | |
43 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */ | 55 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */ |
56 #endif | |
44 bool have_sidecar; | 57 bool have_sidecar; |
45 | 58 |
46 | 59 |
47 _ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile) | 60 _ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile) |
48 { | 61 { |
49 have_sidecar = false; | 62 have_sidecar = false; |
50 image = Exiv2::ImageFactory::open(path); | 63 image = Exiv2::ImageFactory::open(path); |
51 // g_assert (image.get() != 0); | 64 // g_assert (image.get() != 0); |
52 image->readMetadata(); | 65 image->readMetadata(); |
53 | 66 |
67 #if EXIV2_TEST_VERSION(0,16,0) | |
54 printf("xmp count %d\n", image->xmpData().count()); | 68 printf("xmp count %d\n", image->xmpData().count()); |
55 if (sidecar_path && image->xmpData().empty()) | 69 if (sidecar_path && image->xmpData().empty()) |
56 { | 70 { |
57 sidecar = Exiv2::ImageFactory::open(sidecar_path); | 71 sidecar = Exiv2::ImageFactory::open(sidecar_path); |
58 sidecar->readMetadata(); | 72 sidecar->readMetadata(); |
59 have_sidecar = sidecar->good(); | 73 have_sidecar = sidecar->good(); |
60 printf("sidecar xmp count %d\n", sidecar->xmpData().count()); | 74 printf("sidecar xmp count %d\n", sidecar->xmpData().count()); |
61 } | 75 } |
62 | 76 |
77 #endif | |
63 } | 78 } |
64 | 79 |
65 void writeMetadata() | 80 void writeMetadata() |
66 { | 81 { |
67 if (have_sidecar) sidecar->writeMetadata(); | 82 if (have_sidecar) sidecar->writeMetadata(); |
76 Exiv2::IptcData &iptcData () | 91 Exiv2::IptcData &iptcData () |
77 { | 92 { |
78 return image->iptcData(); | 93 return image->iptcData(); |
79 } | 94 } |
80 | 95 |
96 #if EXIV2_TEST_VERSION(0,16,0) | |
81 Exiv2::XmpData &xmpData () | 97 Exiv2::XmpData &xmpData () |
82 { | 98 { |
83 return have_sidecar ? sidecar->xmpData() : image->xmpData(); | 99 return have_sidecar ? sidecar->xmpData() : image->xmpData(); |
84 } | 100 } |
85 | 101 #endif |
86 | 102 |
87 }; | 103 }; |
88 | 104 |
89 extern "C" { | 105 extern "C" { |
90 | 106 |
137 Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey); | 153 Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey); |
138 if (pos == exif->iptcData().end()) return NULL; | 154 if (pos == exif->iptcData().end()) return NULL; |
139 item = &*pos; | 155 item = &*pos; |
140 } | 156 } |
141 catch (Exiv2::AnyError& e) { | 157 catch (Exiv2::AnyError& e) { |
158 #if EXIV2_TEST_VERSION(0,16,0) | |
142 Exiv2::XmpKey ekey(key); | 159 Exiv2::XmpKey ekey(key); |
143 Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey); | 160 Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey); |
144 if (pos == exif->xmpData().end()) return NULL; | 161 if (pos == exif->xmpData().end()) return NULL; |
145 item = &*pos; | 162 item = &*pos; |
163 #endif | |
146 } | 164 } |
147 } | 165 } |
148 return (ExifItem *)item; | 166 return (ExifItem *)item; |
149 } | 167 } |
150 catch (Exiv2::AnyError& e) { | 168 catch (Exiv2::AnyError& e) { |
171 Exiv2::IptcData::iterator pos = exif->iptcData().end(); | 189 Exiv2::IptcData::iterator pos = exif->iptcData().end(); |
172 pos--; | 190 pos--; |
173 item = &*pos; | 191 item = &*pos; |
174 } | 192 } |
175 catch (Exiv2::AnyError& e) { | 193 catch (Exiv2::AnyError& e) { |
194 #if EXIV2_TEST_VERSION(0,16,0) | |
176 Exiv2::XmpKey ekey(key); | 195 Exiv2::XmpKey ekey(key); |
177 exif->xmpData().add(ekey, NULL); | 196 exif->xmpData().add(ekey, NULL); |
178 Exiv2::XmpData::iterator pos = exif->xmpData().end(); | 197 Exiv2::XmpData::iterator pos = exif->xmpData().end(); |
179 pos--; | 198 pos--; |
180 item = &*pos; | 199 item = &*pos; |
200 #endif | |
181 } | 201 } |
182 } | 202 } |
183 return (ExifItem *)item; | 203 return (ExifItem *)item; |
184 } | 204 } |
185 catch (Exiv2::AnyError& e) { | 205 catch (Exiv2::AnyError& e) { |
192 ExifItem *exif_get_first_item(ExifData *exif) | 212 ExifItem *exif_get_first_item(ExifData *exif) |
193 { | 213 { |
194 try { | 214 try { |
195 exif->exifIter = exif->exifData().begin(); | 215 exif->exifIter = exif->exifData().begin(); |
196 exif->iptcIter = exif->iptcData().begin(); | 216 exif->iptcIter = exif->iptcData().begin(); |
217 #if EXIV2_TEST_VERSION(0,16,0) | |
197 exif->xmpIter = exif->xmpData().begin(); | 218 exif->xmpIter = exif->xmpData().begin(); |
219 #endif | |
198 if (exif->exifIter != exif->exifData().end()) | 220 if (exif->exifIter != exif->exifData().end()) |
199 { | 221 { |
200 const Exiv2::Metadatum *item = &*exif->exifIter; | 222 const Exiv2::Metadatum *item = &*exif->exifIter; |
201 exif->exifIter++; | 223 exif->exifIter++; |
202 return (ExifItem *)item; | 224 return (ExifItem *)item; |
205 { | 227 { |
206 const Exiv2::Metadatum *item = &*exif->iptcIter; | 228 const Exiv2::Metadatum *item = &*exif->iptcIter; |
207 exif->iptcIter++; | 229 exif->iptcIter++; |
208 return (ExifItem *)item; | 230 return (ExifItem *)item; |
209 } | 231 } |
232 #if EXIV2_TEST_VERSION(0,16,0) | |
210 if (exif->xmpIter != exif->xmpData().end()) | 233 if (exif->xmpIter != exif->xmpData().end()) |
211 { | 234 { |
212 const Exiv2::Metadatum *item = &*exif->xmpIter; | 235 const Exiv2::Metadatum *item = &*exif->xmpIter; |
213 exif->xmpIter++; | 236 exif->xmpIter++; |
214 return (ExifItem *)item; | 237 return (ExifItem *)item; |
215 } | 238 } |
239 #endif | |
216 return NULL; | 240 return NULL; |
217 | 241 |
218 } | 242 } |
219 catch (Exiv2::AnyError& e) { | 243 catch (Exiv2::AnyError& e) { |
220 std::cout << "Caught Exiv2 exception '" << e << "'\n"; | 244 std::cout << "Caught Exiv2 exception '" << e << "'\n"; |
235 { | 259 { |
236 const Exiv2::Metadatum *item = &*exif->iptcIter; | 260 const Exiv2::Metadatum *item = &*exif->iptcIter; |
237 exif->iptcIter++; | 261 exif->iptcIter++; |
238 return (ExifItem *)item; | 262 return (ExifItem *)item; |
239 } | 263 } |
264 #if EXIV2_TEST_VERSION(0,16,0) | |
240 if (exif->xmpIter != exif->xmpData().end()) | 265 if (exif->xmpIter != exif->xmpData().end()) |
241 { | 266 { |
242 const Exiv2::Metadatum *item = &*exif->xmpIter; | 267 const Exiv2::Metadatum *item = &*exif->xmpIter; |
243 exif->xmpIter++; | 268 exif->xmpIter++; |
244 return (ExifItem *)item; | 269 return (ExifItem *)item; |
245 } | 270 } |
271 #endif | |
246 return NULL; | 272 return NULL; |
247 } | 273 } |
248 catch (Exiv2::AnyError& e) { | 274 catch (Exiv2::AnyError& e) { |
249 std::cout << "Caught Exiv2 exception '" << e << "'\n"; | 275 std::cout << "Caught Exiv2 exception '" << e << "'\n"; |
250 return NULL; | 276 return NULL; |
380 gchar *exif_item_get_string(ExifItem *item, int idx) | 406 gchar *exif_item_get_string(ExifItem *item, int idx) |
381 { | 407 { |
382 try { | 408 try { |
383 if (!item) return NULL; | 409 if (!item) return NULL; |
384 Exiv2::Metadatum *em = (Exiv2::Metadatum *)item; | 410 Exiv2::Metadatum *em = (Exiv2::Metadatum *)item; |
411 #if EXIV2_TEST_VERSION(0,16,0) | |
385 std::string str = em->toString(idx); | 412 std::string str = em->toString(idx); |
413 #else | |
414 std::string str = em->toString(); // FIXME | |
415 #endif | |
386 if (idx == 0 && str == "") str = em->toString(); | 416 if (idx == 0 && str == "") str = em->toString(); |
387 if (str.length() > 5 && str.substr(0, 5) == "lang=") | 417 if (str.length() > 5 && str.substr(0, 5) == "lang=") |
388 { | 418 { |
389 std::string::size_type pos = str.find_first_of(' '); | 419 std::string::size_type pos = str.find_first_of(' '); |
390 if (pos != std::string::npos) str = str.substr(pos+1); | 420 if (pos != std::string::npos) str = str.substr(pos+1); |
465 if (((Exiv2::Metadatum *)item) == &*i) { | 495 if (((Exiv2::Metadatum *)item) == &*i) { |
466 i = exif->iptcData().erase(i); | 496 i = exif->iptcData().erase(i); |
467 return 1; | 497 return 1; |
468 } | 498 } |
469 } | 499 } |
500 #if EXIV2_TEST_VERSION(0,16,0) | |
470 for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) { | 501 for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) { |
471 if (((Exiv2::Metadatum *)item) == &*i) { | 502 if (((Exiv2::Metadatum *)item) == &*i) { |
472 i = exif->xmpData().erase(i); | 503 i = exif->xmpData().erase(i); |
473 return 1; | 504 return 1; |
474 } | 505 } |
475 } | 506 } |
476 | 507 #endif |
477 return 0; | 508 return 0; |
478 } | 509 } |
479 catch (Exiv2::AnyError& e) { | 510 catch (Exiv2::AnyError& e) { |
480 return 0; | 511 return 0; |
481 } | 512 } |
521 { | 552 { |
522 throw Error(14); | 553 throw Error(14); |
523 } | 554 } |
524 type = Exiv2::ImageFactory::getType(map_data, map_len); | 555 type = Exiv2::ImageFactory::getType(map_data, map_len); |
525 | 556 |
557 #if EXIV2_TEST_VERSION(0,16,0) | |
526 TiffHeaderBase *tiffHeader; | 558 TiffHeaderBase *tiffHeader; |
559 #else | |
560 TiffHeade2 *tiffHeader; | |
561 #endif | |
527 switch (type) { | 562 switch (type) { |
528 case Exiv2::ImageType::tiff: | 563 case Exiv2::ImageType::tiff: |
529 tiffHeader = new TiffHeade2(); | 564 tiffHeader = new TiffHeade2(); |
530 break; | 565 break; |
566 #if EXIV2_TEST_VERSION(0,16,0) | |
567 | |
531 case Exiv2::ImageType::cr2: | 568 case Exiv2::ImageType::cr2: |
532 tiffHeader = new Cr2Header(); | 569 tiffHeader = new Cr2Header(); |
533 break; | 570 break; |
534 case Exiv2::ImageType::orf: | 571 case Exiv2::ImageType::orf: |
535 tiffHeader = new OrfHeader(); | 572 tiffHeader = new OrfHeader(); |
536 break; | 573 break; |
574 #endif | |
575 #if EXIV2_TEST_VERSION(0,13,0) | |
537 case Exiv2::ImageType::raf: | 576 case Exiv2::ImageType::raf: |
538 if (map_len < 84 + 4) throw Error(14); | 577 if (map_len < 84 + 4) throw Error(14); |
539 offset = getULong(map_data + 84, bigEndian); | 578 offset = getULong(map_data + 84, bigEndian); |
540 return; | 579 return; |
580 #endif | |
541 case Exiv2::ImageType::crw: | 581 case Exiv2::ImageType::crw: |
542 { | 582 { |
543 // Parse the image, starting with a CIFF header component | 583 // Parse the image, starting with a CIFF header component |
544 Exiv2::CiffHeader::AutoPtr parseTree(new Exiv2::CiffHeader); | 584 Exiv2::CiffHeader::AutoPtr parseTree(new Exiv2::CiffHeader); |
545 parseTree->read(map_data, map_len); | 585 parseTree->read(map_data, map_len); |
559 | 599 |
560 rootDir = createFct(Tag::root, Group::none); | 600 rootDir = createFct(Tag::root, Group::none); |
561 if (0 == rootDir.get()) { | 601 if (0 == rootDir.get()) { |
562 throw Error(1, "No root element defined in TIFF structure"); | 602 throw Error(1, "No root element defined in TIFF structure"); |
563 } | 603 } |
604 #if EXIV2_TEST_VERSION(0,16,0) | |
564 rootDir->setStart(map_data + tiffHeader->offset()); | 605 rootDir->setStart(map_data + tiffHeader->offset()); |
565 | 606 #else |
607 rootDir->setStart(map_data + tiffHeader->ifdOffset()); | |
608 #endif | |
566 TiffRwState::AutoPtr state( | 609 TiffRwState::AutoPtr state( |
567 new TiffRwState(tiffHeader->byteOrder(), 0, createFct)); | 610 new TiffRwState(tiffHeader->byteOrder(), 0, createFct)); |
568 | 611 |
569 TiffReader reader(map_data, | 612 TiffReader reader(map_data, |
570 map_len, | 613 map_len, |