[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/krita/ui/kisexiv2
From:       Cyrille Berger <cyb () lepi ! org>
Date:       2009-01-18 21:51:14
Message-ID: 1232315474.786060.24784.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 913194 by berger:

correctly serialize CFA pattern from exif values

 M  +43 -0     kis_exif_io.cpp  


--- trunk/koffice/krita/ui/kisexiv2/kis_exif_io.cpp #913193:913194
@@ -211,6 +211,45 @@
     return new Exiv2::DataValue((const Exiv2::byte*)array.data(), array.size());
 }
 
+KisMetaData::Value cfaPatternExifToKMD(const Exiv2::Value::AutoPtr value)
+{
+    QMap<QString, KisMetaData::Value> cfaPatternStructure;
+    const Exiv2::DataValue* dvalue = dynamic_cast<const Exiv2::DataValue*>(&*value);
+    Q_ASSERT(dvalue);
+    QByteArray array(dvalue->count(), 0);
+    dvalue->copy((Exiv2::byte*)array.data());
+    int columns = (reinterpret_cast<quint16*>(array.data()))[0];
+    int rows = (reinterpret_cast<quint16*>(array.data()))[1];
+    cfaPatternStructure["Columns"] = KisMetaData::Value(columns);
+    cfaPatternStructure["Rows"] = KisMetaData::Value(rows);
+    QList<KisMetaData::Value> values;
+    int index = 4;
+    for (int i = 0; i < columns * rows; i++) {
+        values.append( KisMetaData::Value( *(array.data() + index) ) );
+        index++;
+    }
+    cfaPatternStructure["Values"] = KisMetaData::Value(values, KisMetaData::Value::OrderedArray);
+        return KisMetaData::Value(cfaPatternStructure);
+}
+
+Exiv2::Value* cfaPatternKMDToExif(const KisMetaData::Value& value)
+{
+    QMap<QString, KisMetaData::Value> cfaStructure = value.asStructure();
+    quint16 columns = cfaStructure["Columns"].asVariant().toInt(0);
+    quint16 rows = cfaStructure["Rows"].asVariant().toInt(0);
+
+    QList<KisMetaData::Value> values = cfaStructure["Values"].asArray();
+    Q_ASSERT(columns*rows == values.size());
+    QByteArray array(4 + columns*rows, 0);
+    (reinterpret_cast<quint16*>(array.data()))[0] = columns;
+    (reinterpret_cast<quint16*>(array.data()))[1] = rows;
+    for (int i = 0; i < columns * rows; i++) {
+        int val = values[i].asVariant().toInt();
+        *(array.data() + 4 + i) = val;
+    }
+    return new Exiv2::DataValue((const Exiv2::byte*)array.data(), array.size());
+}
+
 // Read and write Flash //
 
 KisMetaData::Value flashExifToKMD(const Exiv2::Value::AutoPtr value)
@@ -324,6 +363,8 @@
                 v = kmdOECFStructureToExifOECF(entry.value());
             } else if (exivKey == "Exif.Photo.DeviceSettingDescription") {
                 v = deviceSettingDescriptionKMDToExif(entry.value());
+            } else if (exivKey == "Exif.Photo.CFAPattern") {
+                v = cfaPatternKMDToExif(entry.value());
             } else if (exivKey == "Exif.Photo.Flash") {
                 v = flashKMDToExif(entry.value());
             } else {
@@ -415,6 +456,8 @@
                 v = KisMetaData::Value(exivValueToDateTime(it->getValue()));
             } else if (it->key() == "Exif.Photo.DeviceSettingDescription") {
                 v = deviceSettingDescriptionExifToKMD(it->getValue());
+            } else if (it->key() == "Exif.Photo.CFAPattern") {
+                v = cfaPatternExifToKMD(it->getValue());
             } else if (it->key() == "Exif.Photo.Flash") {
                 v = flashExifToKMD(it->getValue());
             } else {
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic