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

List:       kde-commits
Subject:    koffice/filters/krita
From:       Cyrille Berger <cyb () lepi ! org>
Date:       2008-02-03 21:45:21
Message-ID: 1202075121.283249.10364.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 770516 by berger:

read XMP meta data

 M  +35 -12    jpeg/kis_jpeg_converter.cc  
 M  +1 -0      libkisexiv2/CMakeLists.txt  
 M  +1 -2      libkisexiv2/kis_exif_io.cpp  
 M  +1 -2      libkisexiv2/kis_exif_io.h  
 M  +39 -0     libkisexiv2/kis_exiv2.cpp  
 AM            libkisexiv2/kis_xmp_io.cpp   [License: LGPL (v2)]
 AM            libkisexiv2/kis_xmp_io.h   [License: LGPL (v2)]


--- trunk/koffice/filters/krita/jpeg/kis_jpeg_converter.cc #770515:770516
@@ -60,21 +60,22 @@
 const char photoshopMarker[] = "Photoshop 3.0\0";
 const char photoshopBimId_[] = "8BIM";
 const uint16_t photoshopIptc = 0x0404;
+const char xmpMarker[] = "http://ns.adobe.com/xap/1.0/\0";
 const QByteArray photoshopIptc_((char*)&photoshopIptc, 2);
 
 namespace {
 
     J_COLOR_SPACE getColorTypeforColorSpace( const KoColorSpace * cs)
     {
-        if ( KoID(cs->id()) == KoID("GRAYA") || KoID(cs->id()) == KoID("GRAYA16") )
+        if ( KoID(cs->id()) == KoID("GRAYA") or KoID(cs->id()) == KoID("GRAYA16") )
         {
             return JCS_GRAYSCALE;
         }
-        if ( KoID(cs->id()) == KoID("RGBA") || KoID(cs->id()) == KoID("RGBA16") )
+        if ( KoID(cs->id()) == KoID("RGBA") or KoID(cs->id()) == KoID("RGBA16") )
         {
             return JCS_RGB;
         }
-        if ( KoID(cs->id()) == KoID("CMYK") || KoID(cs->id()) == KoID("CMYK16") )
+        if ( KoID(cs->id()) == KoID("CMYK") or KoID(cs->id()) == KoID("CMYK16") )
         {
             return JCS_CMYK;
         }
@@ -264,15 +265,15 @@
 
     for (jpeg_saved_marker_ptr marker = cinfo.marker_list; marker != NULL; marker = marker->next) {
         dbgFile <<"Marker is" << marker->marker;
-        if (marker->marker != (JOCTET) (JPEG_APP0 + 1) ||
+        if (marker->marker != (JOCTET) (JPEG_APP0 + 1) or
             marker->data_length < 14)
             continue; /* Exif data is in an APP1 marker of at least 14 octets */
 
-        if (GETJOCTET (marker->data[0]) != (JOCTET) 0x45 ||
-            GETJOCTET (marker->data[1]) != (JOCTET) 0x78 ||
-            GETJOCTET (marker->data[2]) != (JOCTET) 0x69 ||
-            GETJOCTET (marker->data[3]) != (JOCTET) 0x66 ||
-            GETJOCTET (marker->data[4]) != (JOCTET) 0x00 ||
+        if (GETJOCTET (marker->data[0]) != (JOCTET) 0x45 or
+            GETJOCTET (marker->data[1]) != (JOCTET) 0x78 or
+            GETJOCTET (marker->data[2]) != (JOCTET) 0x69 or
+            GETJOCTET (marker->data[3]) != (JOCTET) 0x66 or
+            GETJOCTET (marker->data[4]) != (JOCTET) 0x00 or
             GETJOCTET (marker->data[5]) != (JOCTET) 0x00)
             continue; /* no Exif header */
         dbgFile <<"Found exif information of length :"<< marker->data_length;
@@ -324,7 +325,7 @@
 
     for (jpeg_saved_marker_ptr marker = cinfo.marker_list; marker != NULL; marker = marker->next) {
         dbgFile <<"Marker is" << marker->marker;
-        if (marker->marker != (JOCTET) (JPEG_APP0 + 13) ||
+        if (marker->marker != (JOCTET) (JPEG_APP0 + 13) or
             marker->data_length < 14)
             continue; /* IPTC data is in an APP13 marker of at least 16 octets */
 
@@ -335,7 +336,7 @@
                 dbgFile << (int)(*(marker->data+i)) <<"" << (int)(photoshopMarker[i]);
             }
             dbgFile <<"No photoshop marker";
-            break; /* No IPTC Header */
+            continue; /* No IPTC Header */
         }
 
         dbgFile <<"Found Photoshop information of length :"<< marker->data_length;
@@ -358,6 +359,28 @@
         }
         break;
     }
+    
+    dbgFile <<"Looking for XMP information";
+    
+    for (jpeg_saved_marker_ptr marker = cinfo.marker_list; marker != NULL; marker = marker->next) {
+        dbgFile <<"Marker is" << marker->marker;
+        if (marker->marker != (JOCTET) (JPEG_APP0 + 1) or marker->data_length < 31)
+        {
+            continue; /* XMP data is in an APP1 marker of at least 31 octets */
+        }
+        if( memcmp(marker->data, xmpMarker, 29) != 0 )
+        {
+            dbgFile <<"Not XMP marker";
+            continue; /* No xmp Header */
+        }
+        dbgFile << "Found XMP Marker of length " << marker->data_length;
+        QByteArray byteArray( (const char*)marker->data + 29, marker->data_length - 29);
+        KisMetaData::IOBackend* xmpIO = KisMetaData::IOBackendRegistry::instance()->value("xmp");
+        Q_ASSERT(xmpIO);
+        xmpIO->loadFrom( layer->metaData(), new QBuffer( &byteArray ) );
+        break;
+    }
+    
     // Dump loaded metadata
     layer->metaData()->debugDump();
 
@@ -583,7 +606,7 @@
     // Save annotation
     vKisAnnotationSP_it it = annotationsStart;
     while(it != annotationsEnd) {
-        if (!(*it) || (*it) -> type() == QString()) {
+        if (!(*it) or (*it) -> type() == QString()) {
             dbgFile <<"Warning: empty annotation";
             ++it;
             continue;
--- trunk/koffice/filters/krita/libkisexiv2/CMakeLists.txt #770515:770516
@@ -3,6 +3,7 @@
 set(libkisexiv2_LIB_SRCS
     ${CMAKE_SOURCE_DIR}/filters/krita/libkisexiv2/kis_exif_io.cpp
     ${CMAKE_SOURCE_DIR}/filters/krita/libkisexiv2/kis_iptc_io.cpp
+    ${CMAKE_SOURCE_DIR}/filters/krita/libkisexiv2/kis_xmp_io.cpp
     ${CMAKE_SOURCE_DIR}/filters/krita/libkisexiv2/kis_exiv2.cpp
     )
 
--- trunk/koffice/filters/krita/libkisexiv2/kis_exif_io.cpp #770515:770516
@@ -3,8 +3,7 @@
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU Lesser General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
+ *  the Free Software Foundation; version 2 of the License.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
--- trunk/koffice/filters/krita/libkisexiv2/kis_exif_io.h #770515:770516
@@ -3,8 +3,7 @@
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU Lesser General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
+ *  the Free Software Foundation; version 2 of the License.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
--- trunk/koffice/filters/krita/libkisexiv2/kis_exiv2.cpp #770515:770516
@@ -18,6 +18,7 @@
 
 #include "kis_iptc_io.h"
 #include "kis_exif_io.h"
+#include "kis_xmp_io.h"
 
 #include "kis_exiv2.h"
 
@@ -74,6 +75,43 @@
         case Exiv2::date:
         case Exiv2::time:
             return KisMetaData::Value(QDateTime::fromString(value->toString().c_str(), Qt::ISODate));
+        case Exiv2::xmpText:
+            return KisMetaData::Value( value->toString().c_str() );
+        case Exiv2::langAlt:
+        {
+            
+            return KisMetaData::Value();
+        }
+        case Exiv2::xmpBag:
+        case Exiv2::xmpSeq:
+        case Exiv2::xmpAlt:
+        {
+            const Exiv2::XmpArrayValue* xav = dynamic_cast<const Exiv2::XmpArrayValue*>(value.get());
+            Q_ASSERT(xav);
+            QList<KisMetaData::Value> array;
+            for(std::vector< std::string >::const_iterator it = xav->value_.begin();
+                it != xav->value_.end(); ++it)
+            {
+                array.push_back( KisMetaData::Value( it->c_str() ) );
+            }
+            KisMetaData::Value::ValueType vt = KisMetaData::Value::Invalid;
+            switch(xav->xmpArrayType())
+            {
+                case Exiv2::XmpValue::xaNone:
+                    Q_ASSERT(false);
+                    break;
+                case Exiv2::XmpValue::xaAlt:
+                    vt = KisMetaData::Value::AlternativeArray;
+                    break;
+                case Exiv2::XmpValue::xaBag:
+                    vt = KisMetaData::Value::UnorderedArray;
+                    break;
+                case Exiv2::XmpValue::xaSeq:
+                    vt = KisMetaData::Value::OrderedArray;
+                    break;
+            }
+            return KisMetaData::Value( array, vt);
+        }
     }
     dbgFile <<"Unknown type id :" << value->typeId() <<" value =" << value->toString().c_str();
     Q_ASSERT(false); // This point must never be reached !
@@ -158,6 +196,7 @@
     {
         KisMetaData::IOBackendRegistry::instance()->add(new KisIptcIO);
         KisMetaData::IOBackendRegistry::instance()->add(new KisExifIO);
+        KisMetaData::IOBackendRegistry::instance()->add(new KisXMPIO);
     }
 };
 
** trunk/koffice/filters/krita/libkisexiv2/kis_xmp_io.cpp #property svn:eol-style
   + native
** trunk/koffice/filters/krita/libkisexiv2/kis_xmp_io.cpp #property svn:keywords
   + Id
** trunk/koffice/filters/krita/libkisexiv2/kis_xmp_io.h #property svn:eol-style
   + native
** trunk/koffice/filters/krita/libkisexiv2/kis_xmp_io.h #property svn:keywords
   + Id
[prev in list] [next in list] [prev in thread] [next in thread] 

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