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 }