8#ifndef __KIS_ASL_READER_UTILS_H
9#define __KIS_ASL_READER_UTILS_H
26#define GARBAGE_VALUE_MARK 999
38 :
std::runtime_error(msg.toLatin1().data())
45#define SAFE_READ_EX(byteOrder, device, varname) \
46 if (!psdread<byteOrder>(device, varname)) { \
47 QString msg = QString("Failed to read \'%1\' tag!").arg(#varname); \
48 throw KisAslReaderUtils::ASLParseException(msg); \
51#define SAFE_READ_SIGNATURE_EX(byteOrder, device, varname, expected) \
52 if (!psdread<byteOrder>(device, varname) || varname != expected) { \
53 QString msg = QString( \
54 "Failed to check signature \'%1\' tag!\n" \
55 "Value: \'%2\' Expected: \'%3\'") \
59 throw KisAslReaderUtils::ASLParseException(msg); \
62template<psd_
byte_order
byteOrder,
typename T,
size_t S>
65 QByteArray bytes = device.peek(
S);
68 std::reverse(bytes.begin(), bytes.end());
71 if (bytes.size() !=
S) {
77 if (std::equal(bytes.constBegin(), bytes.constEnd(), expected1.begin())
78 || std::equal(bytes.constBegin(), bytes.constEnd(), expected2.begin())) {
81 if (bytesRead.size() ==
S) {
86 dbgFile <<
"Photoshop signature verification failed! Got: " << bytes.toHex() <<
"(" << QString(bytes) <<
")";
90template<
typename T,
size_t S>
95 return TRY_READ_SIGNATURE_2OPS_EX<psd_byte_order::psdLittleEndian>(device, expected1, expected2);
97 return TRY_READ_SIGNATURE_2OPS_EX<psd_byte_order::psdBigEndian>(device, expected1, expected2);
114template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
117 QByteArray data = psdreadBytes<byteOrder>(device,
length);
119 if (data.size() !=
length) {
120 QString msg = QString(
121 "Failed to read a string! "
122 "Bytes read: %1 Expected: %2")
128 return QString(data);
131template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
134 return readStringCommon<byteOrder>(device, 4);
137template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
147 return readStringCommon<byteOrder>(device,
length);
150template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
159template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
164 if (!psdread_unicodestring<byteOrder>(device,
string)) {
165 QString msg = QString(
"Failed to read a unicode string!");
qreal length(const QPointF &vec)
Eigen::Matrix< double, 4, 2 > S
bool TRY_READ_SIGNATURE_2OPS_EX(QIODevice &device, const std::array< T, S > &expected1, const std::array< T, S > &expected2)
#define SAFE_READ_EX(byteOrder, device, varname)
QString readVarString(QIODevice &device)
QString readFixedString(QIODevice &device)
QString readPascalString(QIODevice &device)
QString readUnicodeString(QIODevice &device)
QString readStringCommon(QIODevice &device, int length)
QByteArray psdreadBytes(QIODevice &io, qint64 v)
ASLParseException(const QString &msg)