Krita Source Code Documentation
Loading...
Searching...
No Matches
PSDResourceBlock Class Reference

#include <psd_resource_block.h>

+ Inheritance diagram for PSDResourceBlock:

Public Member Functions

KisAnnotationclone () const Q_DECL_OVERRIDE
 
QString displayText () const override
 displayText: override this to return an interpreted version of the annotation
 
 PSDResourceBlock ()
 
bool read (QIODevice &io)
 
bool valid ()
 
bool write (QIODevice &io) const
 
 ~PSDResourceBlock () override
 
- Public Member Functions inherited from KisAnnotation
const QByteArray & annotation () const
 
const QString & description () const
 
 KisAnnotation (const QString &type, const QString &description, const QByteArray &data)
 
void setAnnotation (const QByteArray ba)
 
const QString & type () const
 
virtual ~KisAnnotation ()
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Public Attributes

QByteArray data
 
quint32 dataSize
 
QString error
 
quint16 identifier
 
QString name
 
PSDInterpretedResourceresource
 

Additional Inherited Members

- Protected Member Functions inherited from KisAnnotation
 KisAnnotation (const KisAnnotation &rhs)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 
- Protected Attributes inherited from KisAnnotation
QByteArray m_annotation
 
QString m_description
 
QString m_type
 

Detailed Description

Contains the unparsed contents of the image resource blocks

Definition at line 70 of file psd_resource_block.h.

Constructor & Destructor Documentation

◆ PSDResourceBlock()

PSDResourceBlock::PSDResourceBlock ( )

Definition at line 18 of file psd_resource_block.cpp.

19 : KisAnnotation("PSD Resource Block", "", QByteArray())
21 , dataSize(0)
22 , resource(0)
23{
24}
KisAnnotation(const QString &type, const QString &description, const QByteArray &data)
PSDInterpretedResource * resource

◆ ~PSDResourceBlock()

PSDResourceBlock::~PSDResourceBlock ( )
inlineoverride

Definition at line 75 of file psd_resource_block.h.

76 {
77 delete resource;
78 }

Member Function Documentation

◆ clone()

KisAnnotation * PSDResourceBlock::clone ( ) const
inlinevirtual

Reimplemented from KisAnnotation.

Definition at line 80 of file psd_resource_block.h.

81 {
82 // HACK ALERT: we are evil! use normal copying instead!
83 PSDResourceBlock *copied = new PSDResourceBlock();
84
85 QBuffer buffer;
86 buffer.open(QBuffer::WriteOnly);
87
88 if (!write(buffer)) {
89 qWarning() << "Could not copy PSDResourceBlock" << error;
90 delete copied;
91 return 0;
92 }
93 buffer.close();
94 buffer.open(QBuffer::ReadOnly);
95
96 if (!copied->read(buffer)) {
97 qWarning() << "Could not copy PSDResourceBlock" << copied->error;
98 delete copied;
99 return 0;
100 }
101
102 return copied;
103 }
bool read(QIODevice &io)
bool write(QIODevice &io) const

References error, and read().

◆ displayText()

QString PSDResourceBlock::displayText ( ) const
inlineoverridevirtual

displayText: override this to return an interpreted version of the annotation

Reimplemented from KisAnnotation.

Definition at line 105 of file psd_resource_block.h.

106 {
107 if (resource) {
108 return resource->displayText();
109 }
110 return i18n("Unparsed Resource Block");
111 }
virtual QString displayText()

◆ read()

bool PSDResourceBlock::read ( QIODevice & io)

Definition at line 26 of file psd_resource_block.cpp.

27{
28 dbgFile << "Reading resource block";
29 if (io.atEnd()) {
30 error = "Could not read resource block: no bytes left.";
31 return false;
32 }
33
34 QByteArray b;
35 b = io.read(4);
36 if (b.size() != 4 || QString(b) != "8BIM") {
37 error = QString("Could not read resource block signature. Got %1.").arg(QString(b));
38 return false;
39 }
40
41 if (!psdread(io, identifier)) {
42 error = "Could not read resource block identifier";
43 return false;
44 }
45
47
48 m_type = QString("PSD Resource Block: %1").arg(identifier);
49
50 if (!psdread_pascalstring(io, name, 2)) {
51 error = "Could not read name of resource block";
52 return false;
53 }
54
55 dbgFile << "\tresource block name" << name;
56
57 if (!psdread(io, dataSize)) {
58 error = QString("Could not read datasize for resource block with name %1 of type %2").arg(name).arg(identifier);
59 return false;
60 }
61
62 if ((dataSize & 0x01) != 0) {
63 dataSize++;
64 }
65
66 dbgFile << "\tresource block size" << dataSize;
67
69
70 data = io.read(dataSize);
71 if (data.size() != (int)dataSize) {
72 error = QString("Could not read data for resource block with name %1 of type %2").arg(name).arg(identifier);
73 return false;
74 }
75
77
78 switch (identifier) {
79 // case PSDImageResourceSection::MAC_PRINT_INFO:
80 // resource = new MAC_PRINT_INFO_1001;
81 // break;
84 break;
85 // case PSDImageResourceSection::ALPHA_NAMES:
86 // resource = new ALPHA_NAMES_1006;
87 // break;
88 // case PSDImageResourceSection::DISPLAY_INFO:
89 // resource = new DISPLAY_INFO_1007;
90 // break;
91 // case PSDImageResourceSection::CAPTION:
92 // resource = new CAPTION_1008;
93 // break;
94 // case PSDImageResourceSection::BORDER_INFO:
95 // resource = new BORDER_INFO_1009;
96 // break;
97 // case PSDImageResourceSection::BACKGROUND_COL:
98 // resource = new BACKGROUND_COL_1010;
99 // break;
100 // case PSDImageResourceSection::PRINT_FLAGS:
101 // resource = new PRINT_FLAGS_1011;
102 // break;
103 // case PSDImageResourceSection::GREY_HALFTONE:
104 // resource = new GREY_HALFTONE_1012;
105 // break;
106 // case PSDImageResourceSection::COLOR_HALFTONE:
107 // resource = new COLOR_HALFTONE_1013;
108 // break;
109 // case PSDImageResourceSection::DUOTONE_HALFTONE:
110 // resource = new DUOTONE_HALFTONE_1014;
111 // break;
112 // case PSDImageResourceSection::GREY_XFER:
113 // resource = new GREY_XFER_1015;
114 // break;
115 // case PSDImageResourceSection::COLOR_XFER:
116 // resource = new COLOR_XFER_1016;
117 // break;
118 // case PSDImageResourceSection::DUOTONE_XFER:
119 // resource = new DUOTONE_XFER_1017;
120 // break;
121 // case PSDImageResourceSection::DUOTONE_INFO:
122 // resource = new DUOTONE_INFO_1018;
123 // break;
124 // case PSDImageResourceSection::EFFECTIVE_BW:
125 // resource = new EFFECTIVE_BW_1019;
126 // break;
127 // case PSDImageResourceSection::EPS_OPT:
128 // resource = new EPS_OPT_1021;
129 // break;
130 // case PSDImageResourceSection::QUICK_MASK:
131 // resource = new QUICK_MASK_1022;
132 // break;
133 // case PSDImageResourceSection::LAYER_STATE:
134 // resource = new LAYER_STATE_1024;
135 // break;
136 // case PSDImageResourceSection::WORKING_PATH:
137 // resource = new WORKING_PATH_1025;
138 // break;
139 // case PSDImageResourceSection::LAYER_GROUP:
140 // resource = new LAYER_GROUP_1026;
141 // break;
142 // case PSDImageResourceSection::IPTC_NAA_DATA:
143 // resource = new IPTC_NAA_DATA_1028;
144 // break;
145 // case PSDImageResourceSection::IMAGE_MODE_RAW:
146 // resource = new IMAGE_MODE_RAW_1029;
147 // break;
148 // case PSDImageResourceSection::JPEG_QUAL:
149 // resource = new JPEG_QUAL_1030;
150 // break;
153 break;
154 // case PSDImageResourceSection::THUMB_RES:
155 // resource = new THUMB_RES_1033;
156 // break;
157 // case PSDImageResourceSection::COPYRIGHT_FLG:
158 // resource = new COPYRIGHT_FLG_1034;
159 // break;
160 // case PSDImageResourceSection::URL:
161 // resource = new URL_1035;
162 // break;
163 // case PSDImageResourceSection::THUMB_RES2:
164 // resource = new THUMB_RES2_1036;
165 // break;
168 break;
169 // case PSDImageResourceSection::COLOR_SAMPLER:
170 // resource = new COLOR_SAMPLER_1038;
171 // break;
174 break;
175 // case PSDImageResourceSection::WATERMARK:
176 // resource = new WATERMARK_1040;
177 // break;
178 // case PSDImageResourceSection::ICC_UNTAGGED:
179 // resource = new ICC_UNTAGGED_1041;
180 // break;
181 // case PSDImageResourceSection::EFFECTS_VISIBLE:
182 // resource = new EFFECTS_VISIBLE_1042;
183 // break;
184 // case PSDImageResourceSection::SPOT_HALFTONE:
185 // resource = new SPOT_HALFTONE_1043;
186 // break;
187 // case PSDImageResourceSection::DOC_IDS:
188 // resource = new DOC_IDS_1044;
189 // break;
190 // case PSDImageResourceSection::ALPHA_NAMES_UNI:
191 // resource = new ALPHA_NAMES_UNI_1045;
192 // break;
193 // case PSDImageResourceSection::IDX_COL_TAB_CNT:
194 // resource = new IDX_COL_TAB_CNT_1046;
195 // break;
196 // case PSDImageResourceSection::IDX_TRANSPARENT:
197 // resource = new IDX_TRANSPARENT_1047;
198 // break;
201 break;
202 // case PSDImageResourceSection::SLICES:
203 // resource = new SLICES_1050;
204 // break;
205 // case PSDImageResourceSection::WORKFLOW_URL_UNI:
206 // resource = new WORKFLOW_URL_UNI_1051;
207 // break;
208 // case PSDImageResourceSection::JUMP_TO_XPEP:
209 // resource = new JUMP_TO_XPEP_1052;
210 // break;
211 // case PSDImageResourceSection::ALPHA_ID:
212 // resource = new ALPHA_ID_1053;
213 // break;
214 // case PSDImageResourceSection::URL_LIST_UNI:
215 // resource = new URL_LIST_UNI_1054;
216 // break;
217 // case PSDImageResourceSection::VERSION_INFO:
218 // resource = new VERSION_INFO_1057;
219 // break;
220 // case PSDImageResourceSection::EXIF_DATA:
221 // resource = new EXIF_DATA_1058;
222 // break;
223 // case PSDImageResourceSection::XMP_DATA:
224 // resource = new XMP_DATA_1060;
225 // break;
226 // case PSDImageResourceSection::PATH_INFO_FIRST:
227 // resource = new PATH_INFO_FIRST_2000;
228 // break;
229 // case PSDImageResourceSection::PATH_INFO_LAST:
230 // resource = new PATH_INFO_LAST_2998;
231 // break;
232 // case PSDImageResourceSection::CLIPPING_PATH:
233 // resource = new CLIPPING_PATH_2999;
234 // break;
235 // case PSDImageResourceSection::PRINT_FLAGS_2:
236 // resource = new PRINT_FLAGS_2_10000;
237 // break;
238 default:;
239 }
240
241 if (resource) {
243 }
244
245 return valid();
246}
QString m_description
QByteArray m_annotation
static QString idToString(PSDResourceID id)
virtual bool interpretBlock(QByteArray)
#define dbgFile
Definition kis_debug.h:53
std::enable_if_t< std::is_arithmetic< T >::value, bool > psdread(QIODevice &io, T &v)
Definition psd_utils.h:397
bool psdread_pascalstring(QIODevice &io, QString &s, qint64 padding)
Definition psd_utils.h:417

References data, dataSize, dbgFile, error, PSDImageResourceSection::GLOBAL_ALT, PSDImageResourceSection::GLOBAL_ANGLE, PSDImageResourceSection::GRID_GUIDE, PSDImageResourceSection::ICC_PROFILE, identifier, PSDImageResourceSection::idToString(), PSDInterpretedResource::interpretBlock(), KisAnnotation::m_annotation, KisAnnotation::m_description, KisAnnotation::m_type, name, psdread(), psdread_pascalstring(), PSDImageResourceSection::RESN_INFO, resource, and valid().

◆ valid()

bool PSDResourceBlock::valid ( )

Definition at line 294 of file psd_resource_block.cpp.

295{
297 error = QString("Unknown ID: %1").arg(identifier);
298 return false;
299 }
300 if (data.size() != (int)dataSize) {
301 error = QString("Needed %1 bytes, got %2 bytes of data").arg(dataSize).arg(data.length());
302 return false;
303 }
304 return true;
305}

References data, dataSize, error, identifier, and PSDImageResourceSection::UNKNOWN.

◆ write()

bool PSDResourceBlock::write ( QIODevice & io) const

We can actually handle LAYER_SELECTION_ID. It consists of a number of layers and a list of IDs to select, which are retrieved from 'lyid' additional layer block.

Definition at line 248 of file psd_resource_block.cpp.

249{
251
252 if (resource && !resource->valid()) {
253 error = QString("Cannot write an invalid Resource Block");
254 return false;
255 }
256
265 dbgFile << "Skip writing resource block" << identifier << displayText();
266 return true;
267 }
268
269 QByteArray ba;
270
271 // createBlock returns true by default but does not change the data.
272 if (resource && !resource->createBlock(ba)) {
274 return false;
275 } else if (!resource) {
276 // reconstruct from the data
277 QBuffer buf(&ba);
278 buf.open(QBuffer::WriteOnly);
279 psdwrite(buf, "8BIM");
280 psdwrite(buf, identifier);
282 psdwrite(buf, dataSize);
283 buf.write(data);
284 buf.close();
285 }
286 if (io.write(ba.constData(), ba.size()) != ba.size()) {
287 error = QString("Could not write complete resource");
288 return false;
289 }
290
291 return true;
292}
virtual bool createBlock(QByteArray &)
QString displayText() const override
displayText: override this to return an interpreted version of the annotation
bool psdwrite_pascalstring(QIODevice &io, const QString &s)
Definition psd_utils.h:188
std::enable_if_t< std::is_arithmetic< T >::value, bool > psdwrite(QIODevice &io, T v)
Definition psd_utils.h:170

References PSDInterpretedResource::createBlock(), data, dataSize, dbgFile, displayText(), PSDInterpretedResource::error, error, identifier, PSDImageResourceSection::idToString(), PSDImageResourceSection::LAYER_COMPS, PSDImageResourceSection::LAYER_GROUP, PSDImageResourceSection::LAYER_GROUP_ENABLED_ID, PSDImageResourceSection::LAYER_SELECTION_ID, PSDImageResourceSection::LAYER_STATE, name, psdwrite(), psdwrite_pascalstring(), resource, and PSDInterpretedResource::valid().

Member Data Documentation

◆ data

QByteArray PSDResourceBlock::data

Definition at line 120 of file psd_resource_block.h.

◆ dataSize

quint32 PSDResourceBlock::dataSize

Definition at line 119 of file psd_resource_block.h.

◆ error

QString PSDResourceBlock::error
mutable

Definition at line 124 of file psd_resource_block.h.

◆ identifier

quint16 PSDResourceBlock::identifier

Definition at line 117 of file psd_resource_block.h.

◆ name

QString PSDResourceBlock::name

Definition at line 118 of file psd_resource_block.h.

◆ resource

PSDInterpretedResource* PSDResourceBlock::resource

Definition at line 122 of file psd_resource_block.h.


The documentation for this class was generated from the following files: