summaryrefslogtreecommitdiffstats
path: root/src/libs/dimg/loaders/dimgloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dimg/loaders/dimgloader.cpp')
-rw-r--r--src/libs/dimg/loaders/dimgloader.cpp200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/libs/dimg/loaders/dimgloader.cpp b/src/libs/dimg/loaders/dimgloader.cpp
new file mode 100644
index 00000000..615b11e1
--- /dev/null
+++ b/src/libs/dimg/loaders/dimgloader.cpp
@@ -0,0 +1,200 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2005-06-14
+ * Description : DImg image loader interface
+ *
+ * Copyright (C) 2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
+ * Copyright (C) 2005-2009 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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, 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.
+ *
+ * ============================================================ */
+
+// KDE includes.
+
+#include <kstandarddirs.h>
+
+// Local includes.
+
+#include "ddebug.h"
+#include "dimgprivate.h"
+#include "dmetadata.h"
+#include "dimgloaderobserver.h"
+#include "dimgloader.h"
+
+namespace Digikam
+{
+
+DImgLoader::DImgLoader(DImg* image)
+ : m_image(image)
+{
+}
+
+int DImgLoader::granularity(DImgLoaderObserver *observer, int total, float progressSlice)
+{
+ // Splits expect total value into the chunks where checks shall occur
+ // and combines this with a possible correction factor from observer.
+ // Progress slice is the part of 100% concerned with the current granularity
+ // (E.g. in a loop only the values from 10% to 90% are used, then progressSlice is 0.8)
+ // Current default is 1/20, that is progress info every 5%
+ int granularity=0;
+
+ if (observer)
+ granularity = (int)(( total / (20 * progressSlice)) / observer->granularity());
+
+ return granularity ? granularity : 1;
+}
+
+unsigned char*& DImgLoader::imageData()
+{
+ return m_image->m_priv->data;
+}
+
+unsigned int& DImgLoader::imageWidth()
+{
+ return m_image->m_priv->width;
+}
+
+unsigned int& DImgLoader::imageHeight()
+{
+ return m_image->m_priv->height;
+}
+
+bool DImgLoader::imageHasAlpha()
+{
+ return m_image->hasAlpha();
+}
+
+bool DImgLoader::imageSixteenBit()
+{
+ return m_image->sixteenBit();
+}
+
+int DImgLoader::imageBitsDepth()
+{
+ return m_image->bitsDepth();
+}
+
+int DImgLoader::imageBytesDepth()
+{
+ return m_image->bytesDepth();
+}
+
+TQMap<int, TQByteArray>& DImgLoader::imageMetaData()
+{
+ return m_image->m_priv->metaData;
+}
+
+TQVariant DImgLoader::imageGetAttribute(const TQString& key)
+{
+ return m_image->attribute(key);
+}
+
+TQString DImgLoader::imageGetEmbbededText(const TQString& key)
+{
+ return m_image->embeddedText(key);
+}
+
+void DImgLoader::imageSetAttribute(const TQString& key, const TQVariant& value)
+{
+ m_image->setAttribute(key, value);
+}
+
+TQMap<TQString, TQString>& DImgLoader::imageEmbeddedText()
+{
+ return m_image->m_priv->embeddedText;
+}
+
+void DImgLoader::imageSetEmbbededText(const TQString& key, const TQString& text)
+{
+ m_image->setEmbeddedText(key, text);
+}
+
+bool DImgLoader::readMetadata(const TQString& filePath, DImg::FORMAT /*ff*/)
+{
+ TQMap<int, TQByteArray>& imageMetadata = imageMetaData();
+ imageMetadata.clear();
+
+ DMetadata metaDataFromFile(filePath);
+ if (!metaDataFromFile.load(filePath))
+ return false;
+
+ // Do not insert null data into metaData map:
+ // Even if byte array is null, if there is a key in the map, it will
+ // be interpreted as "There was data, so write it again to the file".
+ if (!metaDataFromFile.getComments().isNull())
+ imageMetadata.insert(DImg::COM, metaDataFromFile.getComments());
+ if (!metaDataFromFile.getExif().isNull())
+ imageMetadata.insert(DImg::EXIF, metaDataFromFile.getExif());
+ if (!metaDataFromFile.getIptc().isNull())
+ imageMetadata.insert(DImg::IPTC, metaDataFromFile.getIptc());
+
+ return true;
+}
+
+bool DImgLoader::saveMetadata(const TQString& filePath)
+{
+ DMetadata metaDataToFile(filePath);
+ metaDataToFile.setComments(m_image->getComments());
+ metaDataToFile.setExif(m_image->getExif());
+ metaDataToFile.setIptc(m_image->getIptc());
+ return metaDataToFile.applyChanges();
+}
+
+bool DImgLoader::checkExifWorkingColorSpace()
+{
+ DMetadata metaData;
+ metaData.setExif(m_image->getExif());
+
+ // Check if Exif data contains an ICC color profile.
+ TQByteArray profile = metaData.getExifTagData("Exif.Image.InterColorProfile");
+ if (!profile.isNull())
+ {
+ DDebug() << "Found an ICC profile in Exif metadata" << endl;
+ m_image->setICCProfil(profile);
+ return true;
+ }
+
+ // Else check the Exif color-space tag and use a default profiles available in digiKam.
+ TDEGlobal::dirs()->addResourceType("profiles", TDEGlobal::dirs()->kde_default("data") + "digikam/profiles");
+
+ switch(metaData.getImageColorWorkSpace())
+ {
+ case DMetadata::WORKSPACE_SRGB:
+ {
+ TQString directory = TDEGlobal::dirs()->findResourceDir("profiles", "srgb-d65.icm");
+ m_image->getICCProfilFromFile(directory + "srgb-d65.icm");
+ DDebug() << "Exif color-space tag is sRGB. Using default sRGB ICC profile." << endl;
+ return true;
+ break;
+ }
+
+ case DMetadata::WORKSPACE_ADOBERGB:
+ {
+ TQString directory = TDEGlobal::dirs()->findResourceDir("profiles", "adobergb.icm");
+ m_image->getICCProfilFromFile(directory + "adobergb.icm");
+ DDebug() << "Exif color-space tag is AdobeRGB. Using default AdobeRGB ICC profile." << endl;
+ return true;
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+} // NameSpace Digikam