[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