29 const std::array<quint8, 2> val = {
v};
30 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 1);
36 const std::array<quint8, 2> val = {
v};
37 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 1);
43 const std::array<quint8, 2> val = {
47 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 2);
53 const std::array<quint8, 2> val = {
57 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 2);
63 const std::array<quint8, 4> val = {
69 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 4);
75 const std::array<quint8, 4> val = {
81 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 4);
87 const std::array<quint8, 8> val = {
97 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 8);
103 const std::array<quint8, 8> val = {
113 const qint64 written = io.write(
reinterpret_cast<const char *
>(val.data()), 8);
122inline bool psdwriteBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint8), T &>
v)
124 return psdwriteBE(io,
reinterpret_cast<quint8 &
>(
v));
128inline bool psdwriteBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint16), T &>
v)
130 return psdwriteBE(io,
reinterpret_cast<quint16 &
>(
v));
134inline bool psdwriteBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint32), T &>
v)
136 return psdwriteBE(io,
reinterpret_cast<quint32 &
>(
v));
140inline bool psdwriteBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint64), T &>
v)
142 return psdwriteBE(io,
reinterpret_cast<quint64 &
>(
v));
146inline bool psdwriteLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint8), T &>
v)
148 return psdwriteLE(io,
reinterpret_cast<quint8 &
>(
v));
152inline bool psdwriteLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint16), T &>
v)
154 return psdwriteLE(io,
reinterpret_cast<quint16 &
>(
v));
158inline bool psdwriteLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint32), T &>
v)
160 return psdwriteLE(io,
reinterpret_cast<quint32 &
>(
v));
164inline bool psdwriteLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint64), T &>
v)
166 return psdwriteLE(io,
reinterpret_cast<quint64 &
>(
v));
169template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian,
typename T>
170inline std::enable_if_t<std::is_arithmetic<T>::value,
bool>
psdwrite(QIODevice &io, T
v)
173 return psdwriteLE<T>(io,
v);
175 return psdwriteBE<T>(io,
v);
179inline bool psdwrite(QIODevice &io,
const QString &s)
181 const QByteArray b = s.toLatin1();
183 const qint64 written = io.write(
reinterpret_cast<const char *
>(b.data()), l);
187template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
190 Q_ASSERT(s.length() < 256);
191 Q_ASSERT(s.length() >= 0);
192 if (s.length() < 0 || s.length() > 255)
196 psdwrite<byteOrder>(io, quint8(0));
197 psdwrite<byteOrder>(io, quint8(0));
201 quint8
length =
static_cast<quint8
>(s.length());
202 psdwrite<byteOrder>(io,
length);
204 const QByteArray b = s.toLatin1();
205 const qint64 written = io.write(
reinterpret_cast<const char *
>(b.data()),
length);
209 if ((
length & 0x01) != 0) {
210 return psdwrite<byteOrder>(io, quint8(0));
216template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
219 Q_ASSERT(s.length() < 256);
220 Q_ASSERT(s.length() >= 0);
221 if (s.length() < 0 || s.length() > 255)
225 psdwrite<byteOrder>(io, quint8(0));
226 psdwrite<byteOrder>(io, quint8(0));
229 quint8
length =
static_cast<quint8
>(s.length());
230 psdwrite<byteOrder>(io,
length);
232 QByteArray b = s.toLatin1();
233 const qint64 written = io.write(b.data(),
length);
239 if ((
length % padding) != 0) {
240 for (
int i = 0; i < (padding - (
length % padding)); i++) {
241 psdwrite<byteOrder>(io, quint8(0));
248inline bool psdpad(QIODevice &io, quint32 padding)
250 for (quint32 i = 0; i < padding; i++) {
251 const bool written = io.putChar(
'\0');
264 std::array<quint8, 1> data;
265 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 1);
274 std::array<quint8, 1> data;
275 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 1);
284 std::array<quint8, 2> data;
285 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 2);
288 v = quint16((quint16(data[0]) << 8U) | data[1]);
294 std::array<quint8, 2> data;
295 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 2);
298 v = quint16((quint16(data[1]) << 8U) | data[0]);
304 std::array<quint8, 4> data;
305 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 4);
308 v = (quint32(data[0]) << 24U) | (quint32(data[1]) << 16U) | (quint32(data[2]) << 8U) | data[3];
314 std::array<quint8, 4> data;
315 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 4);
318 v = (quint32(data[3]) << 24U) | (quint32(data[2]) << 16U) | (quint32(data[1]) << 8U) | data[0];
324 std::array<quint8, 8> data;
325 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 8);
328 v = (quint64(data[0]) << 56U) | (quint64(data[1]) << 48U) | (quint64(data[2]) << 40U) | (quint64(data[3]) << 32U) | (quint64(data[4]) << 24U)
329 | (quint64(data[5]) << 16U) | (quint64(data[6]) << 8U) | data[7];
335 std::array<quint8, 8> data;
336 qint64 read = io.read(
reinterpret_cast<char *
>(data.data()), 8);
339 v = (quint64(data[7]) << 56U) | (quint64(data[6]) << 48U) | (quint64(data[5]) << 40U) | (quint64(data[4]) << 32U) | (quint64(data[3]) << 24U)
340 | (quint64(data[2]) << 16U) | (quint64(data[1]) << 8U) | data[0];
349inline bool psdreadBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint8), T &>
v)
351 return psdreadBE(io,
reinterpret_cast<quint8 &
>(
v));
355inline bool psdreadBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint16), T &>
v)
357 return psdreadBE(io,
reinterpret_cast<quint16 &
>(
v));
361inline bool psdreadBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint32), T &>
v)
363 return psdreadBE(io,
reinterpret_cast<quint32 &
>(
v));
367inline bool psdreadBE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint64), T &>
v)
369 return psdreadBE(io,
reinterpret_cast<quint64 &
>(
v));
373inline bool psdreadLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint8), T &>
v)
375 return psdreadLE(io,
reinterpret_cast<quint8 &
>(
v));
379inline bool psdreadLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint16), T &>
v)
381 return psdreadLE(io,
reinterpret_cast<quint16 &
>(
v));
385inline bool psdreadLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint32), T &>
v)
387 return psdreadLE(io,
reinterpret_cast<quint32 &
>(
v));
391inline bool psdreadLE(QIODevice &io, std::enable_if_t<
sizeof(T) ==
sizeof(quint64), T &>
v)
393 return psdreadLE(io,
reinterpret_cast<quint64 &
>(
v));
396template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian,
typename T>
397inline std::enable_if_t<std::is_arithmetic<T>::value,
bool>
psdread(QIODevice &io, T &
v)
400 return psdreadLE<T>(io,
v);
402 return psdreadBE<T>(io,
v);
406template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
409 QByteArray b = io.read(
v);
411 std::reverse(b.begin(), b.end());
416template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
420 if (!psdread<byteOrder>(io,
length)) {
426 for (qint64 i = 0; i < padding - 1; ++i) {
427 io.seek(io.pos() + 1);
432 QByteArray chars = io.read(
length);
433 if (chars.length() !=
length) {
438 quint32 paddedLength =
length + 1;
440 while (paddedLength % padding != 0) {
441 if (!io.seek(io.pos() + 1)) {
448 s.append(QString::fromLatin1(chars));
449 if (s.endsWith(QChar::Space)) {
456template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
460 if (!psdread<byteOrder>(io, stringlen)) {
464 s.fill(QChar::Space,
static_cast<int>(stringlen));
466 for (quint32 i = 0; i < stringlen; ++i) {
468 if (!psdread<byteOrder>(io, ch)) {
477 if (s.endsWith(QChar::Space)) {
484template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
487 QByteArray b(psdreadBytes<byteOrder>(io, 4));
488 if (b.size() != 4 || QString(b) !=
"8BIM") {
491 blendModeKey = QString(psdreadBytes<byteOrder>(io, 4));
492 if (blendModeKey.size() != 4) {
499template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
505 if (psdread<byteOrder>(io, data)) {
506 char man = (data & 0xFF000000) >> 24;
509 ret = (data & 0x00FFFFFF) / 16777215.0;
514 ret = (~data & 0x00FFFFFF) / 16777215.0;
515 ret = (ret + ~man) * -1;
521template<psd_
byte_order
byteOrder = psd_
byte_order::psdBigEndian>
525 double max24 = 16777215.0;
528 qint32 man = qint32(val);
529 quint32 frac= quint32(fabs(val - man) * max24);
530 data = (qAbs(man) << 24) | frac;
535 psdwrite<byteOrder>(io, data);
qreal length(const QPointF &vec)
double psdreadFixedPoint(QIODevice &io)
std::enable_if_t< std::is_arithmetic< T >::value, bool > psdread(QIODevice &io, T &v)
void psdwriteFixedPoint(QIODevice &io, double val)
bool psdwriteLE(QIODevice &io, const quint8 &v)
bool psdreadBE(QIODevice &io, quint8 &v)
bool psdwrite_pascalstring(QIODevice &io, const QString &s)
bool psdreadLE(QIODevice &io, quint8 &v)
QByteArray psdreadBytes(QIODevice &io, qint64 v)
bool psdread_pascalstring(QIODevice &io, QString &s, qint64 padding)
bool psdpad(QIODevice &io, quint32 padding)
bool psdread_unicodestring(QIODevice &io, QString &s)
bool psdwriteBE(QIODevice &io, const quint8 &v)
bool psd_read_blendmode(QIODevice &io, QString &blendModeKey)
std::enable_if_t< std::is_arithmetic< T >::value, bool > psdwrite(QIODevice &io, T v)