[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:39:48 UTC 2017


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=26b488a

The following commit has been merged in the master branch:
commit 26b488a2553c778c320e3cadc0f3100be77f1ee1
Author: Andreas Huggel <ahuggel at gmx.net>
Date:   Thu Sep 18 10:26:58 2008 +0000

    Added preview support (Vladimir Nadvornik)
---
 samples/Makefile     |   1 +
 samples/prevtest.cpp |  42 ++++++
 src/Makefile         |   3 +-
 src/preview.cpp      | 362 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/preview.hpp      | 156 ++++++++++++++++++++++
 5 files changed, 563 insertions(+), 1 deletion(-)

diff --git a/samples/Makefile b/samples/Makefile
index 83ba239..f9202c6 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -65,6 +65,7 @@ BINSRC = addmoddel.cpp        \
          iptctest.cpp         \
          key-test.cpp         \
          largeiptc-test.cpp   \
+         prevtest.cpp         \
          stringto-test.cpp    \
          tiff-test.cpp        \
          write-test.cpp       \
diff --git a/samples/prevtest.cpp b/samples/prevtest.cpp
new file mode 100644
index 0000000..c9afb96
--- /dev/null
+++ b/samples/prevtest.cpp
@@ -0,0 +1,42 @@
+// ***************************************************************** -*- C++ -*-
+// prevtest.cpp, $Rev$
+// Test access to preview images
+
+#include <exiv2/image.hpp>
+#include <exiv2/preview.hpp>
+
+#include <string>
+#include <iostream>
+#include <cassert>
+
+int main(int argc, char* const argv[])
+try {
+
+    if (argc != 2) {
+        std::cout << "Usage: " << argv[0] << " file
";
+        return 1;
+    }
+
+    Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(argv[1]);
+    assert(image.get() != 0);
+    image->readMetadata();
+
+    Exiv2::PreviewImageLoader loader(*image);
+    
+    Exiv2::PreviewPropertiesList list = loader.getPreviewPropertiesList();
+
+    for (Exiv2::PreviewPropertiesList::iterator pos = list.begin(); pos != list.end(); pos++)
+    {
+        char buf[50];
+        Exiv2::PreviewImage image = loader.getPreviewImage(*pos);
+        sprintf(buf, "%ld", image.length());
+        image.writeFile(std::string(argv[1]) + "_" + buf);
+        std::cout << "found preview " << pos->id_ << ", length: " << pos->length_ << "
";
+    }
+    
+    return 0;
+}
+catch (Exiv2::AnyError& e) {
+    std::cout << "Caught Exiv2 exception '" << e << "'
";
+    return -1;
+}
diff --git a/src/Makefile b/src/Makefile
index 51cd380..fe928a8 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -94,7 +94,8 @@ ifdef HAVE_LIBZ
 CCSRC += pngimage.cpp         \
 	 pngchunk.cpp
 endif
-CCSRC += properties.cpp       \
+CCSRC += preview.cpp          \
+	 properties.cpp       \
 	 psdimage.cpp         \
 	 rafimage.cpp         \
 	 sigmamn.cpp          \
diff --git a/src/preview.cpp b/src/preview.cpp
new file mode 100644
index 0000000..419d951
--- /dev/null
+++ b/src/preview.cpp
@@ -0,0 +1,362 @@
+// ***************************************************************** -*- C++ -*-
+/*
+ * Copyright (C) 2004-2008 Andreas Huggel <ahuggel at gmx.net>
+ *
+ * This program is part of the Exiv2 distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
+ */
+/*
+  File:      preview.cpp
+  Version:   $Rev$
+  Author(s): Vladimir Nadvornik (vn) <nadvornik at suse.cz>
+  History:   18-Sep-08, vn: created
+ */
+// *****************************************************************************
+#include "rcsid.hpp"
+EXIV2_RCSID("@(#) $Id$")
+
+// *****************************************************************************
+// included header files
+#ifdef _MSC_VER
+# include "exv_msvc.h"
+#else
+# include "exv_conf.h"
+#endif
+
+#include <string>
+
+#include "preview.hpp"
+#include "futils.hpp"
+
+#include "image.hpp"
+#include "cr2image.hpp"
+
+
+namespace Exiv2 {
+
+    /*!
+      Base class for image loaders. Provides virtual methods for reading properties
+      and DataBuf.
+     */
+    class Loader {
+    protected:
+        Loader(PreviewProperties::PreviewId id, const Image &image);
+
+    public:
+        typedef std::auto_ptr<Loader> AutoPtr;
+
+        //! Create a Loader subclass for requested id
+        static Loader::AutoPtr create(PreviewProperties::PreviewId id, const Image &image);
+
+        //! Check if a preview image with given params exists in the image
+        virtual bool valid() const = 0;
+
+        //! Get properties of a preview image with given params
+        virtual PreviewProperties getProperties() const;
+
+        //! Get properties of a preview image with given params
+        virtual DataBuf getData() const = 0;
+
+        //! A number of image loaders configured in the loaderList_ table
+        static PreviewProperties::PreviewId getNumLoaders();
+        
+    protected:
+        typedef AutoPtr (*CreateFunc)(PreviewProperties::PreviewId id, const Image &image, int parIdx);
+
+        struct LoaderList {
+            const char *imageMimeType_; //!< Image type for which is the loader valid, NULL matches all images
+            CreateFunc create_;         //!< Function that creates particular loader instance
+            int parIdx_;                //!< Parameter that is passed into CreateFunc
+
+        };
+
+        static const LoaderList loaderList_[]; // PreviewId is an index to this table
+
+        PreviewProperties::PreviewId id_;
+        const Image &image_;
+    };
+
+
+    //! Loader for Jpeg previews that are not read into ExifData directly
+    class LoaderExifJpeg : public Loader {
+    public:
+        LoaderExifJpeg(PreviewProperties::PreviewId id, const Image &image, int parIdx);
+
+        virtual bool valid() const;
+        virtual PreviewProperties getProperties() const;
+        virtual DataBuf getData() const;
+
+        long getOffset() const;
+        long getLength() const;
+
+    protected:
+    
+        // this table lists possible offset/length key pairs
+        // parIdx is an index to this table
+        
+        struct Param {
+            const char* offsetKey_;  
+            const char* lengthKey_;
+        };
+        static const Param param_[];
+        
+        ExifKey offsetKey_;
+        ExifKey lengthKey_;
+    };
+
+    Loader::AutoPtr createLoaderExifJpeg(PreviewProperties::PreviewId id, const Image &image, int parIdx);
+
+
+    //! Loader for standard Exif thumbnail - just a wrapper around ExifThumbC
+    class LoaderExifThumbC : public Loader {
+    public:
+        LoaderExifThumbC(PreviewProperties::PreviewId id, const Image &image);
+
+        virtual bool valid() const;
+        virtual PreviewProperties getProperties() const;
+        virtual DataBuf getData() const;
+
+    protected:
+	ExifThumbC thumb_;
+    };
+
+    Loader::AutoPtr createLoaderExifThumbC(PreviewProperties::PreviewId id, const Image &image, int parIdx);
+
+// *****************************************************************************
+// class member definitions
+
+    const Loader::LoaderList Loader::loaderList_[] = {
+        { NULL,                 createLoaderExifThumbC, 0},
+        { NULL,                 createLoaderExifJpeg, 0},
+        { NULL,                 createLoaderExifJpeg, 1},
+        { NULL,                 createLoaderExifJpeg, 2},
+        { NULL,                 createLoaderExifJpeg, 3},
+        { "image/x-canon-cr2",  createLoaderExifJpeg, 4} // FIXME: this needs to be fixed (enabled) in cr2image.cpp
+        };
+
+    const LoaderExifJpeg::Param LoaderExifJpeg::param_[] = {
+        { "Exif.Image.JPEGInterchangeFormat",           "Exif.Image.JPEGInterchangeFormatLength"        }, // 0
+        { "Exif.SubImage1.JPEGInterchangeFormat",       "Exif.SubImage1.JPEGInterchangeFormatLength",   }, // 1
+        { "Exif.SubImage2.JPEGInterchangeFormat",       "Exif.SubImage2.JPEGInterchangeFormatLength",   }, // 2
+        { "Exif.Image2.JPEGInterchangeFormat",          "Exif.Image2.JPEGInterchangeFormatLength",      }, // 3
+        { "Exif.Image.StripOffsets",                    "Exif.Image.StripByteCounts",                   }, // 4
+        };
+
+
+    PreviewImage::PreviewImage(const PreviewProperties &properties, DataBuf &data)
+            : properties_(properties), data_(data)
+    {
+    }
+
+    PreviewImage::PreviewImage(const PreviewImage &src)
+            : properties_(src.properties_), data_(const_cast<DataBuf&>(src.data_))
+    {
+    }
+
+
+    long PreviewImage::writeFile(const std::string& path) const
+    {
+        std::string name = path + extension();
+        return Exiv2::writeFile(data_, name);
+    }
+
+    DataBuf &PreviewImage::data()
+    {
+        return data_;
+    }
+
+    const char* PreviewImage::mimeType() const
+    {
+        return properties_.mimeType_;
+    }
+
+    const char* PreviewImage::extension() const
+    {
+        return properties_.extension_;
+    }
+
+    long PreviewImage::length() const
+    {
+        return properties_.length_;
+    }
+
+    Loader::AutoPtr Loader::create(PreviewProperties::PreviewId id, const Image &image)
+    {
+            if (id < 0 || id >= Loader::getNumLoaders())
+                return AutoPtr();
+
+            if (loaderList_[id].imageMimeType_ &&
+                std::string(loaderList_[id].imageMimeType_) != std::string(image.mimeType()))
+                return AutoPtr();
+
+            AutoPtr loader = loaderList_[id].create_(id, image, loaderList_[id].parIdx_);
+
+            if (loader.get() && !loader->valid()) loader.reset();
+            return loader;
+    }
+
+    Loader::Loader(PreviewProperties::PreviewId id, const Image &image)
+            : id_(id), image_(image)
+    {
+    }
+
+    PreviewProperties Loader::getProperties() const
+    {
+        PreviewProperties prop;
+        prop.id_ = id_;
+        return prop;
+    }
+
+    PreviewProperties::PreviewId Loader::getNumLoaders()
+    {
+        return (PreviewProperties::PreviewId)EXV_COUNTOF(loaderList_);
+    }
+
+    LoaderExifJpeg::LoaderExifJpeg(PreviewProperties::PreviewId id, const Image &image, int parIdx)
+            : Loader(id, image), 
+              offsetKey_(param_[parIdx].offsetKey_),
+              lengthKey_(param_[parIdx].lengthKey_)
+    {
+    }
+
+    Loader::AutoPtr createLoaderExifJpeg(PreviewProperties::PreviewId id, const Image &image, int parIdx)
+    {
+            return Loader::AutoPtr(new LoaderExifJpeg(id, image, parIdx));
+    }
+
+    long LoaderExifJpeg::getLength() const
+    {
+        long length = 0;
+        ExifData::const_iterator pos = image_.exifData().findKey(lengthKey_);
+        if (pos != image_.exifData().end()) {
+            length = pos->toLong();
+        }
+        return length;
+    }
+
+    long LoaderExifJpeg::getOffset() const
+    {
+        long offset = 0;
+        ExifData::const_iterator pos = image_.exifData().findKey(offsetKey_);
+        if (pos != image_.exifData().end()) {
+            offset = pos->toLong();
+        }
+        return offset;
+    }
+
+    bool LoaderExifJpeg::valid() const
+    {
+        long offset = getOffset();
+        long length = getLength();
+
+        if (offset == 0 || length == 0) return false;
+        if (offset + length > image_.io().size()) return false;
+        return true;
+    }
+
+    PreviewProperties LoaderExifJpeg::getProperties() const
+    {
+        PreviewProperties prop = Loader::getProperties();
+        prop.mimeType_ = "image/jpeg";
+        prop.extension_ = ".jpg";
+        prop.length_ = getLength(); 
+        return prop;
+    }
+
+    DataBuf LoaderExifJpeg::getData() const
+    {
+        if (!valid()) return DataBuf();
+        BasicIo &io = image_.io();
+
+        if (io.open() != 0) {
+            throw Error(9, io.path(), strError());
+        }
+        IoCloser closer(io);
+
+        long offset = getOffset();
+        long length = getLength();
+
+        const byte *base = io.mmap();
+
+        return DataBuf(base + offset, length);
+    }
+
+
+    LoaderExifThumbC::LoaderExifThumbC(PreviewProperties::PreviewId id, const Image &image)
+            : Loader(id, image), 
+              thumb_(image_.exifData())
+    {
+    }
+
+    Loader::AutoPtr createLoaderExifThumbC(PreviewProperties::PreviewId id, const Image &image, int /* parIdx */)
+    {
+        return Loader::AutoPtr(new LoaderExifThumbC(id, image));
+    }
+
+    bool LoaderExifThumbC::valid() const
+    {
+        return thumb_.copy().size_ > 0; // FIXME: this is inefficient
+    }
+
+    PreviewProperties LoaderExifThumbC::getProperties() const
+    {
+        PreviewProperties prop = Loader::getProperties();
+        prop.length_ = thumb_.copy().size_; // FIXME: this is inefficient
+        prop.mimeType_ = thumb_.mimeType();
+        prop.extension_ = thumb_.extension();
+        return prop;
+    }
+
+    DataBuf LoaderExifThumbC::getData() const
+    {
+        return thumb_.copy();
+    }
+
+    bool cmpPreviewProperties(const PreviewProperties& lhs, const PreviewProperties& rhs)
+    {
+        return lhs.length_ < rhs.length_;
+    }
+
+    PreviewImageLoader::PreviewImageLoader(const Image& image)
+            : image_(image)
+    {
+    }
+
+    PreviewPropertiesList PreviewImageLoader::getPreviewPropertiesList() const
+    {
+        PreviewPropertiesList list;
+        // go through the loader table and store all successfuly created loaders in the list
+        for (PreviewProperties::PreviewId id = 0; id < Loader::getNumLoaders(); id++) {
+            Loader::AutoPtr loader = Loader::create(id, image_);
+            if (loader.get()) {
+                list.push_back(loader->getProperties());
+            }
+        }
+        std::sort(list.begin(), list.end(), cmpPreviewProperties);
+        return list;
+    }
+
+    PreviewImage PreviewImageLoader::getPreviewImage(const PreviewProperties &properties) const
+    {
+        Loader::AutoPtr loader = Loader::create(properties.id_, image_);
+        DataBuf buf;
+        if (loader.get()) {
+            buf = loader->getData();
+        }
+        return PreviewImage(properties, buf);
+    }
+
+}                                       // namespace Exiv2
diff --git a/src/preview.hpp b/src/preview.hpp
new file mode 100644
index 0000000..13fedf7
--- /dev/null
+++ b/src/preview.hpp
@@ -0,0 +1,156 @@
+// ***************************************************************** -*- C++ -*-
+/*
+ * Copyright (C) 2004-2008 Andreas Huggel <ahuggel at gmx.net>
+ *
+ * This program is part of the Exiv2 distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
+ */
+/*!
+  @file    preview.hpp
+  @brief   Classes to access preview images embedded in an image.
+  @version $Rev$
+  @author  Vladimir Nadvornik (vn)
+           <a href="mailto:nadvornik at suse.cz">nadvornik at suse.cz</a>
+  @date    18-Sep-08, vn: created
+ */
+#ifndef PREVIEW_HPP_
+#define PREVIEW_HPP_
+
+// *****************************************************************************
+// included header files
+#include "types.hpp"
+#include "image.hpp"
+#include "basicio.hpp"
+
+// *****************************************************************************
+// namespace extensions
+namespace Exiv2 {
+
+// *****************************************************************************
+// class definitions
+
+    /*!
+      @brief Preview image properties.
+     */
+    struct PreviewProperties
+    {
+    public:
+        //! type of preview image.
+        typedef int PreviewId;
+    
+        //! Preview image mime type.
+        const char* mimeType_;
+
+        //! Preview image extension.
+        const char* extension_;
+
+        //! Preview image length in bytes.
+        long length_;
+
+        //! identifies type of preview image.
+        PreviewId id_;
+    };
+
+    //! Container type to hold all preview images metadata.
+    typedef std::vector<PreviewProperties> PreviewPropertiesList;
+
+    /*!
+      @brief Compare two preview images by length. Return true if the 
+             lhs is smaller than rhs.
+     */
+    bool cmpPreviewProperties(const PreviewProperties& lhs, const PreviewProperties& rhs);
+
+    /*!
+      @brief Class that holds preview image properties and data buffer.
+     */
+    class PreviewImage {
+    public:
+        //@{
+        //! Constructor.
+        PreviewImage(const PreviewProperties &properties, DataBuf &data);
+
+        //! Copy constructor
+        PreviewImage(const PreviewImage &src);
+        //@}
+
+        //! @name Accessors
+        //@{
+
+        /*!
+          @brief Return a reference to image data.
+         */
+        DataBuf &data();
+
+        /*!
+          @brief Write the thumbnail image to a file.
+
+          A filename extension is appended to \em path according to the image
+          type of the thumbnail, so \em path should not include an extension.
+          The function will overwrite an existing file of the same name.
+
+          @param path File name of the thumbnail without extension.
+          @return The number of bytes written.
+        */
+        long writeFile(const std::string& path) const;
+        /*!
+          @brief Return the MIME type of the thumbnail, either 
-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list