27void parseElement(
const QDomElement &el, QIODevice &device,
bool forceTypeInfo =
false)
31 QString type = el.attribute(
"type",
"<unknown>");
32 QString key = el.attribute(
"key",
"");
37 if (type ==
"Descriptor") {
39 writeVarString<byteOrder>(key, device);
42 if (!key.isEmpty() || forceTypeInfo) {
43 writeFixedString<byteOrder>(
"Objc", device);
46 QString classId = el.attribute(
"classId",
"");
47 QString name = el.attribute(
"name",
"");
49 writeUnicodeString<byteOrder>(name, device);
50 writeVarString<byteOrder>(classId, device);
52 quint32 numChildren =
static_cast<quint32
>(el.childNodes().size());
55 QDomNode child = el.firstChild();
56 while (!child.isNull()) {
57 parseElement<byteOrder>(child.toElement(), device);
58 child = child.nextSibling();
61 }
else if (type ==
"List") {
62 writeVarString<byteOrder>(key, device);
63 writeFixedString<byteOrder>(
"VlLs", device);
65 quint32 numChildren =
static_cast<quint32
>(el.childNodes().size());
68 QDomNode child = el.firstChild();
69 while (!child.isNull()) {
70 parseElement<byteOrder>(child.toElement(), device,
true);
71 child = child.nextSibling();
73 }
else if (type ==
"Double") {
76 writeVarString<byteOrder>(key, device);
77 writeFixedString<byteOrder>(
"doub", device);
80 }
else if (type ==
"UnitFloat") {
82 QString unit = el.attribute(
"unit",
"#Pxl");
85 writeVarString<byteOrder>(key, device);
87 writeFixedString<byteOrder>(
"UntF", device);
88 writeFixedString<byteOrder>(unit, device);
90 }
else if (type ==
"Text") {
91 QString
v = el.attribute(
"value",
"");
92 writeVarString<byteOrder>(key, device);
93 writeFixedString<byteOrder>(
"TEXT", device);
94 writeUnicodeString<byteOrder>(
v, device);
95 }
else if (type ==
"Enum") {
96 QString
v = el.attribute(
"value",
"");
97 QString typeId = el.attribute(
"typeId",
"DEAD");
98 writeVarString<byteOrder>(key, device);
99 writeFixedString<byteOrder>(
"enum", device);
100 writeVarString<byteOrder>(typeId, device);
101 writeVarString<byteOrder>(
v, device);
102 }
else if (type ==
"Integer") {
104 writeVarString<byteOrder>(key, device);
105 writeFixedString<byteOrder>(
"long", device);
107 }
else if (type ==
"Boolean") {
110 writeVarString<byteOrder>(key, device);
111 writeFixedString<byteOrder>(
"bool", device);
113 }
else if (type ==
"RawData" && key ==
"EngineData") {
114 writeVarString<byteOrder>(key, device);
115 writeFixedString<byteOrder>(
"tdta", device);
117 QDomNode dataNode = el.firstChild();
119 if (!dataNode.isCDATASection()) {
120 warnKrita <<
"WARNING: failed to parse RawData XML section!";
124 QDomCDATASection dataSection = dataNode.toCDATASection();
125 QByteArray data = dataSection.data().toLatin1();
126 data = QByteArray::fromBase64(data);
128 if (data.isEmpty()) {
129 warnKrita <<
"WARNING: failed to parse RawData XML section!";
131 quint32
length = data.size();
135 warnKrita <<
"WARNING: XML (ASL) Unknown element type:" << type <<
ppVar(key);
162 quint16 stylesVersion = 2;
167 QString signature(
"8BSL");
168 if (!device.write(signature.toLatin1().data(), 4)) {
174 quint16 patternsVersion = 3;
185 QDomElement root = doc.documentElement();
192 const quint32 numStylesTag =
static_cast<quint32
>(numStyles);
196 QDomNode child = root.firstChild();
198 for (
int styleIndex = 0; styleIndex < numStyles; styleIndex++) {
204 quint32 stylesFormatVersion = 16;
208 while (!child.isNull()) {
209 QDomElement el = child.toElement();
210 QString key = el.attribute(
"key",
"");
215 child = child.nextSibling();
219 child = child.nextSibling();
222 quint32 stylesFormatVersion = 16;
227 child = child.nextSibling();
230 const qint64 paddingSize = 4 - (device.pos() & 0x3);
231 if (paddingSize != 4) {
232 QByteArray padding(paddingSize,
'\0');
233 device.write(padding);
241 QDomElement root = doc.documentElement();
248 quint32 objectEffectsVersion = 0;
253 quint32 descriptorVersion = 16;
257 QDomNode child = root.firstChild();
259 while (!child.isNull()) {
260 QDomElement el = child.toElement();
261 QString key = el.attribute(
"key",
"");
266 child = child.nextSibling();
269 parseElement<byteOrder>(child.toElement(), device);
270 child = child.nextSibling();
273 const qint64 paddingSize = 4 - (device.pos() & 0x3);
274 if (paddingSize != 4) {
275 QByteArray padding(
static_cast<int>(paddingSize),
'\0');
276 device.write(padding);
283 QDomElement root = doc.documentElement();
287 quint32 descriptorVersion = 16;
291 QDomNode child = root.firstChild();
293 while (!child.isNull()) {
294 QDomElement el = child.toElement();
295 QString key = el.attribute(
"key",
"");
300 child = child.nextSibling();
303 parseElement<byteOrder>(child.toElement(), device);
304 child = child.nextSibling();
307 const qint64 paddingSize = 4 - (device.pos() & 0x3);
308 if (paddingSize != 4) {
309 QByteArray padding(
static_cast<int>(paddingSize),
'\0');
310 device.write(padding);
317 QDomElement root = doc.documentElement();
321 quint16 descriptorVersion = 1;
335 quint16 textVersion = 50;
337 quint32 descriptorVersion = 16;
341 QDomNode child = root.firstChild();
342 parseElement<byteOrder>(child.toElement(), device);
346 quint16 textVersion = 1;
348 quint32 descriptorVersion = 16;
352 QDomElement warpRoot = warpDoc.documentElement();
355 QDomNode warpChild = warpRoot.firstChild();
356 parseElement<byteOrder>(warpChild.toElement(), device);
366 const qint64 paddingSize = 4 - (device.pos() & 0x3);
367 if (paddingSize != 4) {
368 QByteArray padding(
static_cast<int>(paddingSize),
'\0');
369 device.write(padding);
398 QDomElement root = doc.documentElement();
406 quint32 descriptorVersion = 16;
410 QDomNode child = root.firstChild();
411 parseElement<byteOrder>(child.toElement(), device);
414 const qint64 paddingSize = 4 - (device.pos() & 0x3);
415 if (paddingSize != 4) {
416 QByteArray padding(
static_cast<int>(paddingSize),
'\0');
417 device.write(padding);