Date: Tuesday, May 5, 2015 @ 23:22:17 Author: arojas Revision: 238514
Update to 2.9.4 Modified: calligra/trunk/PKGBUILD Deleted: calligra/trunk/krita_psd.patch calligra/trunk/krita_psd2.patch ------------------+ PKGBUILD | 18 - krita_psd.patch | 24 - krita_psd2.patch | 754 ----------------------------------------------------- 3 files changed, 5 insertions(+), 791 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2015-05-05 18:07:25 UTC (rev 238513) +++ PKGBUILD 2015-05-05 21:22:17 UTC (rev 238514) @@ -20,8 +20,8 @@ 'calligra-sheets' 'calligra-stage' 'calligra-words') -pkgver=2.9.3 -pkgrel=3 +pkgver=2.9.4 +pkgrel=1 arch=('i686' 'x86_64') url='http://www.calligra-suite.org/' license=('FDL1.2' 'GPL2' 'LGPL') @@ -31,19 +31,11 @@ 'openjpeg' 'kdegraphics-okular' 'pstoedit' 'vc' 'libvisio' 'libetonyek' 'libpqxx' 'libspnav' 'postgresql') # 'libqgit2' groups=('calligra') -source=("http://download.kde.org/stable/${pkgbase}-${pkgver}/${pkgbase}-${pkgver}.tar.xz" 'krita_psd.patch' -'krita_psd2.patch') -md5sums=('9242b44eeeb7f13f72aeafb8e9365c07' - '7f90c54dc15bfeaf14c58e74f3f4aae7' - 'ed427b5a854d554e4028422fa03082aa') +source=("http://download.kde.org/stable/${pkgbase}-${pkgver}/${pkgbase}-${pkgver}.tar.xz") +md5sums=('12bf6bd00de3d7b589c1b1cfebca8f91') prepare() { - mkdir build - - cd $pkgbase-$pkgver -# fix loading PSD files in Krita - patch -p1 -i "$srcdir"/krita_psd.patch - patch -p1 -l -i "$srcdir"/krita_psd2.patch + mkdir -p build } build() { Deleted: krita_psd.patch =================================================================== --- krita_psd.patch 2015-05-05 18:07:25 UTC (rev 238513) +++ krita_psd.patch 2015-05-05 21:22:17 UTC (rev 238514) @@ -1,24 +0,0 @@ -From: Dmitry Kazakov <dimul...@gmail.com> -Date: Wed, 29 Apr 2015 11:04:40 +0000 -Subject: Fast and dirty fix for loading PSD files -X-Git-Url: http://quickgit.kde.org/?p=calligra.git&a=commitdiff&h=223e938ca5c2bd4724b4e2d1e59f72971e2977bf ---- -Fast and dirty fix for loading PSD files - -PsdAdditionalLayerInfoBlock must know about the layers block size and not try to read -it infinitely. So now just not signal errors, when it is finished. ---- - - ---- a/krita/plugins/formats/psd/psd_additional_layer_info_block.cpp -+++ b/krita/plugins/formats/psd/psd_additional_layer_info_block.cpp -@@ -41,7 +41,7 @@ - b = io->peek(4); - if (b.size() != 4 || QString(b) != "8BIM") { - error = "No 8BIM marker for additional layer info block"; -- return false; -+ return true; - } - else { - io->seek(io->pos() + 4); // skip the 8BIM header we peeked ahead for - Deleted: krita_psd2.patch =================================================================== --- krita_psd2.patch 2015-05-05 18:07:25 UTC (rev 238513) +++ krita_psd2.patch 2015-05-05 21:22:17 UTC (rev 238514) @@ -1,754 +0,0 @@ -From 039b58067e06eece1cc0c2788151b4a761847794 Mon Sep 17 00:00:00 2001 -From: Dmitry Kazakov <dimul...@gmail.com> -Date: Wed, 29 Apr 2015 18:20:23 +0300 -Subject: [PATCH] Properly fix PsdAdditionalLayerInfoBlock - -This patch ports PsdAdditionalLayerInfoBlock class into ASL framework -so that all the offsets will be correct all the time. - -Also parse lfx2 section into XML as a bonus :) ---- - krita/libpsd/CMakeLists.txt | 1 + - krita/libpsd/asl/kis_asl_reader.cpp | 138 ++++++------------- - krita/libpsd/asl/kis_asl_reader.h | 1 + - krita/libpsd/asl/kis_asl_reader_utils.cpp | 73 ++++++++++ - krita/libpsd/asl/kis_asl_reader_utils.h | 122 +++++++++++++++++ - krita/libpsd/asl/kis_asl_writer_utils.h | 2 +- - .../psd/psd_additional_layer_info_block.cpp | 147 ++++++++++----------- - .../formats/psd/psd_additional_layer_info_block.h | 3 + - krita/plugins/formats/psd/tests/CMakeLists.txt | 6 +- - .../formats/psd/tests/data/testing_psd_ls.psd | Bin 0 -> 272169 bytes - krita/plugins/formats/psd/tests/kis_psd_test.cpp | 17 +++ - krita/plugins/formats/psd/tests/kis_psd_test.h | 1 + - 12 files changed, 332 insertions(+), 179 deletions(-) - create mode 100644 krita/libpsd/asl/kis_asl_reader_utils.cpp - create mode 100644 krita/libpsd/asl/kis_asl_reader_utils.h - create mode 100644 krita/plugins/formats/psd/tests/data/testing_psd_ls.psd - -diff --git a/krita/libpsd/CMakeLists.txt b/krita/libpsd/CMakeLists.txt -index c0beca3..ca3c48b 100644 ---- a/krita/libpsd/CMakeLists.txt -+++ b/krita/libpsd/CMakeLists.txt -@@ -7,6 +7,7 @@ set(libkispsd_LIB_SRCS - psd_pattern.cpp - - asl/kis_asl_reader.cpp -+ asl/kis_asl_reader_utils.cpp - asl/kis_asl_xml_parser.cpp - asl/kis_asl_object_catcher.cpp - asl/kis_asl_callback_object_catcher.cpp -diff --git a/krita/libpsd/asl/kis_asl_reader.cpp b/krita/libpsd/asl/kis_asl_reader.cpp -index 93afef4..4ae7a68 100644 ---- a/krita/libpsd/asl/kis_asl_reader.cpp -+++ b/krita/libpsd/asl/kis_asl_reader.cpp -@@ -33,103 +33,11 @@ - #include "kis_offset_on_exit_verifier.h" - - #include "kis_asl_writer_utils.h" -- --namespace Private { -- --/** -- * Default value for variabled read from a file -- */ --#define GARBAGE_VALUE_MARK 999 -+#include "kis_asl_reader_utils.h" - - --/** -- * Exception that is emitted when any parse error appear. -- * Thanks to KisOffsetOnExitVerifier parsing can be continued -- * most of the time, based on the offset values written in PSD. -- */ -- --struct ASLParseException : public std::runtime_error --{ -- ASLParseException(const QString &msg) -- : std::runtime_error(msg.toAscii().data()) -- { -- } --}; -- --#define SAFE_READ_EX(device, varname) \ -- if (!psdread(device, &varname)) { \ -- QString msg = QString("Failed to read \'%1\' tag!").arg(#varname); \ -- throw ASLParseException(msg); \ -- } -- --#define SAFE_READ_SIGNATURE_EX(device, varname, expected) \ -- if (!psdread(device, &varname) || varname != expected) { \ -- QString msg = QString("Failed to check signature \'%1\' tag!\n" \ -- "Value: \'%2\' Expected: \'%3\'") \ -- .arg(#varname).arg(varname).arg(expected); \ -- throw ASLParseException(msg); \ -- } -- --/** -- * String fetch functions -- * -- * ASL has 4 types of strings: -- * -- * - fixed length (4 bytes) -- * - variable length (length (4 bytes) + string (var)) -- * - pascal (length (1 byte) + string (var)) -- * - unicode string (length (4 bytes) + null-terminated unicode string (var) -- */ -- --QString readStringCommon(QIODevice *device, int length) --{ -- QByteArray data; -- data.resize(length); -- qint64 dataRead = device->read(data.data(), length); -- -- if (dataRead != length) { -- QString msg = -- QString("Failed to read a string! " -- "Bytes read: %1 Expected: %2") -- .arg(dataRead).arg(length); -- throw ASLParseException(msg); -- } -- -- return QString(data); --} -- --QString readFixedString(QIODevice *device) { -- return readStringCommon(device, 4); --} -- --QString readVarString(QIODevice *device) { -- quint32 length = 0; -- SAFE_READ_EX(device, length); -- -- if (!length) { -- length = 4; -- } -- -- return readStringCommon(device, length); --} - --QString readPascalString(QIODevice *device) { -- quint8 length = 0; -- SAFE_READ_EX(device, length); -- -- return readStringCommon(device, length); --} -- --QString readUnicodeString(QIODevice *device) { -- QString string; -- -- if (!psdread_unicodestring(device, string)) { -- QString msg = QString("Failed to read a unicode string!"); -- throw ASLParseException(msg); -- } -- -- return string; --} -+namespace Private { - - /** - * Numerical fetch functions -@@ -229,6 +137,8 @@ void readChildObject(QIODevice *device, - QDomDocument *doc, - bool skipKey = false) - { -+ using namespace KisAslReaderUtils; -+ - QString key; - - if (!skipKey) { -@@ -298,6 +208,8 @@ void readDescriptor(QIODevice *device, - QDomElement *parent, - QDomDocument *doc) - { -+ using namespace KisAslReaderUtils; -+ - QString name = readUnicodeString(device); - QString classId = readVarString(device); - -@@ -318,6 +230,8 @@ void readDescriptor(QIODevice *device, - QImage readVirtualArrayList(QIODevice *device, - int numPlanes) - { -+ using namespace KisAslReaderUtils; -+ - quint32 arrayVersion = GARBAGE_VALUE_MARK; - SAFE_READ_EX(device, arrayVersion); - -@@ -479,6 +393,8 @@ qint64 readPattern(QIODevice *device, - QDomElement *parent, - QDomDocument *doc) - { -+ using namespace KisAslReaderUtils; -+ - quint32 patternSize = GARBAGE_VALUE_MARK; - SAFE_READ_EX(device, patternSize); - -@@ -577,6 +493,8 @@ qint64 readPattern(QIODevice *device, - - QDomDocument readFileImpl(QIODevice *device) - { -+ using namespace KisAslReaderUtils; -+ - QDomDocument doc; - QDomElement root = doc.createElement("asl"); - doc.appendChild(root); -@@ -663,9 +581,39 @@ QDomDocument KisAslReader::readFile(QIODevice *device) - - try { - doc = Private::readFileImpl(device); -- } catch (Private::ASLParseException &e) { -+ } catch (KisAslReaderUtils::ASLParseException &e) { - qWarning() << "WARNING: ASL:" << e.what(); - } - - return doc; - } -+ -+QDomDocument KisAslReader::readLfx2PsdSection(QIODevice *device) -+{ -+ QDomDocument doc; -+ -+ try { -+ { -+ quint32 objectEffectsVersion = GARBAGE_VALUE_MARK; -+ const quint32 ref = 0x00; -+ SAFE_READ_SIGNATURE_EX(device, objectEffectsVersion, ref); -+ } -+ -+ { -+ quint32 descriptorVersion = GARBAGE_VALUE_MARK; -+ const quint32 ref = 0x10; -+ SAFE_READ_SIGNATURE_EX(device, descriptorVersion, ref); -+ } -+ -+ -+ QDomElement root = doc.createElement("asl"); -+ doc.appendChild(root); -+ -+ Private::readDescriptor(device, "", &root, &doc); -+ -+ } catch (KisAslReaderUtils::ASLParseException &e) { -+ qWarning() << "WARNING: PSD: lfx2 section:" << e.what(); -+ } -+ -+ return doc; -+} -diff --git a/krita/libpsd/asl/kis_asl_reader.h b/krita/libpsd/asl/kis_asl_reader.h -index b28db5e..efe8e67 100644 ---- a/krita/libpsd/asl/kis_asl_reader.h -+++ b/krita/libpsd/asl/kis_asl_reader.h -@@ -29,6 +29,7 @@ class LIBKISPSD_EXPORT KisAslReader - { - public: - QDomDocument readFile(QIODevice *device); -+ QDomDocument readLfx2PsdSection(QIODevice *device); - }; - - #endif /* __KIS_ASL_READER_H */ -diff --git a/krita/libpsd/asl/kis_asl_reader_utils.cpp b/krita/libpsd/asl/kis_asl_reader_utils.cpp -new file mode 100644 -index 0000000..3c34aae ---- /dev/null -+++ b/krita/libpsd/asl/kis_asl_reader_utils.cpp -@@ -0,0 +1,73 @@ -+/* -+ * Copyright (c) 2015 Dmitry Kazakov <dimul...@gmail.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 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, Fifth Floor, Boston, MA 02110-1301, USA. -+ */ -+ -+#include "kis_asl_reader_utils.h" -+ -+namespace KisAslReaderUtils { -+ -+QString readStringCommon(QIODevice *device, int length) -+{ -+ QByteArray data; -+ data.resize(length); -+ qint64 dataRead = device->read(data.data(), length); -+ -+ if (dataRead != length) { -+ QString msg = -+ QString("Failed to read a string! " -+ "Bytes read: %1 Expected: %2") -+ .arg(dataRead).arg(length); -+ throw ASLParseException(msg); -+ } -+ -+ return QString(data); -+} -+ -+QString readFixedString(QIODevice *device) { -+ return readStringCommon(device, 4); -+} -+ -+QString readVarString(QIODevice *device) { -+ quint32 length = 0; -+ SAFE_READ_EX(device, length); -+ -+ if (!length) { -+ length = 4; -+ } -+ -+ return readStringCommon(device, length); -+} -+ -+QString readPascalString(QIODevice *device) { -+ quint8 length = 0; -+ SAFE_READ_EX(device, length); -+ -+ return readStringCommon(device, length); -+} -+ -+QString readUnicodeString(QIODevice *device) { -+ QString string; -+ -+ if (!psdread_unicodestring(device, string)) { -+ QString msg = QString("Failed to read a unicode string!"); -+ throw ASLParseException(msg); -+ } -+ -+ return string; -+} -+ -+} -diff --git a/krita/libpsd/asl/kis_asl_reader_utils.h b/krita/libpsd/asl/kis_asl_reader_utils.h -new file mode 100644 -index 0000000..0f2f2b6 ---- /dev/null -+++ b/krita/libpsd/asl/kis_asl_reader_utils.h -@@ -0,0 +1,122 @@ -+/* -+ * Copyright (c) 2015 Dmitry Kazakov <dimul...@gmail.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 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, Fifth Floor, Boston, MA 02110-1301, USA. -+ */ -+ -+#ifndef __KIS_ASL_READER_UTILS_H -+#define __KIS_ASL_READER_UTILS_H -+ -+#include "psd_utils.h" -+ -+#include <stdexcept> -+#include <string> -+ -+#include <QtEndian> -+ -+/** -+ * Default value for variable read from a file -+ */ -+ -+#define GARBAGE_VALUE_MARK 999 -+ -+namespace KisAslReaderUtils { -+ -+/** -+ * Exception that is emitted when any parse error appear. -+ * Thanks to KisOffsetOnExitVerifier parsing can be continued -+ * most of the time, based on the offset values written in PSD. -+ */ -+ -+struct LIBKISPSD_EXPORT ASLParseException : public std::runtime_error -+{ -+ ASLParseException(const QString &msg) -+ : std::runtime_error(msg.toAscii().data()) -+ { -+ } -+}; -+ -+} -+ -+#define SAFE_READ_EX(device, varname) \ -+ if (!psdread(device, &varname)) { \ -+ QString msg = QString("Failed to read \'%1\' tag!").arg(#varname); \ -+ throw KisAslReaderUtils::ASLParseException(msg); \ -+ } -+ -+#define SAFE_READ_SIGNATURE_EX(device, varname, expected) \ -+ if (!psdread(device, &varname) || varname != expected) { \ -+ QString msg = QString("Failed to check signature \'%1\' tag!\n" \ -+ "Value: \'%2\' Expected: \'%3\'") \ -+ .arg(#varname).arg(varname).arg(expected); \ -+ throw KisAslReaderUtils::ASLParseException(msg); \ -+ } -+ -+#define SAFE_READ_SIGNATURE_2OPS_EX(device, varname, expected1, expected2) \ -+ if (!psdread(device, &varname) || (varname != expected1 && varname != expected2)) { \ -+ QString msg = QString("Failed to check signature \'%1\' tag!\n" \ -+ "Value: \'%2\' Expected1: \'%3\' Expected2: \'%4\'") \ -+ .arg(#varname).arg(varname).arg(expected1).arg(expected2); \ -+ throw KisAslReaderUtils::ASLParseException(msg); \ -+ } -+ -+template <typename T> -+inline bool TRY_READ_SIGNATURE_2OPS_EX(QIODevice *device, T expected1, T expected2) -+{ -+ T var; -+ -+ qint64 bytesRead = device->peek((char*)&var, sizeof(T)); -+ if (bytesRead != sizeof(T)) { -+ return false; -+ } -+ -+ var = qFromBigEndian<T>(var); -+ -+ bool result = var == expected1 || var == expected2; -+ -+ // If read successfully, adjust current position of the io device -+ -+ if (result) { -+ // read, not seek, to support sequential devices -+ bytesRead = device->read((char*)&var, sizeof(T)); -+ if (bytesRead != sizeof(T)) { -+ return false; -+ } -+ } -+ -+ return result; -+} -+ -+namespace KisAslReaderUtils { -+ -+/** -+ * String fetch functions -+ * -+ * ASL has 4 types of strings: -+ * -+ * - fixed length (4 bytes) -+ * - variable length (length (4 bytes) + string (var)) -+ * - pascal (length (1 byte) + string (var)) -+ * - unicode string (length (4 bytes) + null-terminated unicode string (var) -+ */ -+ -+LIBKISPSD_EXPORT QString readFixedString(QIODevice *device); -+LIBKISPSD_EXPORT QString readVarString(QIODevice *device); -+LIBKISPSD_EXPORT QString readPascalString(QIODevice *device); -+LIBKISPSD_EXPORT QString readUnicodeString(QIODevice *device); -+ -+} -+ -+#endif /* __KIS_ASL_READER_UTILS_H */ -diff --git a/krita/libpsd/asl/kis_asl_writer_utils.h b/krita/libpsd/asl/kis_asl_writer_utils.h -index 58419e5..00b480a 100644 ---- a/krita/libpsd/asl/kis_asl_writer_utils.h -+++ b/krita/libpsd/asl/kis_asl_writer_utils.h -@@ -34,7 +34,7 @@ namespace KisAslWriterUtils { - /** - * Exception that is emitted when any write error appear. - */ --struct ASLWriteException : public std::runtime_error -+struct LIBKISPSD_EXPORT ASLWriteException : public std::runtime_error - { - ASLWriteException(const QString &msg) - : std::runtime_error(msg.toAscii().data()) -diff --git a/krita/plugins/formats/psd/psd_additional_layer_info_block.cpp b/krita/plugins/formats/psd/psd_additional_layer_info_block.cpp -index b3eaa52..3c7c11d 100644 ---- a/krita/plugins/formats/psd/psd_additional_layer_info_block.cpp -+++ b/krita/plugins/formats/psd/psd_additional_layer_info_block.cpp -@@ -18,9 +18,12 @@ - - #include "psd_additional_layer_info_block.h" - --#include <QBuffer> -+#include <QDomDocument> - --#include "psd_utils.h" -+#include <asl/kis_offset_on_exit_verifier.h> -+ -+#include <asl/kis_asl_reader_utils.h> -+#include <asl/kis_asl_reader.h> - - - PsdAdditionalLayerInfoBlock::PsdAdditionalLayerInfoBlock() -@@ -29,6 +32,22 @@ PsdAdditionalLayerInfoBlock::PsdAdditionalLayerInfoBlock() - - bool PsdAdditionalLayerInfoBlock::read(QIODevice *io) - { -+ bool result = true; -+ -+ try { -+ readImpl(io); -+ } catch (KisAslReaderUtils::ASLParseException &e) { -+ error = e.what(); -+ result = false; -+ } -+ -+ return result; -+} -+ -+void PsdAdditionalLayerInfoBlock::readImpl(QIODevice* io) -+{ -+ using namespace KisAslReaderUtils; -+ - QStringList longBlocks; - if (m_header.version > 1) { - longBlocks << "LMsk" << "Lr16" << "Layr" << "Mt16" << "Mtrn" << "Alph"; -@@ -36,48 +55,36 @@ bool PsdAdditionalLayerInfoBlock::read(QIODevice *io) - - while (!io->atEnd()) { - -- // read all the additional layer info 8BIM blocks -- QByteArray b; -- b = io->peek(4); -- if (b.size() != 4 || QString(b) != "8BIM") { -- error = "No 8BIM marker for additional layer info block"; -- return true; -- } -- else { -- io->seek(io->pos() + 4); // skip the 8BIM header we peeked ahead for -+ { -+ const quint32 refSignature1 = 0x3842494D; // '8BIM' in little-endian -+ const quint32 refSignature2 = 0x38423634; // '8B64' in little-endian -+ if (!TRY_READ_SIGNATURE_2OPS_EX(io, refSignature1, refSignature2)) { -+ break; -+ } - } - -- QString key(io->read(4)); -- if (key.size() != 4) { -- error = "Could not read key for additional layer info block"; -- return false; -- } -+ QString key = readFixedString(io); - dbgFile << "found info block with key" << key; -- if (keys.contains(key)) { -- error = "Found duplicate entry for key "; -- continue; -- } -- keys << key; - -- quint64 size; -+ quint64 blockSize = GARBAGE_VALUE_MARK; - if (longBlocks.contains(key)) { -- psdread(io, &size); -- } -- else { -- quint32 _size; -- psdread(io, &_size); -- size = _size; -+ SAFE_READ_EX(io, blockSize); -+ } else { -+ quint32 size32; -+ SAFE_READ_EX(io, size32); -+ blockSize = size32; - } - -- QByteArray data = io->read(size); -- if (data.size() != (qint64)size) { -- error = QString("Could not read full info block for key %1.").arg(key); -- return false; -- } -+ // offset verifier will correct the position on the exit from -+ // current namespace, including 'continue', 'return' and -+ // exceptions. -+ SETUP_OFFSET_VERIFIER(infoBlockEndVerifier, io, blockSize, 0); - -- dbgFile << "\tRead layer info block" << key << "for size" << data.size(); -- QBuffer buf(&data); -- buf.open(QBuffer::ReadOnly); -+ if (keys.contains(key)) { -+ error = "Found duplicate entry for key "; -+ continue; -+ } -+ keys << key; - - if (key == "SoCo") { - -@@ -140,47 +147,23 @@ bool PsdAdditionalLayerInfoBlock::read(QIODevice *io) - - } - else if (key == "lrFX") { --// if (!psdread(&buf, &layerEffects.version) || layerEffects.version != 0) { --// dbgFile << "Layer Effect version is not zero" << layerEffects.version; --// continue; --// } --// if (!psdread(&buf, &layerEffects.effects_count) --// || layerEffects.effects_count < 6 --// || layerEffects.effects_count > 7) { --// dbgFile << "Wrong number of Layer Effects " << layerEffects.effects_count; --// continue; --// } --// for (int i = 0; i < layerEffects.effects_count; ++i) { --// QByteArray b; --// b = buf.peek(4); --// if (b.size() != 4 || QString(b) != "8BIM") { --// error = "No 8BIM marker for lrFX block"; --// return false; --// } --// else { --// buf.seek(buf.pos() + 4); // skip the 8BIM header we peeked ahead for --// } --// QString tag = QString(io->read(4)); --// if (tag.size() != 4) { --// error = "Could not read layer effect type tag"; --// return false; --// } -- --// } -- -+ // deprecated! use lfx2 instead! - } - else if (key == "tySh") { - } - else if (key == "luni") { - // get the unicode layer name -- psdread_unicodestring(&buf, unicodeLayerName); -+ unicodeLayerName = readUnicodeString(io); - dbgFile << "unicodeLayerName" << unicodeLayerName; - } - else if (key == "lyid") { - - } - else if (key == "lfx2") { -+ KisAslReader reader; -+ QDomDocument doc = reader.readLfx2PsdSection(io); - -+ //qDebug() << ppVar(doc.toString()); - } - else if (key == "Patt" || key == "Pat2" || key == "Pat3") { - -@@ -210,20 +193,27 @@ bool PsdAdditionalLayerInfoBlock::read(QIODevice *io) - - } - else if (key == "lsct") { -- quint32 type; -- if (!psdread(&buf, &type)) { -- error = "Could not read group type"; -- return false; -- } -- if (size >= 12) { -- if (!psd_read_blendmode(io, sectionDividerBlendMode)) { -- error = QString("Could not read blend mode key. Got: %1").arg(sectionDividerBlendMode); -- return false; -- } -+ quint32 dividerType = GARBAGE_VALUE_MARK; -+ SAFE_READ_EX(io, dividerType); -+ this->sectionDividerType = (psd_section_type)dividerType; -+ -+ -+ if (blockSize >= 12) { -+ quint32 lsctSignature = GARBAGE_VALUE_MARK; -+ const quint32 refSignature1 = 0x3842494D; // '8BIM' in little-endian -+ SAFE_READ_SIGNATURE_EX(io, lsctSignature, refSignature1); -+ -+ this->sectionDividerBlendMode = readFixedString(io); - } -- if (size >= 16) { -- // Don't care: animation scene group -+ -+ // Animation -+ if (blockSize >= 14) { -+ /** -+ * "I don't care -+ * I don't care, no... !" (c) -+ */ - } -+ - } - else if (key == "brst") { - -@@ -329,9 +319,6 @@ bool PsdAdditionalLayerInfoBlock::read(QIODevice *io) - } - - } -- return true; -- -- - } - - bool PsdAdditionalLayerInfoBlock::write(QIODevice */*io*/, KisNodeSP /*node*/) -diff --git a/krita/plugins/formats/psd/psd_additional_layer_info_block.h b/krita/plugins/formats/psd/psd_additional_layer_info_block.h -index 3028514..ff5a72e 100644 ---- a/krita/plugins/formats/psd/psd_additional_layer_info_block.h -+++ b/krita/plugins/formats/psd/psd_additional_layer_info_block.h -@@ -267,6 +267,9 @@ public: - psd_section_type sectionDividerType; - QString sectionDividerBlendMode; - -+private: -+ void readImpl(QIODevice* io); -+ - }; - - #endif // PSD_ADDITIONAL_LAYER_INFO_BLOCK_H -diff --git a/krita/plugins/formats/psd/tests/CMakeLists.txt b/krita/plugins/formats/psd/tests/CMakeLists.txt -index c9f32b2..8d9573b 100644 ---- a/krita/plugins/formats/psd/tests/CMakeLists.txt -+++ b/krita/plugins/formats/psd/tests/CMakeLists.txt -@@ -28,6 +28,6 @@ kde4_add_unit_test(compression_test TESTNAME krita-psd-compression_test ${compr - target_link_libraries(compression_test ${KDE4_KDEUI_LIBS} ${QT_QTTEST_LIBRARY}) - - ########### next target ############### --#set(kis_psd_test_SRCS kis_psd_test.cpp ) --#kde4_add_unit_test(kis_psd_test TESTNAME krita-plugins-formats-psd_test ${kis_psd_test_SRCS}) --#target_link_libraries(kis_psd_test ${KDE4_KDEUI_LIBS} kritaui ${QT_QTTEST_LIBRARY}) -+set(kis_psd_test_SRCS kis_psd_test.cpp ) -+kde4_add_unit_test(kis_psd_test TESTNAME krita-plugins-formats-psd_test ${kis_psd_test_SRCS}) -+target_link_libraries(kis_psd_test ${KDE4_KDEUI_LIBS} kritaui ${QT_QTTEST_LIBRARY}) -diff --git a/krita/plugins/formats/psd/tests/kis_psd_test.cpp b/krita/plugins/formats/psd/tests/kis_psd_test.cpp -index c2a2900..181a6f1 100644 ---- a/krita/plugins/formats/psd/tests/kis_psd_test.cpp -+++ b/krita/plugins/formats/psd/tests/kis_psd_test.cpp -@@ -36,6 +36,23 @@ void KisPSDTest::testFiles() - TestUtil::testFiles(QString(FILES_DATA_DIR) + "/sources", QStringList()); - } - -+void KisPSDTest::testOpening() -+{ -+ QFileInfo sourceFileInfo(QString(FILES_DATA_DIR) + QDir::separator() + "testing_psd_ls.psd"); -+ -+ QScopedPointer<KisDocument> doc(qobject_cast<KisDocument*>(KisPart::instance()->createDocument())); -+ -+ KisImportExportManager manager(doc.data()); -+ manager.setBatchMode(true); -+ -+ KisImportExportFilter::ConversionStatus status; -+ QString s = manager.importDocument(sourceFileInfo.absoluteFilePath(), QString(), -+ status); -+ qDebug() << s; -+ -+ Q_ASSERT(doc->image()); -+} -+ - QTEST_KDEMAIN(KisPSDTest, GUI) - - #include "kis_psd_test.moc" -diff --git a/krita/plugins/formats/psd/tests/kis_psd_test.h b/krita/plugins/formats/psd/tests/kis_psd_test.h -index 4773b6a..bc45a0c 100644 ---- a/krita/plugins/formats/psd/tests/kis_psd_test.h -+++ b/krita/plugins/formats/psd/tests/kis_psd_test.h -@@ -26,6 +26,7 @@ class KisPSDTest : public QObject - Q_OBJECT - private Q_SLOTS: - void testFiles(); -+ void testOpening(); - }; - - #endif --- -2.3.7 -