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

#include <kis_asl_patterns_writer.h>

Public Member Functions

 KisAslPatternsWriter (const QDomDocument &doc, QIODevice &device, psd_byte_order byteOrder)
 
void writePatterns ()
 

Private Member Functions

void addPattern (const KoPatternSP pattern)
 
template<psd_byte_order byteOrder = psd_byte_order::psdBigEndian>
void addPatternImpl (const KoPatternSP pattern)
 

Private Attributes

psd_byte_order m_byteOrder
 
QIODevice & m_device
 
const QDomDocument & m_doc
 
int m_numPatternsWritten
 

Detailed Description

Definition at line 20 of file kis_asl_patterns_writer.h.

Constructor & Destructor Documentation

◆ KisAslPatternsWriter()

KisAslPatternsWriter::KisAslPatternsWriter ( const QDomDocument & doc,
QIODevice & device,
psd_byte_order byteOrder )

Definition at line 20 of file kis_asl_patterns_writer.cpp.

21 : m_doc(doc)
22 , m_device(device)
24 , m_byteOrder(byteOrder)
25{
26}
const QDomDocument & m_doc

Member Function Documentation

◆ addPattern()

void KisAslPatternsWriter::addPattern ( const KoPatternSP pattern)
private

Definition at line 86 of file kis_asl_patterns_writer.cpp.

87{
88 KoPatternSP effectivePattern = pattern;
89
90 if (effectivePattern->hasAlpha()) {
91 effectivePattern = pattern->cloneWithoutAlpha();
92 }
93
94 switch (m_byteOrder) {
96 addPatternImpl<psd_byte_order::psdLittleEndian>(effectivePattern);
97 break;
98 default:
99 addPatternImpl(effectivePattern);
100 break;
101 }
102}
void addPatternImpl(const KoPatternSP pattern)

References addPatternImpl(), m_byteOrder, and psdLittleEndian.

◆ addPatternImpl()

template<psd_byte_order byteOrder>
void KisAslPatternsWriter::addPatternImpl ( const KoPatternSP pattern)
private

Definition at line 105 of file kis_asl_patterns_writer.cpp.

106{
107 {
109
110 {
111 const quint32 patternVersion = 1;
112 SAFE_WRITE_EX(byteOrder, m_device, patternVersion);
113 }
114
115 {
116 const quint32 patternImageMode = 3;
117 SAFE_WRITE_EX(byteOrder, m_device, patternImageMode);
118 }
119
120 {
121 const quint16 patternHeight = static_cast<quint16>(pattern->height());
122 SAFE_WRITE_EX(byteOrder, m_device, patternHeight);
123 }
124
125 {
126 const quint16 patternWidth = static_cast<quint16>(pattern->width());
127 SAFE_WRITE_EX(byteOrder, m_device, patternWidth);
128 }
129
130 KisAslWriterUtils::writeUnicodeString<byteOrder>(pattern->name(), m_device);
131 KisAslWriterUtils::writePascalString<byteOrder>(KisAslWriterUtils::getPatternUuidLazy(pattern), m_device);
132
133 // Write "Virtual Memory Array List"
134
135 const QRect patternRect(0, 0, pattern->width(), pattern->height());
136
137 {
138 {
139 const quint32 arrayVersion = 3;
140 SAFE_WRITE_EX(byteOrder, m_device, arrayVersion);
141 }
142
144
145 KisAslWriterUtils::writeRect<byteOrder>(patternRect, m_device);
146
147 {
148 // don't ask me why it is called this way...
149 const quint32 numberOfChannels = 24;
150 SAFE_WRITE_EX(byteOrder, m_device, numberOfChannels);
151 }
152
153 KIS_ASSERT_RECOVER_RETURN(patternRect.size() == pattern->pattern().size());
154
155 QVector<QVector<QByteArray>> imagePlanes;
156 bool isCompressed;
157 sliceQImage(pattern->pattern(), &imagePlanes, &isCompressed);
158
159 for (int i = 0; i < 3; i++) {
160 {
161 const quint32 planeIsWritten = 1;
162 SAFE_WRITE_EX(byteOrder, m_device, planeIsWritten);
163 }
164
166
167 {
168 const quint32 pixelDepth1 = 8;
169 SAFE_WRITE_EX(byteOrder, m_device, pixelDepth1);
170 }
171
172 KisAslWriterUtils::writeRect<byteOrder>(patternRect, m_device);
173
174 {
175 // why twice? who knows...
176 const quint16 pixelDepth2 = 8;
177 SAFE_WRITE_EX(byteOrder, m_device, pixelDepth2);
178 }
179
180 {
181 // compress with RLE
182 const quint8 compressionMethod = isCompressed;
183 SAFE_WRITE_EX(byteOrder, m_device, compressionMethod);
184 }
185
186 KIS_ASSERT_RECOVER_RETURN(imagePlanes[i].size() == pattern->pattern().height());
187
188 if (isCompressed) {
189 Q_FOREACH (const QByteArray &compressedRow, imagePlanes[i]) {
190 const quint16 compressionRowSize = static_cast<quint16>(compressedRow.size());
191 SAFE_WRITE_EX(byteOrder, m_device, compressionRowSize);
192 }
193 }
194
195 Q_FOREACH (const QByteArray &rowData, imagePlanes[i]) {
196 const qint64 bytesWritten = m_device.write(rowData);
197 if (bytesWritten != rowData.size()) {
198 throw KisAslWriterUtils::ASLWriteException("Failed to write a compressed pattern plane");
199 }
200 }
201 }
202 }
203 }
204
205 const qint64 currentPos = m_device.pos();
206 const qint64 alignedPos = KisAslWriterUtils::alignOffsetCeil(currentPos, 4);
207
208 if (currentPos != alignedPos) {
209 m_device.seek(alignedPos);
210 }
211
213}
void sliceQImage(const QImage &image, QVector< QVector< QByteArray > > *dstPlanes, bool *isCompressed)
#define SAFE_WRITE_EX(byteOrder, device, varname)
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
QString getPatternUuidLazy(const KoPatternSP pattern)
qint64 alignOffsetCeil(qint64 pos, qint64 alignment)
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KisAslWriterUtils::alignOffsetCeil(), KisAslWriterUtils::getPatternUuidLazy(), KIS_ASSERT_RECOVER_RETURN, m_device, m_numPatternsWritten, SAFE_WRITE_EX, and sliceQImage().

◆ writePatterns()

void KisAslPatternsWriter::writePatterns ( )

Definition at line 28 of file kis_asl_patterns_writer.cpp.

29{
31 c.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslPatternsWriter::addPattern, this, std::placeholders::_1));
32 c.subscribePattern("/patterns/KisPattern", std::bind(&KisAslPatternsWriter::addPattern, this, std::placeholders::_1));
33
34 KisAslXmlParser parser;
35 parser.parseXML(m_doc, c);
36}
void subscribePattern(const QString &path, ASLCallbackPattern callback)
void addPattern(const KoPatternSP pattern)
void parseXML(const QDomDocument &doc, KisAslObjectCatcher &catcher)

References addPattern(), m_doc, KisAslXmlParser::parseXML(), and KisAslCallbackObjectCatcher::subscribePattern().

Member Data Documentation

◆ m_byteOrder

psd_byte_order KisAslPatternsWriter::m_byteOrder
private

Definition at line 38 of file kis_asl_patterns_writer.h.

◆ m_device

QIODevice& KisAslPatternsWriter::m_device
private

Definition at line 35 of file kis_asl_patterns_writer.h.

◆ m_doc

const QDomDocument& KisAslPatternsWriter::m_doc
private

Definition at line 34 of file kis_asl_patterns_writer.h.

◆ m_numPatternsWritten

int KisAslPatternsWriter::m_numPatternsWritten
private

Definition at line 37 of file kis_asl_patterns_writer.h.


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