mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-18 22:54:00 +00:00
extra/calligra to 2.9.4-1
This commit is contained in:
parent
1e601df515
commit
3346181dcb
3 changed files with 4 additions and 792 deletions
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
|
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||||
# - removed makedepend on vc - not for ARM
|
# - removed makedepend on vc - not for ARM
|
||||||
# - temporary source change for canceled 2.9.3 release
|
|
||||||
|
|
||||||
pkgbase=calligra
|
pkgbase=calligra
|
||||||
pkgname=('calligra-braindump'
|
pkgname=('calligra-braindump'
|
||||||
|
@ -24,8 +23,8 @@ pkgname=('calligra-braindump'
|
||||||
'calligra-sheets'
|
'calligra-sheets'
|
||||||
'calligra-stage'
|
'calligra-stage'
|
||||||
'calligra-words')
|
'calligra-words')
|
||||||
pkgver=2.9.3
|
pkgver=2.9.4
|
||||||
pkgrel=3
|
pkgrel=1
|
||||||
arch=('i686' 'x86_64')
|
arch=('i686' 'x86_64')
|
||||||
url='http://www.calligra-suite.org/'
|
url='http://www.calligra-suite.org/'
|
||||||
license=('FDL1.2' 'GPL2' 'LGPL')
|
license=('FDL1.2' 'GPL2' 'LGPL')
|
||||||
|
@ -35,20 +34,11 @@ makedepends=('cmake' 'automoc4' 'boost' 'kdepimlibs' 'eigen' 'kdeedu-marble'
|
||||||
'openjpeg' 'kdegraphics-okular' 'pstoedit' 'libvisio'
|
'openjpeg' 'kdegraphics-okular' 'pstoedit' 'libvisio'
|
||||||
'libetonyek' 'libpqxx' 'libspnav' 'postgresql') # 'libqgit2'
|
'libetonyek' 'libpqxx' 'libspnav' 'postgresql') # 'libqgit2'
|
||||||
groups=('calligra')
|
groups=('calligra')
|
||||||
#source=("http://download.kde.org/stable/${pkgbase}-${pkgver}/${pkgbase}-${pkgver}.tar.xz"
|
source=("http://download.kde.org/stable/${pkgbase}-${pkgver}/${pkgbase}-${pkgver}.tar.xz")
|
||||||
source=("http://fossies.org/linux/misc/calligra-${pkgver}.tar.gz"
|
md5sums=('12bf6bd00de3d7b589c1b1cfebca8f91')
|
||||||
'krita_psd.patch' 'krita_psd2.patch')
|
|
||||||
md5sums=('9242b44eeeb7f13f72aeafb8e9365c07'
|
|
||||||
'7f90c54dc15bfeaf14c58e74f3f4aae7'
|
|
||||||
'ed427b5a854d554e4028422fa03082aa')
|
|
||||||
|
|
||||||
prepare() {
|
prepare() {
|
||||||
mkdir build
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
From: Dmitry Kazakov <dimula73@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
|
|
||||||
|
|
|
@ -1,754 +0,0 @@
|
||||||
From 039b58067e06eece1cc0c2788151b4a761847794 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Dmitry Kazakov <dimula73@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 <dimula73@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 <dimula73@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
|
|
||||||
|
|
Loading…
Reference in a new issue