Mercurial > geeqie
comparison src/exiv2.cc @ 1048:95c418661be8
updated preview loader to work with current svn version of libexiv2
author | nadvornik |
---|---|
date | Sat, 27 Sep 2008 18:48:32 +0000 |
parents | 448d174454e1 |
children | 338c21c87ff5 |
comparison
equal
deleted
inserted
replaced
1047:81ec7d977d5f | 1048:95c418661be8 |
---|---|
607 #if EXIV2_TEST_VERSION(0,17,90) | 607 #if EXIV2_TEST_VERSION(0,17,90) |
608 | 608 |
609 guchar *exif_get_preview(ExifData *exif, guint *data_len) | 609 guchar *exif_get_preview(ExifData *exif, guint *data_len) |
610 { | 610 { |
611 if (!exif) return NULL; | 611 if (!exif) return NULL; |
612 try { | 612 |
613 | 613 const char* path = exif->image->io().path().c_str(); |
614 Exiv2::PreviewImageList list(*exif->image); | 614 /* given image pathname, first do simple (and fast) file extension test */ |
615 list.read(); | 615 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return NULL; |
616 | 616 |
617 Exiv2::PreviewImageList::iterator pos = list.begin(); | 617 try { |
618 if (pos != list.end()) | 618 |
619 { | 619 Exiv2::PreviewImageLoader loader(*exif->image); |
620 Exiv2::DataBuf buf = pos->copy(); | 620 |
621 Exiv2::PreviewPropertiesList list = loader.getPreviewPropertiesList(); | |
622 | |
623 if (!list.empty()) | |
624 { | |
625 Exiv2::PreviewPropertiesList::iterator pos = --list.end(); | |
626 | |
627 Exiv2::PreviewImage image = loader.getPreviewImage(*pos); | |
628 | |
629 Exiv2::DataBuf &buf = image.data(); | |
621 std::pair<Exiv2::byte*, long> p = buf.release(); | 630 std::pair<Exiv2::byte*, long> p = buf.release(); |
622 | 631 |
623 *data_len = p.second; | 632 *data_len = p.second; |
624 return p.first; | 633 return p.first; |
625 } | 634 } |
626 return NULL; | 635 return NULL; |
627 } | 636 } |
628 catch (Exiv2::AnyError& e) { | 637 catch (Exiv2::AnyError& e) { |
629 std::cout << "Caught Exiv2 exception '" << e << "'\n"; | 638 std::cout << "Caught Exiv2 exception '" << e << "'\n"; |
678 | 687 |
679 if (!exif) return NULL; | 688 if (!exif) return NULL; |
680 const char* path = exif->image->io().path().c_str(); | 689 const char* path = exif->image->io().path().c_str(); |
681 | 690 |
682 /* given image pathname, first do simple (and fast) file extension test */ | 691 /* given image pathname, first do simple (and fast) file extension test */ |
683 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return 0; | 692 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return NULL; |
684 | 693 |
685 try { | 694 try { |
686 struct stat st; | 695 struct stat st; |
687 guchar *map_data; | 696 guchar *map_data; |
688 size_t map_len; | 697 size_t map_len; |
694 DEBUG_1("%s: offset %lu", path, offset); | 703 DEBUG_1("%s: offset %lu", path, offset); |
695 | 704 |
696 fd = open(path, O_RDONLY); | 705 fd = open(path, O_RDONLY); |
697 if (fd == -1) | 706 if (fd == -1) |
698 { | 707 { |
699 return 0; | 708 return NULL; |
700 } | 709 } |
701 | 710 |
702 if (fstat(fd, &st) == -1) | 711 if (fstat(fd, &st) == -1) |
703 { | 712 { |
704 close(fd); | 713 close(fd); |
705 return 0; | 714 return NULL; |
706 } | 715 } |
707 map_len = st.st_size; | 716 map_len = st.st_size; |
708 map_data = (guchar *) mmap(0, map_len, PROT_READ, MAP_PRIVATE, fd, 0); | 717 map_data = (guchar *) mmap(0, map_len, PROT_READ, MAP_PRIVATE, fd, 0); |
709 close(fd); | 718 close(fd); |
710 if (map_data == MAP_FAILED) | 719 if (map_data == MAP_FAILED) |
711 { | 720 { |
712 return 0; | 721 return NULL; |
713 } | 722 } |
714 *data_len = map_len - offset; | 723 *data_len = map_len - offset; |
715 ud = g_new(UnmapData, 1); | 724 ud = g_new(UnmapData, 1); |
716 ud->ptr = map_data + offset; | 725 ud->ptr = map_data + offset; |
717 ud->map_data = map_data; | 726 ud->map_data = map_data; |