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

The PsdAdditionalLayerInfoBlock class implements the Additional Layer Information block. More...

#include <psd_additional_layer_info_block.h>

Public Types

using ExtraLayerInfoBlockHandler = std::function<bool(QIODevice &)>
 
using UserMaskInfoBlockHandler = std::function<bool(QIODevice &)>
 

Public Member Functions

 PsdAdditionalLayerInfoBlock (const PSDHeader &header)
 
bool read (QIODevice &io)
 
void setExtraLayerInfoBlockHandler (ExtraLayerInfoBlockHandler handler)
 
void setUserMaskInfoBlockHandler (UserMaskInfoBlockHandler handler)
 
bool valid ()
 
bool write (QIODevice &io, KisNodeSP node)
 
void writeFillLayerBlockEx (QIODevice &io, const QDomDocument &fillConfig, psd_fill_type type)
 
void writeLclrBlockEx (QIODevice &io, const quint16 &labelColor)
 
void writeLfx2BlockEx (QIODevice &io, const QDomDocument &stylesXmlDoc, bool useLfxsLayerStyleFormat)
 
void writeLsctBlockEx (QIODevice &io, psd_section_type sectionType, bool isPassThrough, const QString &blendModeKey)
 
void writeLuniBlockEx (QIODevice &io, const QString &layerName)
 
void writePattBlockEx (QIODevice &io, const QDomDocument &patternsXmlDoc)
 
void writeTxt2BlockEx (QIODevice &io, const QVariantHash txt2Hash)
 
void writeTypeToolBlockEx (QIODevice &io, psd_layer_type_shape typeTool)
 
void writeVectorOriginationDataEx (QIODevice &io, const QDomDocument &vectorOrigination)
 
void writeVectorStrokeDataEx (QIODevice &io, const QDomDocument &vectorStroke)
 
void writeVmskBlockEx (QIODevice &io, psd_vector_mask mask)
 

Public Attributes

QVector< QDomDocument > embeddedPatterns
 
QString error
 
QDomDocument fillConfig
 
psd_fill_type fillType {psd_fill_solid_color}
 
QStringList keys
 
quint16 labelColor {0}
 
QDomDocument layerStyleXml
 
const PSDHeaderm_header
 
QString sectionDividerBlendMode
 
psd_section_type sectionDividerType
 
QDomDocument textData
 
QTransform textTransform
 
QVariantHash txt2Data
 
QString unicodeLayerName
 
psd_vector_mask vectorMask
 
QDomDocument vectorOriginationData
 
QDomDocument vectorStroke
 

Private Member Functions

template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void readImpl (QIODevice &io)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeFillLayerBlockExImpl (QIODevice &io, const QDomDocument &fillConfig, psd_fill_type type)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeLclrBlockExImpl (QIODevice &io, const quint16 &lclr)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeLfx2BlockExImpl (QIODevice &io, const QDomDocument &stylesXmlDoc, bool useLfxsLayerStyleFormat)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeLsctBlockExImpl (QIODevice &io, psd_section_type sectionType, bool isPassThrough, const QString &blendModeKey)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeLuniBlockExImpl (QIODevice &io, const QString &layerName)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writePattBlockExImpl (QIODevice &io, const QDomDocument &patternsXmlDoc)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeTxt2BlockExImpl (QIODevice &io, const QVariantHash txt2Hash)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeTypeToolImpl (QIODevice &io, psd_layer_type_shape tool)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeVectorMaskImpl (QIODevice &io, psd_vector_mask mask)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeVectorOriginationDataImpl (QIODevice &io, const QDomDocument &vectorOrigination)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void writeVectorStrokeDataImpl (QIODevice &io, const QDomDocument &vectorStroke)
 

Private Attributes

ExtraLayerInfoBlockHandler m_layerInfoBlockHandler
 
UserMaskInfoBlockHandler m_userMaskBlockHandler
 

Detailed Description

Member Typedef Documentation

◆ ExtraLayerInfoBlockHandler

using PsdAdditionalLayerInfoBlock::ExtraLayerInfoBlockHandler = std::function<bool(QIODevice &)>

Definition at line 1354 of file psd_additional_layer_info_block.h.

◆ UserMaskInfoBlockHandler

using PsdAdditionalLayerInfoBlock::UserMaskInfoBlockHandler = std::function<bool(QIODevice &)>

Definition at line 1355 of file psd_additional_layer_info_block.h.

Constructor & Destructor Documentation

◆ PsdAdditionalLayerInfoBlock()

PsdAdditionalLayerInfoBlock::PsdAdditionalLayerInfoBlock ( const PSDHeader & header)

Definition at line 23 of file psd_additional_layer_info_block.cpp.

Member Function Documentation

◆ read()

bool PsdAdditionalLayerInfoBlock::read ( QIODevice & io)

Definition at line 39 of file psd_additional_layer_info_block.cpp.

40{
41 bool result = true;
42
43 try {
44 switch (m_header.byteOrder) {
46 readImpl<psd_byte_order::psdLittleEndian>(io);
47 break;
48 default:
49 readImpl(io);
50 break;
51 }
53 error = e.what();
54 result = false;
55 }
56
57 return result;
58}
psd_byte_order byteOrder
Definition psd_header.h:49

References PSDHeader::byteOrder, error, m_header, psdLittleEndian, and readImpl().

◆ readImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::readImpl ( QIODevice & io)
private

"I don't care I don't care, no... !" (c)

Definition at line 61 of file psd_additional_layer_info_block.cpp.

62{
63 using namespace KisAslReaderUtils;
64
65 QStringList longBlocks;
66 if (m_header.version > 1) {
67 longBlocks << "LMsk"
68 << "Lr16"
69 << "Lr32"
70 << "Layr"
71 << "Mt16"
72 << "Mt32"
73 << "Mtrn"
74 << "Alph"
75 << "FMsk"
76 << "lnk2"
77 << "FEid"
78 << "FXid"
79 << "PxSD";
80 }
81
82 while (!io.atEnd()) {
83 {
84 const std::array<quint8, 4> refSignature1 = {'8', 'B', 'I', 'M'}; // '8BIM' in big-endian
85 const std::array<quint8, 4> refSignature2 = {'8', 'B', '6', '4'}; // '8B64' in big-endian
86
87 if (!TRY_READ_SIGNATURE_2OPS_EX<byteOrder>(io, refSignature1, refSignature2)) {
88 break;
89 }
90 }
91
92 QString key = readFixedString<byteOrder>(io);
93 dbgFile << "found info block with key" << key << "(" << io.pos() << ")";
94
95 quint64 blockSize = GARBAGE_VALUE_MARK;
96 if (longBlocks.contains(key)) {
97 SAFE_READ_EX(byteOrder, io, blockSize);
98 } else {
99 quint32 size32;
100 SAFE_READ_EX(byteOrder, io, size32);
101 blockSize = size32;
102 }
103
104 // Since TIFF headers are padded to multiples of 4,
105 // staving them off here is way easier.
107 if (blockSize % 4U) {
108 dbgFile << "(TIFF) WARNING: current block size is NOT a multiple of 4! Fixing...";
109 blockSize += (4U - blockSize % 4U);
110 }
111 }
112
113 dbgFile << "info block size" << blockSize << "(" << io.pos() << ")";
114
115 if (blockSize == 0)
116 continue;
117
118 // offset verifier will correct the position on the exit from
119 // current namespace, including 'continue', 'return' and
120 // exceptions.
121 SETUP_OFFSET_VERIFIER(infoBlockEndVerifier, io, blockSize, 0);
122
123 if (keys.contains(key)) {
124 error = "Found duplicate entry for key ";
125 continue;
126 }
127 keys << key;
128
129 // TODO: Loading of 32 bit files is not supported yet
130 if (key == "Lr16" /* || key == "Lr32"*/) {
132 int offset = m_header.version > 1 ? 8 : 4;
133 dbgFile << "Offset for block handler: " << io.pos() << offset;
134 io.seek(io.pos() - offset);
136 }
137 } else if (key == "Layr") {
139 int offset = m_header.version > 1 ? 8 : 4;
140 dbgFile << "(TIFF) Offset for block handler: " << io.pos() << offset;
141 io.seek(io.pos() - offset);
143 }
144 } else if (key == "SoCo") {
145 // Solid Color
148 } else if (key == "GdFl") {
149 // Gradient Fill
152 } else if (key == "PtFl") {
153 // Pattern Fill
156 } else if (key == "brit") {
157 } else if (key == "levl") {
158 } else if (key == "curv") {
159 } else if (key == "expA") {
160 } else if (key == "vibA") {
161 } else if (key == "hue") {
162 } else if (key == "hue2") {
163 } else if (key == "blnc") {
164 } else if (key == "blwh") {
165 } else if (key == "phfl") {
166 } else if (key == "mixr") {
167 } else if (key == "clrL") {
168 } else if (key == "nvrt") {
169 } else if (key == "post") {
170 } else if (key == "thrs") {
171 } else if (key == "selc") {
172 } else if (key == "lrFX") {
173 // deprecated! use lfx2 instead!
174 } else if (key == "tySh") {
175 } else if (key == "luni") {
176 // get the unicode layer name
177 unicodeLayerName = readUnicodeString<byteOrder>(io);
178 dbgFile << "\t" << "unicodeLayerName" << unicodeLayerName;
179 } else if (key == "lyid") {
180 quint32 id;
181 psdread<byteOrder>(io, id);
182 dbgFile << "\t" << "layer ID:" << id;
183 } else if (key == "lfx2" || key == "lfxs") {
184 // lfxs is a special variant of layer styles for group layers
186 } else if (key == "Patt" || key == "Pat2" || key == "Pat3") {
187 QDomDocument pattern = KisAslReader::readPsdSectionPattern(io, blockSize, byteOrder);
188 embeddedPatterns << pattern;
189 } else if (key == "Anno") {
190 } else if (key == "clbl") {
191 } else if (key == "infx") {
192 } else if (key == "knko") {
193 } else if (key == "spf") {
194 } else if (key == "lclr") {
195 // layer label color.
196 quint16 col1 = 0;
197 quint16 col2 = 0;
198 quint16 col3 = 0;
199 quint16 col4 = 0;
200 psdread<byteOrder>(io, col1);
201 psdread<byteOrder>(io, col2);
202 psdread<byteOrder>(io, col3);
203 psdread<byteOrder>(io, col4);
204 dbgFile << "\t" << "layer color:" << col1 << col2 << col3 << col4;
205 labelColor = col1;
206 } else if (key == "fxrp") {
207 } else if (key == "grdm") {
208 } else if (key == "lsct") {
209 quint32 dividerType = GARBAGE_VALUE_MARK;
210 SAFE_READ_EX(byteOrder, io, dividerType);
211 this->sectionDividerType = (psd_section_type)dividerType;
212
213 dbgFile << "Reading \"lsct\" block:";
214 dbgFile << ppVar(blockSize);
215 dbgFile << ppVar(dividerType);
216
217 if (blockSize >= 12) {
218 quint32 lsctSignature = GARBAGE_VALUE_MARK;
219 const quint32 refSignature1 = 0x3842494D; // '8BIM' in little-endian
220 SAFE_READ_SIGNATURE_EX(byteOrder, io, lsctSignature, refSignature1);
221
222 this->sectionDividerBlendMode = readFixedString<byteOrder>(io);
223
225 }
226
227 // Animation
228 if (blockSize >= 14) {
233 }
234
235 } else if (key == "brst") {
236 } else if (key == "vmsk" || key == "vsms") { // If key is "vsms" then we are writing for (Photoshop CS6) and the document will have a "vscg" key
237 quint32 version; // ( = 3 for Photoshop 6.0)
238 psdread<byteOrder>(io, version);
239
240 quint32 flags;
241 psdread<byteOrder>(io, flags);
242 // read the flags.
243 vectorMask.invert = flags & 1? true: false;
244 vectorMask.notLink = flags & 2? true: false;
245 vectorMask.disable = flags & 4? true: false;
246
247 quint64 currentPos = 8;
248 psd_path_sub_path currentPath;
249 bool firstPath = true;
250
251 while (currentPos < blockSize) {
252 quint16 recordType;
253 psdread<byteOrder>(io, recordType);
254
255 if (recordType == 6) {
256 io.skip(24);
257 dbgFile << "\trecord" << recordType;
258 } else if (recordType == 7) {
259 QRectF bounds;
260 // unsure if there can be multiple clipboard records...
261 bounds.setTop(psdreadFixedPoint<byteOrder>(io));
262 bounds.setLeft(psdreadFixedPoint<byteOrder>(io));
263 bounds.setBottom(psdreadFixedPoint<byteOrder>(io));
264 bounds.setRight(psdreadFixedPoint<byteOrder>(io));
266 vectorMask.path.clipBoardResolution = psdreadFixedPoint<byteOrder>(io);
267 dbgFile << "\trecord" << recordType << "top" << bounds << "res" << vectorMask.path.clipBoardResolution;
268 io.skip(4);
269 } else if (recordType == 0 || recordType == 3) {
270 quint16 length;
271 psdread<byteOrder>(io, length);
272 dbgFile << "\trecord" << recordType << "length" << length;
273 if (firstPath) {
274 currentPath.isClosed = (recordType == 0);
275 } else {
276 vectorMask.path.subPaths.append(currentPath);
277 currentPath = psd_path_sub_path();
278 currentPath.isClosed = (recordType == 0);
279 }
280 firstPath = false;
281 io.skip(22);
282 } else if (recordType == 8) {
283 quint16 length;
284 psdread<byteOrder>(io, length);
285 dbgFile << "\trecord" << recordType << "length" << length;
287 io.skip(22);
288 } else {
289 psd_path_node node;
290 node.control1.setY(psdreadFixedPoint<byteOrder>(io));
291 node.control1.setX(psdreadFixedPoint<byteOrder>(io));
292 node.node.setY(psdreadFixedPoint<byteOrder>(io));
293 node.node.setX(psdreadFixedPoint<byteOrder>(io));
294 node.control2.setY(psdreadFixedPoint<byteOrder>(io));
295 node.control2.setX(psdreadFixedPoint<byteOrder>(io));
296 node.isSmooth = (recordType == 1 || recordType == 4);
297 dbgFile << "\trecord" << recordType << "c1" << node.control1
298 << "node" << node.node << "c2" << node.control2;
299 currentPath.nodes.append(node);
300 }
301
302 currentPos += 26;
303 }
304 if (!currentPath.nodes.isEmpty()) {
305 vectorMask.path.subPaths.append(currentPath);
306 }
307
308 } else if (key == "TySh") {
310 } else if (key == "ffxi") {
311 } else if (key == "lnsr") {
312 } else if (key == "shpa") {
313 } else if (key == "shmd") {
314 } else if (key == "lyvr") {
315 } else if (key == "tsly") {
316 } else if (key == "lmgm") {
317 } else if (key == "vmgm") {
318 } else if (key == "plLd") { // Replaced by SoLd in CS3
319
320 } else if (key == "linkD" || key == "lnk2" || key == "lnk3") {
321 } else if (key == "CgEd") {
322 } else if (key == "Txt2") { // global text data, basically the same as an Illustrator text object.
323 // Docs say "first 4 are length", this is not true for this particular block, only when in ASL is first 4 length.
324 QByteArray ba = io.read(blockSize);
326 txt2Data = KisTxt2Utils::uncompressKeys(p.parseCosToJson(&ba));
327 } else if (key == "pths") {
328 } else if (key == "anFX") {
329 } else if (key == "FMsk") {
330 } else if (key == "SoLd") {
331 } else if (key == "vstk") { // vector stroke info
333 } else if (key == "vscg") {
334 if (blockSize > 4) {
335 QString vscgKey = readFixedString<byteOrder>(io);
337 if (vscgKey == "SoCo") {
339 } else if (vscgKey == "GdFl") {
340 // Gradient Fill
342 } else if (vscgKey == "PtFl") {
343 // Pattern Fill
345 }
346 }
347 } else if (key == "sn2P") {
348 } else if (key == "vogk") { // Live path shapes, these are similar to parametric shapes.
350 } else if (key == "Mtrn" || key == "Mt16" || key == "Mt32") { // There is no data associated with these keys.
351
352 } else if (key == "LMsk") {
353 // TIFFs store the global mask here.
355 int offset = m_header.version > 1 ? 8 : 4;
356 dbgFile << "(TIFF) Offset for block handler: " << io.pos() << offset;
357 io.seek(io.pos() - offset);
359 }
360 } else if (key == "FXid") {
361 } else if (key == "FEid") {
362 }
363 }
364}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
const Params2D p
static QDomDocument readLfx2PsdSection(QIODevice &device, psd_byte_order byteOrder=psd_byte_order::psdBigEndian)
static QDomDocument readPsdSectionPattern(QIODevice &device, qint64 bytesLeft, psd_byte_order byteOrder=psd_byte_order::psdBigEndian)
static QDomDocument readTypeToolObjectSettings(QIODevice &device, QTransform &transform, psd_byte_order byteOrder=psd_byte_order::psdBigEndian)
static QDomDocument readVectorOriginationData(QIODevice &device, psd_byte_order byteOrder=psd_byte_order::psdBigEndian)
static QDomDocument readVectorStroke(QIODevice &device, psd_byte_order byteOrder=psd_byte_order::psdBigEndian)
static QDomDocument readFillLayer(QIODevice &device, psd_byte_order byteOrder=psd_byte_order::psdBigEndian)
The KisCosParser class.
static QVariantHash uncompressKeys(QVariantHash doc)
uncompressKeys One of the problems with the Txt2 block is that older versions of photoshop (cs2-cs3 e...
quint16 version
Definition psd_header.h:43
bool tiffStyleLayerBlock
Definition psd_header.h:50
ExtraLayerInfoBlockHandler m_layerInfoBlockHandler
#define GARBAGE_VALUE_MARK
#define SAFE_READ_EX(byteOrder, device, varname)
#define SAFE_READ_SIGNATURE_EX(byteOrder, device, varname, expected)
#define bounds(x, a, b)
#define ppVar(var)
Definition kis_debug.h:155
#define dbgFile
Definition kis_debug.h:53
#define SETUP_OFFSET_VERIFIER(name, device, expectedOffset, maxPadding)
psd_section_type
Definition psd.h:144
@ psd_fill_solid_color
Definition psd.h:124
@ psd_fill_gradient
Definition psd.h:125
@ psd_fill_pattern
Definition psd.h:126
QList< psd_path_sub_path > subPaths

References bounds, psd_path::clipBoardBounds, psd_path::clipBoardResolution, psd_path_node::control1, psd_path_node::control2, dbgFile, psd_vector_mask::disable, embeddedPatterns, error, fillConfig, fillType, GARBAGE_VALUE_MARK, psd_path::initialFillRecord, psd_vector_mask::invert, psd_path_sub_path::isClosed, psd_path_node::isSmooth, keys, labelColor, layerStyleXml, length(), m_header, m_layerInfoBlockHandler, m_userMaskBlockHandler, psd_path_node::node, psd_path_sub_path::nodes, psd_vector_mask::notLink, p, psd_vector_mask::path, ppVar, psd_fill_gradient, psd_fill_pattern, psd_fill_solid_color, KisAslReader::readFillLayer(), KisAslReader::readLfx2PsdSection(), KisAslReader::readPsdSectionPattern(), KisAslReader::readTypeToolObjectSettings(), KisAslReader::readVectorOriginationData(), KisAslReader::readVectorStroke(), SAFE_READ_EX, SAFE_READ_SIGNATURE_EX, sectionDividerBlendMode, sectionDividerType, SETUP_OFFSET_VERIFIER, psd_path::subPaths, textData, textTransform, PSDHeader::tiffStyleLayerBlock, txt2Data, KisTxt2Utils::uncompressKeys(), unicodeLayerName, vectorMask, vectorOriginationData, vectorStroke, and PSDHeader::version.

◆ setExtraLayerInfoBlockHandler()

void PsdAdditionalLayerInfoBlock::setExtraLayerInfoBlockHandler ( ExtraLayerInfoBlockHandler handler)

Definition at line 29 of file psd_additional_layer_info_block.cpp.

30{
32}

References m_layerInfoBlockHandler.

◆ setUserMaskInfoBlockHandler()

void PsdAdditionalLayerInfoBlock::setUserMaskInfoBlockHandler ( UserMaskInfoBlockHandler handler)

Definition at line 34 of file psd_additional_layer_info_block.cpp.

35{
36 m_userMaskBlockHandler = handler;
37}

References m_userMaskBlockHandler.

◆ valid()

bool PsdAdditionalLayerInfoBlock::valid ( )

Definition at line 371 of file psd_additional_layer_info_block.cpp.

372{
373 return true;
374}

◆ write()

bool PsdAdditionalLayerInfoBlock::write ( QIODevice & io,
KisNodeSP node )

Definition at line 366 of file psd_additional_layer_info_block.cpp.

367{
368 return true;
369}

◆ writeFillLayerBlockEx()

void PsdAdditionalLayerInfoBlock::writeFillLayerBlockEx ( QIODevice & io,
const QDomDocument & fillConfig,
psd_fill_type type )

Definition at line 479 of file psd_additional_layer_info_block.cpp.

480{
481 switch (m_header.byteOrder) {
483 writeFillLayerBlockExImpl<psd_byte_order::psdLittleEndian>(io, fillConfig, type);
484 break;
485 default:
487 break;
488 }
489}
void writeFillLayerBlockExImpl(QIODevice &io, const QDomDocument &fillConfig, psd_fill_type type)

References PSDHeader::byteOrder, fillConfig, m_header, psdLittleEndian, and writeFillLayerBlockExImpl().

◆ writeFillLayerBlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeFillLayerBlockExImpl ( QIODevice & io,
const QDomDocument & fillConfig,
psd_fill_type type )
private

Definition at line 577 of file psd_additional_layer_info_block.cpp.

578{
579 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
580 if (type == psd_fill_solid_color) {
581 KisAslWriterUtils::writeFixedString<byteOrder>("SoCo", io);
582 } else if (type == psd_fill_gradient) {
583 KisAslWriterUtils::writeFixedString<byteOrder>("GdFl", io);
584 } else {
585 KisAslWriterUtils::writeFixedString<byteOrder>("PtFl", io);
586 }
588
589 try {
590 KisAslWriter writer(byteOrder);
591
592 writer.writeFillLayerSectionEx(io, fillConfig);
593
595 warnKrita << "WARNING: Couldn't save fill layer block:" << PREPEND_METHOD(e.what());
596
597 // TODO: make this error recoverable!
598 throw e;
599 }
600}
#define PREPEND_METHOD(msg)
Definition kis_debug.h:172
#define warnKrita
Definition kis_debug.h:87

References fillConfig, PREPEND_METHOD, psd_fill_gradient, psd_fill_solid_color, warnKrita, and KisAslWriter::writeFillLayerSectionEx().

◆ writeLclrBlockEx()

void PsdAdditionalLayerInfoBlock::writeLclrBlockEx ( QIODevice & io,
const quint16 & labelColor )

Definition at line 467 of file psd_additional_layer_info_block.cpp.

468{
469 switch (m_header.byteOrder) {
471 writeLclrBlockExImpl<psd_byte_order::psdLittleEndian>(io, labelColor);
472 break;
473 default:
475 break;
476 }
477}
void writeLclrBlockExImpl(QIODevice &io, const quint16 &lclr)

References PSDHeader::byteOrder, labelColor, m_header, psdLittleEndian, and writeLclrBlockExImpl().

◆ writeLclrBlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeLclrBlockExImpl ( QIODevice & io,
const quint16 & lclr )
private

Definition at line 560 of file psd_additional_layer_info_block.cpp.

561{
562 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
563 KisAslWriterUtils::writeFixedString<byteOrder>("lclr", io);
564 // 4x2 quint16
565 const quint32 len = 8;
566 SAFE_WRITE_EX(byteOrder, io, len);
567 quint16 zero = 0;
568 SAFE_WRITE_EX(byteOrder, io, lclr);
569 SAFE_WRITE_EX(byteOrder, io, zero);
570 SAFE_WRITE_EX(byteOrder, io, zero);
571 SAFE_WRITE_EX(byteOrder, io, zero);
572
573
574}
#define SAFE_WRITE_EX(byteOrder, device, varname)

References SAFE_WRITE_EX.

◆ writeLfx2BlockEx()

void PsdAdditionalLayerInfoBlock::writeLfx2BlockEx ( QIODevice & io,
const QDomDocument & stylesXmlDoc,
bool useLfxsLayerStyleFormat )

Definition at line 423 of file psd_additional_layer_info_block.cpp.

424{
425 switch (m_header.byteOrder) {
427 writeLfx2BlockExImpl<psd_byte_order::psdLittleEndian>(io, stylesXmlDoc, useLfxsLayerStyleFormat);
428 break;
429 default:
430 writeLfx2BlockExImpl(io, stylesXmlDoc, useLfxsLayerStyleFormat);
431 break;
432 }
433}
void writeLfx2BlockExImpl(QIODevice &io, const QDomDocument &stylesXmlDoc, bool useLfxsLayerStyleFormat)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeLfx2BlockExImpl().

◆ writeLfx2BlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeLfx2BlockExImpl ( QIODevice & io,
const QDomDocument & stylesXmlDoc,
bool useLfxsLayerStyleFormat )
private

Definition at line 436 of file psd_additional_layer_info_block.cpp.

437{
438 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
439 // 'lfxs' format is used for Group layers in PS
440 KisAslWriterUtils::writeFixedString<byteOrder>(!useLfxsLayerStyleFormat ? "lfx2" : "lfxs", io);
442
443 try {
444 KisAslWriter writer(byteOrder);
445 writer.writePsdLfx2SectionEx(io, stylesXmlDoc);
446
448 warnKrita << "WARNING: Couldn't save layer style lfx2 block:" << PREPEND_METHOD(e.what());
449
450 // TODO: make this error recoverable!
451 throw e;
452 }
453}

References PREPEND_METHOD, warnKrita, and KisAslWriter::writePsdLfx2SectionEx().

◆ writeLsctBlockEx()

void PsdAdditionalLayerInfoBlock::writeLsctBlockEx ( QIODevice & io,
psd_section_type sectionType,
bool isPassThrough,
const QString & blendModeKey )

Definition at line 397 of file psd_additional_layer_info_block.cpp.

398{
399 switch (m_header.byteOrder) {
401 writeLsctBlockExImpl<psd_byte_order::psdLittleEndian>(io, sectionType, isPassThrough, blendModeKey);
402 break;
403 default:
404 writeLsctBlockExImpl(io, sectionType, isPassThrough, blendModeKey);
405 break;
406 }
407}
void writeLsctBlockExImpl(QIODevice &io, psd_section_type sectionType, bool isPassThrough, const QString &blendModeKey)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeLsctBlockExImpl().

◆ writeLsctBlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeLsctBlockExImpl ( QIODevice & io,
psd_section_type sectionType,
bool isPassThrough,
const QString & blendModeKey )
private

Definition at line 410 of file psd_additional_layer_info_block.cpp.

411{
412 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
413 KisAslWriterUtils::writeFixedString<byteOrder>("lsct", io);
415 SAFE_WRITE_EX(byteOrder, io, (quint32)sectionType);
416
417 QString realBlendModeKey = isPassThrough ? QString("pass") : blendModeKey;
418
419 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
420 KisAslWriterUtils::writeFixedString<byteOrder>(realBlendModeKey, io);
421}

References SAFE_WRITE_EX.

◆ writeLuniBlockEx()

void PsdAdditionalLayerInfoBlock::writeLuniBlockEx ( QIODevice & io,
const QString & layerName )

Definition at line 376 of file psd_additional_layer_info_block.cpp.

377{
378 switch (m_header.byteOrder) {
380 writeLuniBlockExImpl<psd_byte_order::psdLittleEndian>(io, layerName);
381 break;
382 default:
383 writeLuniBlockExImpl(io, layerName);
384 break;
385 }
386}
void writeLuniBlockExImpl(QIODevice &io, const QString &layerName)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeLuniBlockExImpl().

◆ writeLuniBlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeLuniBlockExImpl ( QIODevice & io,
const QString & layerName )
private

Definition at line 389 of file psd_additional_layer_info_block.cpp.

390{
391 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
392 KisAslWriterUtils::writeFixedString<byteOrder>("luni", io);
394 KisAslWriterUtils::writeUnicodeString<byteOrder>(layerName, io);
395}

◆ writePattBlockEx()

void PsdAdditionalLayerInfoBlock::writePattBlockEx ( QIODevice & io,
const QDomDocument & patternsXmlDoc )

Definition at line 455 of file psd_additional_layer_info_block.cpp.

456{
457 switch (m_header.byteOrder) {
459 writePattBlockExImpl<psd_byte_order::psdLittleEndian>(io, patternsXmlDoc);
460 break;
461 default:
462 writePattBlockExImpl(io, patternsXmlDoc);
463 break;
464 }
465}
void writePattBlockExImpl(QIODevice &io, const QDomDocument &patternsXmlDoc)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writePattBlockExImpl().

◆ writePattBlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writePattBlockExImpl ( QIODevice & io,
const QDomDocument & patternsXmlDoc )
private

Definition at line 540 of file psd_additional_layer_info_block.cpp.

541{
542 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
543 KisAslWriterUtils::writeFixedString<byteOrder>("Patt", io);
544 const quint32 padding = m_header.tiffStyleLayerBlock ? 4 : 2;
546
547 try {
548 KisAslPatternsWriter writer(patternsXmlDoc, io, byteOrder);
549 writer.writePatterns();
550
552 warnKrita << "WARNING: Couldn't save layer style patterns block:" << PREPEND_METHOD(e.what());
553
554 // TODO: make this error recoverable!
555 throw e;
556 }
557}

References m_header, PREPEND_METHOD, PSDHeader::tiffStyleLayerBlock, warnKrita, and KisAslPatternsWriter::writePatterns().

◆ writeTxt2BlockEx()

void PsdAdditionalLayerInfoBlock::writeTxt2BlockEx ( QIODevice & io,
const QVariantHash txt2Hash )

Definition at line 727 of file psd_additional_layer_info_block.cpp.

728{
729 switch (m_header.byteOrder) {
731 writeTxt2BlockExImpl<psd_byte_order::psdLittleEndian>(io, txt2Hash);
732 break;
733 default:
734 writeTxt2BlockExImpl(io, txt2Hash);
735 break;
736 }
737}
void writeTxt2BlockExImpl(QIODevice &io, const QVariantHash txt2Hash)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeTxt2BlockExImpl().

◆ writeTxt2BlockExImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeTxt2BlockExImpl ( QIODevice & io,
const QVariantHash txt2Hash )
private

Definition at line 740 of file psd_additional_layer_info_block.cpp.

741{
742 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
743 KisAslWriterUtils::writeFixedString<byteOrder>("Txt2", io);
744
745 QByteArray ba = KisCosWriter::writeTxt2FromVariantHash(txt2Hash);
746 quint32 length = ba.size();
747 SAFE_WRITE_EX(byteOrder, io, length);
748 io.write(ba);
749}
static QByteArray writeTxt2FromVariantHash(const QVariantHash doc)

References length(), SAFE_WRITE_EX, and KisCosWriter::writeTxt2FromVariantHash().

◆ writeTypeToolBlockEx()

void PsdAdditionalLayerInfoBlock::writeTypeToolBlockEx ( QIODevice & io,
psd_layer_type_shape typeTool )

Definition at line 503 of file psd_additional_layer_info_block.cpp.

504{
505 switch (m_header.byteOrder) {
507 writeTypeToolImpl<psd_byte_order::psdLittleEndian>(io, typeTool);
508 break;
509 default:
510 writeTypeToolImpl(io, typeTool);
511 break;
512 }
513}
void writeTypeToolImpl(QIODevice &io, psd_layer_type_shape tool)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeTypeToolImpl().

◆ writeTypeToolImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeTypeToolImpl ( QIODevice & io,
psd_layer_type_shape tool )
private

Definition at line 688 of file psd_additional_layer_info_block.cpp.

689{
690 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
691 KisAslWriterUtils::writeFixedString<byteOrder>("TySh", io);
692
694
695 try {
696 KisAslWriter writer(byteOrder);
697
698 writer.writeTypeToolObjectSettings(io, tool.textDataASLXML(), tool.textWarpXML(), tool.transform, tool.boundingBox);
699
701 warnKrita << "WARNING: Couldn't save text layer block:" << PREPEND_METHOD(e.what());
702
703 // TODO: make this error recoverable!
704 throw e;
705 }
706}

References psd_layer_type_shape::boundingBox, PREPEND_METHOD, psd_layer_type_shape::textDataASLXML(), psd_layer_type_shape::textWarpXML(), psd_layer_type_shape::transform, warnKrita, and KisAslWriter::writeTypeToolObjectSettings().

◆ writeVectorMaskImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeVectorMaskImpl ( QIODevice & io,
psd_vector_mask mask )
private

Definition at line 603 of file psd_additional_layer_info_block.cpp.

604{
605 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
606 KisAslWriterUtils::writeFixedString<byteOrder>("vmsk", io);
607
608 quint32 len = 8; //, 4 version, 4 flags
609 len += 52; // 26 path record, 26 initial fill rule.
610 Q_FOREACH(psd_path_sub_path subPath, mask.path.subPaths) {
611 len += 26; // subpath record;
612 len += subPath.nodes.size() * 26; //and one for each node.
613 }
614
615 SAFE_WRITE_EX(byteOrder, io, len);
616
617 quint32 version = 3;
618 SAFE_WRITE_EX(byteOrder, io, version);
619 quint32 flags = 0;
620 if (mask.invert) {
621 flags |= 1;
622 }
623 if (mask.notLink) {
624 flags |= 2;
625 }
626 if (mask.disable) {
627 flags |= 4;
628 }
629 SAFE_WRITE_EX(byteOrder, io, flags);
630
631 // start path records
632 quint16 recordType = 6;
633 quint32 zero = 0;
634 SAFE_WRITE_EX(byteOrder, io, recordType);
635 // 24 empty bits
636 SAFE_WRITE_EX(byteOrder, io, zero);
637 SAFE_WRITE_EX(byteOrder, io, zero);
638 SAFE_WRITE_EX(byteOrder, io, zero);
639 SAFE_WRITE_EX(byteOrder, io, zero);
640 SAFE_WRITE_EX(byteOrder, io, zero);
641 SAFE_WRITE_EX(byteOrder, io, zero);
642 // initial fill rule record
643 recordType = 8;
644 SAFE_WRITE_EX(byteOrder, io, recordType);
645 quint16 fillType = mask.path.initialFillRecord? 1: 0;
646 SAFE_WRITE_EX(byteOrder, io, fillType);
647 // 22 empty bits
648 const quint16 halfZero = 0;
649 SAFE_WRITE_EX(byteOrder, io, halfZero);
650 SAFE_WRITE_EX(byteOrder, io, zero);
651 SAFE_WRITE_EX(byteOrder, io, zero);
652 SAFE_WRITE_EX(byteOrder, io, zero);
653 SAFE_WRITE_EX(byteOrder, io, zero);
654 SAFE_WRITE_EX(byteOrder, io, zero);
655 // write the subpaths.
656 Q_FOREACH(psd_path_sub_path subPath, mask.path.subPaths) {
657 recordType = subPath.isClosed? 0: 3;
658 quint16 length = subPath.nodes.size();
659 dbgFile << "writing subpath" << subPath.nodes.size();
660 SAFE_WRITE_EX(byteOrder, io, recordType);
661 SAFE_WRITE_EX(byteOrder, io, length);
662 // 22 empty bits
663 SAFE_WRITE_EX(byteOrder, io, halfZero);
664 SAFE_WRITE_EX(byteOrder, io, zero);
665 SAFE_WRITE_EX(byteOrder, io, zero);
666 SAFE_WRITE_EX(byteOrder, io, zero);
667 SAFE_WRITE_EX(byteOrder, io, zero);
668 SAFE_WRITE_EX(byteOrder, io, zero);
669
670 Q_FOREACH(psd_path_node node, subPath.nodes) {
671 if (subPath.isClosed) {
672 recordType = node.isSmooth? 1: 2;
673 } else {
674 recordType = node.isSmooth? 4: 5;
675 }
676 SAFE_WRITE_EX(byteOrder, io, recordType);
677 psdwriteFixedPoint<byteOrder>(io, node.control1.y());
678 psdwriteFixedPoint<byteOrder>(io, node.control1.x());
679 psdwriteFixedPoint<byteOrder>(io, node.node.y());
680 psdwriteFixedPoint<byteOrder>(io, node.node.x());
681 psdwriteFixedPoint<byteOrder>(io, node.control2.y());
682 psdwriteFixedPoint<byteOrder>(io, node.control2.x());
683 }
684 }
685}

References psd_path_node::control1, psd_path_node::control2, dbgFile, psd_vector_mask::disable, fillType, psd_path::initialFillRecord, psd_vector_mask::invert, psd_path_sub_path::isClosed, psd_path_node::isSmooth, length(), psd_path_node::node, psd_path_sub_path::nodes, psd_vector_mask::notLink, psd_vector_mask::path, SAFE_WRITE_EX, and psd_path::subPaths.

◆ writeVectorOriginationDataEx()

void PsdAdditionalLayerInfoBlock::writeVectorOriginationDataEx ( QIODevice & io,
const QDomDocument & vectorOrigination )

Definition at line 527 of file psd_additional_layer_info_block.cpp.

528{
529 switch (m_header.byteOrder) {
531 writeVectorOriginationDataImpl<psd_byte_order::psdLittleEndian>(io, vectorOrigination);
532 break;
533 default:
534 writeVectorOriginationDataImpl(io, vectorOrigination);
535 break;
536 }
537}
void writeVectorOriginationDataImpl(QIODevice &io, const QDomDocument &vectorOrigination)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeVectorOriginationDataImpl().

◆ writeVectorOriginationDataImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeVectorOriginationDataImpl ( QIODevice & io,
const QDomDocument & vectorOrigination )
private

Definition at line 752 of file psd_additional_layer_info_block.cpp.

753{
754 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
755 KisAslWriterUtils::writeFixedString<byteOrder>("vogk", io);
757 try {
758 KisAslWriter writer(byteOrder);
759
760 writer.writeVectorOriginationDataEx(io, vectorOrigination);
761
763 warnKrita << "WARNING: Couldn't save vector stroke layer block:" << PREPEND_METHOD(e.what());
764
765 // TODO: make this error recoverable!
766 throw e;
767 }
768}

References PREPEND_METHOD, warnKrita, and KisAslWriter::writeVectorOriginationDataEx().

◆ writeVectorStrokeDataEx()

void PsdAdditionalLayerInfoBlock::writeVectorStrokeDataEx ( QIODevice & io,
const QDomDocument & vectorStroke )

Definition at line 515 of file psd_additional_layer_info_block.cpp.

516{
517 switch (m_header.byteOrder) {
519 writeVectorStrokeDataImpl<psd_byte_order::psdLittleEndian>(io, vectorStroke);
520 break;
521 default:
523 break;
524 }
525}
void writeVectorStrokeDataImpl(QIODevice &io, const QDomDocument &vectorStroke)

References PSDHeader::byteOrder, m_header, psdLittleEndian, vectorStroke, and writeVectorStrokeDataImpl().

◆ writeVectorStrokeDataImpl()

template<psd_byte_order byteOrder>
void PsdAdditionalLayerInfoBlock::writeVectorStrokeDataImpl ( QIODevice & io,
const QDomDocument & vectorStroke )
private

Definition at line 709 of file psd_additional_layer_info_block.cpp.

710{
711 KisAslWriterUtils::writeFixedString<byteOrder>("8BIM", io);
712 KisAslWriterUtils::writeFixedString<byteOrder>("vstk", io);
714 try {
715 KisAslWriter writer(byteOrder);
716
717 writer.writeVectorStrokeDataEx(io, vectorStroke);
718
720 warnKrita << "WARNING: Couldn't save vector stroke layer block:" << PREPEND_METHOD(e.what());
721
722 // TODO: make this error recoverable!
723 throw e;
724 }
725}

References PREPEND_METHOD, vectorStroke, warnKrita, and KisAslWriter::writeVectorStrokeDataEx().

◆ writeVmskBlockEx()

void PsdAdditionalLayerInfoBlock::writeVmskBlockEx ( QIODevice & io,
psd_vector_mask mask )

Definition at line 491 of file psd_additional_layer_info_block.cpp.

492{
493 switch (m_header.byteOrder) {
495 writeVectorMaskImpl<psd_byte_order::psdLittleEndian>(io, mask);
496 break;
497 default:
498 writeVectorMaskImpl(io, mask);
499 break;
500 }
501}
void writeVectorMaskImpl(QIODevice &io, psd_vector_mask mask)

References PSDHeader::byteOrder, m_header, psdLittleEndian, and writeVectorMaskImpl().

Member Data Documentation

◆ embeddedPatterns

QVector<QDomDocument> PsdAdditionalLayerInfoBlock::embeddedPatterns

Definition at line 1385 of file psd_additional_layer_info_block.h.

◆ error

QString PsdAdditionalLayerInfoBlock::error

Definition at line 1379 of file psd_additional_layer_info_block.h.

◆ fillConfig

QDomDocument PsdAdditionalLayerInfoBlock::fillConfig

Definition at line 1390 of file psd_additional_layer_info_block.h.

◆ fillType

psd_fill_type PsdAdditionalLayerInfoBlock::fillType {psd_fill_solid_color}

Definition at line 1391 of file psd_additional_layer_info_block.h.

◆ keys

QStringList PsdAdditionalLayerInfoBlock::keys

Definition at line 1380 of file psd_additional_layer_info_block.h.

◆ labelColor

quint16 PsdAdditionalLayerInfoBlock::labelColor {0}

Definition at line 1388 of file psd_additional_layer_info_block.h.

1388{0}; // layer color.

◆ layerStyleXml

QDomDocument PsdAdditionalLayerInfoBlock::layerStyleXml

Definition at line 1383 of file psd_additional_layer_info_block.h.

◆ m_header

const PSDHeader& PsdAdditionalLayerInfoBlock::m_header

Definition at line 1378 of file psd_additional_layer_info_block.h.

◆ m_layerInfoBlockHandler

ExtraLayerInfoBlockHandler PsdAdditionalLayerInfoBlock::m_layerInfoBlockHandler
private

Definition at line 1441 of file psd_additional_layer_info_block.h.

◆ m_userMaskBlockHandler

UserMaskInfoBlockHandler PsdAdditionalLayerInfoBlock::m_userMaskBlockHandler
private

Definition at line 1442 of file psd_additional_layer_info_block.h.

◆ sectionDividerBlendMode

QString PsdAdditionalLayerInfoBlock::sectionDividerBlendMode

Definition at line 1401 of file psd_additional_layer_info_block.h.

◆ sectionDividerType

psd_section_type PsdAdditionalLayerInfoBlock::sectionDividerType

Definition at line 1400 of file psd_additional_layer_info_block.h.

◆ textData

QDomDocument PsdAdditionalLayerInfoBlock::textData

Definition at line 1394 of file psd_additional_layer_info_block.h.

◆ textTransform

QTransform PsdAdditionalLayerInfoBlock::textTransform

Definition at line 1393 of file psd_additional_layer_info_block.h.

◆ txt2Data

QVariantHash PsdAdditionalLayerInfoBlock::txt2Data

Definition at line 1386 of file psd_additional_layer_info_block.h.

◆ unicodeLayerName

QString PsdAdditionalLayerInfoBlock::unicodeLayerName

Definition at line 1382 of file psd_additional_layer_info_block.h.

◆ vectorMask

psd_vector_mask PsdAdditionalLayerInfoBlock::vectorMask

Definition at line 1396 of file psd_additional_layer_info_block.h.

◆ vectorOriginationData

QDomDocument PsdAdditionalLayerInfoBlock::vectorOriginationData

Definition at line 1398 of file psd_additional_layer_info_block.h.

◆ vectorStroke

QDomDocument PsdAdditionalLayerInfoBlock::vectorStroke

Definition at line 1397 of file psd_additional_layer_info_block.h.


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