File indexing completed on 2024-06-09 04:27:45

0001 /*
0002  *  SPDX-FileCopyrightText: 2009 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "psd_colormode_block.h"
0007 
0008 #include <psd_utils.h>
0009 #include <QByteArray>
0010 #include <QColor>
0011 
0012 PSDColorModeBlock::PSDColorModeBlock(psd_color_mode colormode)
0013     : blocksize(0)
0014     , colormode(colormode)
0015 {
0016 }
0017 
0018 bool PSDColorModeBlock::read(QIODevice &io)
0019 {
0020     // get length
0021     psdread(io, blocksize);
0022 
0023     if (blocksize == 0) {
0024         if (colormode == Indexed || colormode == DuoTone) {
0025             error = "Blocksize of 0 and Indexed or DuoTone colormode";
0026             return false;
0027         }
0028         else {
0029             return true;
0030         }
0031     }
0032 
0033     if (colormode == Indexed && blocksize != 768) {
0034         error = QString("Indexed mode, but block size is %1.").arg(blocksize);
0035         return false;
0036     }
0037 
0038     data = io.read(blocksize);
0039     if ((quint32)data.size() != blocksize) return false;
0040 
0041     if (colormode == Indexed) {
0042         int i = 0;
0043         while (i <= 767) {
0044             colormap.append(qRgb(data[i],data[i + 1],data[i + 2]));
0045             i += 2;
0046         }
0047     }
0048     else {
0049         duotoneSpecification = data;
0050     }
0051     return valid();
0052 }
0053 
0054 bool PSDColorModeBlock::write(QIODevice &io)
0055 {
0056     if (!valid()) {
0057         error = "Cannot write an invalid Color Mode Block";
0058         return false;
0059     }
0060     if (colormap.size() > 0 && colormode == Indexed) {
0061         error = "Cannot write indexed color data";
0062         return false;
0063     }
0064     else if (duotoneSpecification.size() > 0 && colormode == DuoTone) {
0065         quint32 blocksize = duotoneSpecification.size();
0066         psdwrite(io, blocksize);
0067         if (io.write(duotoneSpecification.constData(), blocksize) != blocksize) {
0068             error = "Failed to write duotone specification";
0069             return false;
0070         }
0071     }
0072     else {
0073         quint32 i = 0;
0074         psdwrite(io, i);
0075     }
0076     return true;
0077 }
0078 
0079 bool PSDColorModeBlock::valid()
0080 {
0081     if (blocksize == 0 && (colormode == Indexed || colormode == DuoTone)) {
0082         error = "Blocksize of 0 and Indexed or DuoTone colormode";
0083         return false;
0084     }
0085     if (colormode == Indexed && blocksize != 768) {
0086         error = QString("Indexed mode, but block size is %1.").arg(blocksize);
0087         return false;
0088     }
0089     if (colormode == DuoTone && blocksize == 0) {
0090         error = QString("DuoTone mode, but data block is empty");
0091         return false;
0092     }
0093     if ((quint32)data.size() != blocksize) {
0094         error = QString("Data size is %1, but block size is %2").arg(data.size()).arg(blocksize);
0095         return false;
0096     }
0097     return true;
0098 }