Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_asl_layer_style_serializer.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9#include "kis_image.h"
10
11#include <QDomDocument>
12#include <QMultiHash>
13
14#include <QBuffer>
15#include <KoMD5Generator.h>
16
17#include <KisResourceModel.h>
18
23#include <resources/KoPattern.h>
24
25#include "kis_layer_utils.h"
26#include "kis_dom_utils.h"
27
28#include <kis_layer.h>
29#include <kis_pointer_utils.h>
30
31#include "psd.h"
32#include "kis_global.h"
33
34#include "asl/kis_asl_reader.h"
37
39#include "asl/kis_asl_writer.h"
40
41#include <functional>
42
43using namespace std::placeholders;
44
49
53
58
60{
62 Q_FOREACH(const KisPSDLayerStyleSP style, styles) {
63 m_stylesHash.insert(style->psdUuid(), style);
64 }
65 m_initialized = true;
66}
67
68QHash<QString, KoPatternSP> KisAslLayerStyleSerializer::patterns() const
69{
70 return m_patternsStore;
71}
72
77
78QHash<QString, KisPSDLayerStyleSP> KisAslLayerStyleSerializer::stylesHash()
79{
80 if (m_stylesHash.count() == 0 && m_stylesVector.count() != 0) {
81 // build the hash
82 Q_FOREACH(KisPSDLayerStyleSP style, m_stylesVector) {
83 m_stylesHash.insert(style->psdUuid(), style);
84 }
85 }
86 return m_stylesHash;
87}
88
89QString compositeOpToBlendMode(const QString &compositeOp)
90{
91 QString mode = "Nrml";
92
93 if (compositeOp == COMPOSITE_OVER) {
94 mode = "Nrml";
95 } else if (compositeOp == COMPOSITE_DISSOLVE) {
96 mode = "Dslv";
97 } else if (compositeOp == COMPOSITE_DARKEN) {
98 mode = "Drkn";
99 } else if (compositeOp == COMPOSITE_MULT) {
100 mode = "Mltp";
101 } else if (compositeOp == COMPOSITE_BURN) {
102 mode = "CBrn";
103 } else if (compositeOp == COMPOSITE_LINEAR_BURN) {
104 mode = "linearBurn";
105 } else if (compositeOp == COMPOSITE_DARKER_COLOR) {
106 mode = "darkerColor";
107 } else if (compositeOp == COMPOSITE_LIGHTEN) {
108 mode = "Lghn";
109 } else if (compositeOp == COMPOSITE_SCREEN) {
110 mode = "Scrn";
111 } else if (compositeOp == COMPOSITE_DODGE) {
112 mode = "CDdg";
113 } else if (compositeOp == COMPOSITE_LINEAR_DODGE) {
114 mode = "linearDodge";
115 } else if (compositeOp == COMPOSITE_LIGHTER_COLOR) {
116 mode = "lighterColor";
117 } else if (compositeOp == COMPOSITE_OVERLAY) {
118 mode = "Ovrl";
119 } else if (compositeOp == COMPOSITE_SOFT_LIGHT_PHOTOSHOP) {
120 mode = "SftL";
121 } else if (compositeOp == COMPOSITE_HARD_LIGHT) {
122 mode = "HrdL";
123 } else if (compositeOp == COMPOSITE_VIVID_LIGHT) {
124 mode = "vividLight";
125 } else if (compositeOp == COMPOSITE_LINEAR_LIGHT) {
126 mode = "linearLight";
127 } else if (compositeOp == COMPOSITE_PIN_LIGHT) {
128 mode = "pinLight";
129 } else if (compositeOp == COMPOSITE_HARD_MIX_PHOTOSHOP) {
130 mode = "hardMix";
131 } else if (compositeOp == COMPOSITE_DIFF) {
132 mode = "Dfrn";
133 } else if (compositeOp == COMPOSITE_EXCLUSION) {
134 mode = "Xclu";
135 } else if (compositeOp == COMPOSITE_SUBTRACT) {
136 mode = "Sbtr";
137 } else if (compositeOp == COMPOSITE_DIVIDE) {
138 mode = "divide";
139 } else if (compositeOp == COMPOSITE_HUE) {
140 mode = "H ";
141 } else if (compositeOp == COMPOSITE_SATURATION) {
142 mode = "Strt";
143 } else if (compositeOp == COMPOSITE_COLOR) {
144 mode = "Clr ";
145 } else if (compositeOp == COMPOSITE_LUMINIZE) {
146 mode = "Lmns";
147 } else {
148 dbgKrita << "Unknown composite op:" << mode << "Returning \"Nrml\"!";
149 }
150
151 return mode;
152}
153
154QString techniqueToString(psd_technique_type technique, const QString &typeId)
155{
156 QString result = "SfBL";
157
158 switch (technique) {
160 result = "SfBL";
161 break;
163 result = "PrBL";
164 break;
166 result = "Slmt";
167 break;
168 }
169
170 if (typeId == "BETE" && technique == psd_technique_slope_limit) {
171 warnKrita << "WARNING: techniqueToString: invalid technique type!" << ppVar(technique) << ppVar(typeId);
172 }
173
174 return result;
175}
176
178{
179 QString result = "OtrB";
180
181 switch (style) {
183 result = "OtrB";
184 break;
186 result = "InrB";
187 break;
188 case psd_bevel_emboss:
189 result = "Embs";
190 break;
192 result = "PlEb";
193 break;
195 result = "strokeEmboss";
196 break;
197 }
198
199 return result;
200}
201
203{
204 QString result = "Lnr ";
205
206 switch (style) {
208 result = "Lnr ";
209 break;
211 result = "Rdl ";
212 break;
214 result = "Angl";
215 break;
217 result = "Rflc";
218 break;
220 result = "Dmnd";
221 break;
222 }
223
224 return result;
225}
226
228{
229 QString result = "OutF";
230
231 switch (position) {
233 result = "OutF";
234 break;
236 result = "InsF";
237 break;
239 result = "CtrF";
240 break;
241 }
242
243 return result;
244}
245
247{
248 QString result = "SClr";
249
250 switch (position) {
252 result = "SClr";
253 break;
255 result = "GrFl";
256 break;
257 case psd_fill_pattern:
258 result = "Ptrn";
259 break;
260 }
261
262 return result;
263}
264
266{
267 QVector<KoResourceSignature> allPatternLinks;
268
269 if (style->patternOverlay()->effectEnabled()) {
270 allPatternLinks << style->patternOverlay()->patternLink();
271 }
272
273 if (style->stroke()->effectEnabled() &&
274 style->stroke()->fillType() == psd_fill_pattern) {
275
276 allPatternLinks << style->stroke()->patternLink();
277 }
278
279 if(style->bevelAndEmboss()->effectEnabled() &&
280 style->bevelAndEmboss()->textureEnabled()) {
281
282 allPatternLinks << style->bevelAndEmboss()->texturePatternLink();
283 }
284
285 return allPatternLinks;
286}
288{
289 const auto allPatternLinks = fetchAllPatternLinks(style);
290 QVector <KoPatternSP> allPatterns;
291
292 Q_FOREACH(const KoResourceSignature &sig, allPatternLinks) {
293 KoPatternSP pattern = resourcesInterface->source<KoPattern>(sig.type).bestMatch(sig.md5sum, sig.filename, sig.name);
294 if (pattern) {
295 allPatterns << pattern;
296 } else {
297 warnKrita << "WARNING: failed to fetch a pattern for a layer style" << sig;
298 }
299 }
300
301 return allPatterns;
302}
303
304QString fetchPatternUuidSafe(KoPatternSP pattern, QHash<KoPatternSP, QString> patternToUuid)
305{
306 if (patternToUuid.contains(pattern)) {
307 return patternToUuid[pattern];
308 } else {
309 warnKrita << "WARNING: the pattern is not present in the Uuid map!";
310 return "invalid-uuid";
311 }
312}
313
315{
316 KIS_ASSERT_RECOVER(!m_stylesVector.isEmpty()) { return QDomDocument(); }
317
318 QVector<KoPatternSP> allPatterns;
319
322 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
323 allPatterns += fetchAllPatterns(style.data(), style->resourcesInterface());
324 }
325
326 QHash<KoPatternSP, QString> patternToUuidMap;
327
329
330 if (!allPatterns.isEmpty()) {
331 w.enterList(ResourceType::Patterns);
332
333 Q_FOREACH (KoPatternSP pattern, allPatterns) {
334 if (pattern) {
335 if (!patternToUuidMap.contains(pattern)) {
336 QString uuid = w.writePattern("", pattern);
337 patternToUuidMap.insert(pattern, uuid);
338 }
339 } else {
340 warnKrita << "WARNING: KisAslLayerStyleSerializer::saveToDevice: saved pattern is null!";
341 }
342 }
343
344 w.leaveList();
345 }
346
347 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
348
349 w.enterDescriptor("", "", "null");
350 w.writeText("Nm ", style->name());
351 w.writeText("Idnt", style->psdUuid());
352 w.leaveDescriptor();
353
354 w.enterDescriptor("", "", "Styl");
355
356 w.enterDescriptor("documentMode", "", "documentMode");
357 w.leaveDescriptor();
358
359 w.enterDescriptor("Lefx", "", "Lefx");
360
361 w.writeUnitFloat("Scl ", "#Prc", 100);
362 w.writeBoolean("masterFXSwitch", style->isEnabled());
363
364
365 // Drop Shadow
366 const psd_layer_effects_drop_shadow *dropShadow = style->dropShadow();
367 if (dropShadow->effectEnabled()) {
368 w.enterDescriptor("DrSh", "", "DrSh");
369
370 w.writeBoolean("enab", dropShadow->effectEnabled());
371 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(dropShadow->blendMode()));
372 w.writeColor("Clr ", dropShadow->color());
373
374 w.writeUnitFloat("Opct", "#Prc", dropShadow->opacity());
375 w.writeBoolean("uglg", dropShadow->useGlobalLight());
376 w.writeUnitFloat("lagl", "#Ang", dropShadow->angle());
377 w.writeUnitFloat("Dstn", "#Pxl", dropShadow->distance());
378 w.writeUnitFloat("Ckmt", "#Pxl", dropShadow->spread());
379 w.writeUnitFloat("blur", "#Pxl", dropShadow->size());
380 w.writeUnitFloat("Nose", "#Prc", dropShadow->noise());
381
382 w.writeBoolean("AntA", dropShadow->antiAliased());
383
384 // FIXME: save curves
385 w.writeCurve("TrnS",
386 "Linear",
387 QVector<QPointF>() << QPointF() << QPointF(255, 255));
388
389 w.writeBoolean("layerConceals", dropShadow->knocksOut());
390 w.leaveDescriptor();
391 }
392
393 // Inner Shadow
394 const psd_layer_effects_inner_shadow *innerShadow = style->innerShadow();
395 if (innerShadow->effectEnabled()) {
396 w.enterDescriptor("IrSh", "", "IrSh");
397
398 w.writeBoolean("enab", innerShadow->effectEnabled());
399 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(innerShadow->blendMode()));
400 w.writeColor("Clr ", innerShadow->color());
401
402 w.writeUnitFloat("Opct", "#Prc", innerShadow->opacity());
403 w.writeBoolean("uglg", innerShadow->useGlobalLight());
404 w.writeUnitFloat("lagl", "#Ang", innerShadow->angle());
405 w.writeUnitFloat("Dstn", "#Pxl", innerShadow->distance());
406 w.writeUnitFloat("Ckmt", "#Pxl", innerShadow->spread());
407 w.writeUnitFloat("blur", "#Pxl", innerShadow->size());
408 w.writeUnitFloat("Nose", "#Prc", innerShadow->noise());
409
410 w.writeBoolean("AntA", innerShadow->antiAliased());
411
412 // FIXME: save curves
413 w.writeCurve("TrnS",
414 "Linear",
415 QVector<QPointF>() << QPointF() << QPointF(255, 255));
416
417 w.leaveDescriptor();
418 }
419
420 // Outer Glow
421 const psd_layer_effects_outer_glow *outerGlow = style->outerGlow();
422 if (outerGlow->effectEnabled()) {
423 w.enterDescriptor("OrGl", "", "OrGl");
424
425 w.writeBoolean("enab", outerGlow->effectEnabled());
426 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(outerGlow->blendMode()));
427
428 if (outerGlow->fillType() == psd_fill_gradient && outerGlow->gradient(style->resourcesInterface())) {
429 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(outerGlow->gradient(style->resourcesInterface()).data());
430 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(outerGlow->gradient(style->resourcesInterface()).data());
431
432 if (segmentGradient && segmentGradient->valid()) {
433 w.writeSegmentGradient("Grad", *segmentGradient);
434 } else if (stopGradient && stopGradient->valid()) {
435 w.writeStopGradient("Grad", *stopGradient);
436 } else {
437 warnKrita << "WARNING: OG: Unknown gradient type!";
438 w.writeColor("Clr ", outerGlow->color());
439 }
440
441 } else {
442 w.writeColor("Clr ", outerGlow->color());
443 }
444
445 w.writeUnitFloat("Opct", "#Prc", outerGlow->opacity());
446
447 w.writeEnum("GlwT", "BETE", techniqueToString(outerGlow->technique(), "BETE"));
448
449 w.writeUnitFloat("Ckmt", "#Pxl", outerGlow->spread());
450 w.writeUnitFloat("blur", "#Pxl", outerGlow->size());
451 w.writeUnitFloat("Nose", "#Prc", outerGlow->noise());
452
453 w.writeUnitFloat("ShdN", "#Prc", outerGlow->jitter());
454
455 w.writeBoolean("AntA", outerGlow->antiAliased());
456
457 // FIXME: save curves
458 w.writeCurve("TrnS",
459 "Linear",
460 QVector<QPointF>() << QPointF() << QPointF(255, 255));
461
462 w.writeUnitFloat("Inpr", "#Prc", outerGlow->range());
463
464 w.leaveDescriptor();
465 }
466
467 // Inner Glow
468 const psd_layer_effects_inner_glow *innerGlow = style->innerGlow();
469 if (innerGlow->effectEnabled()) {
470 w.enterDescriptor("IrGl", "", "IrGl");
471
472 w.writeBoolean("enab", innerGlow->effectEnabled());
473 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(innerGlow->blendMode()));
474
475 if (innerGlow->fillType() == psd_fill_gradient && innerGlow->gradient(style->resourcesInterface())) {
476 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(innerGlow->gradient(style->resourcesInterface()).data());
477 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(innerGlow->gradient(style->resourcesInterface()).data());
478
479 if (segmentGradient && innerGlow->gradient(style->resourcesInterface())->valid()) {
480 w.writeSegmentGradient("Grad", *segmentGradient);
481 } else if (stopGradient && innerGlow->gradient(style->resourcesInterface())->valid()) {
482 w.writeStopGradient("Grad", *stopGradient);
483 } else {
484 warnKrita << "WARNING: IG: Unknown gradient type!";
485 w.writeColor("Clr ", innerGlow->color());
486 }
487
488 } else {
489 w.writeColor("Clr ", innerGlow->color());
490 }
491
492 w.writeUnitFloat("Opct", "#Prc", innerGlow->opacity());
493
494 w.writeEnum("GlwT", "BETE", techniqueToString(innerGlow->technique(), "BETE"));
495
496 w.writeUnitFloat("Ckmt", "#Pxl", innerGlow->spread());
497 w.writeUnitFloat("blur", "#Pxl", innerGlow->size());
498
499 // NOTE: order is swapped in ASL!
500 w.writeUnitFloat("ShdN", "#Prc", innerGlow->jitter());
501 w.writeUnitFloat("Nose", "#Prc", innerGlow->noise());
502
503 w.writeBoolean("AntA", innerGlow->antiAliased());
504
505 w.writeEnum("glwS", "IGSr", innerGlow->source() == psd_glow_center ? "SrcC" : "SrcE");
506
507 // FIXME: save curves
508 w.writeCurve("TrnS",
509 "Linear",
510 QVector<QPointF>() << QPointF() << QPointF(255, 255));
511
512 w.writeUnitFloat("Inpr", "#Prc", innerGlow->range());
513
514 w.leaveDescriptor();
515 }
516
517 // Bevel and Emboss
518 const psd_layer_effects_bevel_emboss *bevelAndEmboss = style->bevelAndEmboss();
519 if (bevelAndEmboss->effectEnabled()) {
520 w.enterDescriptor("ebbl", "", "ebbl");
521
522 w.writeBoolean("enab", bevelAndEmboss->effectEnabled());
523
524 w.writeEnum("hglM", "BlnM", compositeOpToBlendMode(bevelAndEmboss->highlightBlendMode()));
525 w.writeColor("hglC", bevelAndEmboss->highlightColor());
526 w.writeUnitFloat("hglO", "#Prc", bevelAndEmboss->highlightOpacity());
527
528 w.writeEnum("sdwM", "BlnM", compositeOpToBlendMode(bevelAndEmboss->shadowBlendMode()));
529 w.writeColor("sdwC", bevelAndEmboss->shadowColor());
530 w.writeUnitFloat("sdwO", "#Prc", bevelAndEmboss->shadowOpacity());
531
532 w.writeEnum("bvlT", "bvlT", techniqueToString(bevelAndEmboss->technique(), "bvlT"));
533 w.writeEnum("bvlS", "BESl", bevelStyleToString(bevelAndEmboss->style()));
534
535 w.writeBoolean("uglg", bevelAndEmboss->useGlobalLight());
536 w.writeUnitFloat("lagl", "#Ang", bevelAndEmboss->angle());
537 w.writeUnitFloat("Lald", "#Ang", bevelAndEmboss->altitude());
538
539 w.writeUnitFloat("srgR", "#Prc", bevelAndEmboss->depth());
540 w.writeUnitFloat("blur", "#Pxl", bevelAndEmboss->size());
541 w.writeEnum("bvlD", "BESs", bevelAndEmboss->direction() == psd_direction_up ? "In " : "Out ");
542
543 // FIXME: save curves
544 w.writeCurve("TrnS",
545 "Linear",
546 QVector<QPointF>() << QPointF() << QPointF(255, 255));
547
548 w.writeBoolean("antialiasGloss", bevelAndEmboss->glossAntiAliased());
549
550 w.writeUnitFloat("Sftn", "#Pxl", bevelAndEmboss->soften());
551
552 if (bevelAndEmboss->contourEnabled()) {
553 w.writeBoolean("useShape", bevelAndEmboss->contourEnabled());
554
555 // FIXME: save curves
556 w.writeCurve("MpgS",
557 "Linear",
558 QVector<QPointF>() << QPointF() << QPointF(255, 255));
559
560 w.writeBoolean("AntA", bevelAndEmboss->antiAliased());
561 w.writeUnitFloat("Inpr", "#Prc", bevelAndEmboss->contourRange());
562 }
563
564 w.writeBoolean("useTexture", bevelAndEmboss->textureEnabled());
565
566 if (bevelAndEmboss->textureEnabled()) {
567 w.writeBoolean("InvT", bevelAndEmboss->textureInvert());
568 w.writeBoolean("Algn", bevelAndEmboss->textureAlignWithLayer());
569 w.writeUnitFloat("Scl ", "#Prc", bevelAndEmboss->textureScale());
570 w.writeUnitFloat("textureDepth ", "#Prc", bevelAndEmboss->textureDepth());
571
572 KoPatternSP pattern = bevelAndEmboss->texturePattern(style->resourcesInterface());
573 w.writePatternRef("Ptrn", pattern, fetchPatternUuidSafe(pattern, patternToUuidMap));
574 w.writePhasePoint("phase", bevelAndEmboss->texturePhase());
575 }
576
577 w.leaveDescriptor();
578 }
579
580 // Satin
581 const psd_layer_effects_satin *satin = style->satin();
582 if (satin->effectEnabled()) {
583 w.enterDescriptor("ChFX", "", "ChFX");
584
585 w.writeBoolean("enab", satin->effectEnabled());
586 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(satin->blendMode()));
587 w.writeColor("Clr ", satin->color());
588
589 w.writeBoolean("AntA", satin->antiAliased());
590 w.writeBoolean("Invr", satin->invert());
591 w.writeUnitFloat("Opct", "#Prc", satin->opacity());
592 w.writeUnitFloat("lagl", "#Ang", satin->angle());
593 w.writeUnitFloat("Dstn", "#Pxl", satin->distance());
594 w.writeUnitFloat("blur", "#Pxl", satin->size());
595
596 // FIXME: save curves
597 w.writeCurve("MpgS",
598 "Linear",
599 QVector<QPointF>() << QPointF() << QPointF(255, 255));
600
601 w.leaveDescriptor();
602 }
603
604 const psd_layer_effects_color_overlay *colorOverlay = style->colorOverlay();
605 if (colorOverlay->effectEnabled()) {
606 w.enterDescriptor("SoFi", "", "SoFi");
607
608 w.writeBoolean("enab", colorOverlay->effectEnabled());
609 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(colorOverlay->blendMode()));
610 w.writeUnitFloat("Opct", "#Prc", colorOverlay->opacity());
611 w.writeColor("Clr ", colorOverlay->color());
612
613 w.leaveDescriptor();
614 }
615
616 // Gradient Overlay
617 const psd_layer_effects_gradient_overlay *gradientOverlay = style->gradientOverlay();
618 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(gradientOverlay->gradient(style->resourcesInterface()).data());
619 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(gradientOverlay->gradient(style->resourcesInterface()).data());
620
621 if (gradientOverlay->effectEnabled() && ((segmentGradient && segmentGradient->valid()) || (stopGradient && stopGradient->valid()))) {
622 w.enterDescriptor("GrFl", "", "GrFl");
623
624 w.writeBoolean("enab", gradientOverlay->effectEnabled());
625 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(gradientOverlay->blendMode()));
626 w.writeUnitFloat("Opct", "#Prc", gradientOverlay->opacity());
627
628 if (segmentGradient && segmentGradient->valid()) {
629 w.writeSegmentGradient("Grad", *segmentGradient);
630 } else if (stopGradient && stopGradient->valid()) {
631 w.writeStopGradient("Grad", *stopGradient);
632 }
633
634 w.writeUnitFloat("Angl", "#Ang", gradientOverlay->angle());
635
636 w.writeEnum("Type", "GrdT", gradientTypeToString(gradientOverlay->style()));
637
638 w.writeBoolean("Rvrs", gradientOverlay->reverse());
639 w.writeBoolean("Algn", gradientOverlay->alignWithLayer());
640 w.writeUnitFloat("Scl ", "#Prc", gradientOverlay->scale());
641
642 w.writeOffsetPoint("Ofst", gradientOverlay->gradientOffset());
643
644 w.writeBoolean("Dthr", gradientOverlay->dither());
645
646 w.leaveDescriptor();
647 }
648
649 // Pattern Overlay
650 const psd_layer_effects_pattern_overlay *patternOverlay = style->patternOverlay();
651 if (patternOverlay->effectEnabled()) {
652 w.enterDescriptor("patternFill", "", "patternFill");
653
654 w.writeBoolean("enab", patternOverlay->effectEnabled());
655 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(patternOverlay->blendMode()));
656 w.writeUnitFloat("Opct", "#Prc", patternOverlay->opacity());
657
658 KoPatternSP pattern = patternOverlay->pattern(style->resourcesInterface());
659 w.writePatternRef("Ptrn", pattern, fetchPatternUuidSafe(pattern, patternToUuidMap));
660
661 w.writeUnitFloat("Scl ", "#Prc", patternOverlay->scale());
662 w.writeBoolean("Algn", patternOverlay->alignWithLayer());
663 w.writePhasePoint("phase", patternOverlay->patternPhase());
664
665 w.leaveDescriptor();
666 }
667
668 const psd_layer_effects_stroke *stroke = style->stroke();
669 if (stroke->effectEnabled()) {
670 w.enterDescriptor("FrFX", "", "FrFX");
671
672 w.writeBoolean("enab", stroke->effectEnabled());
673
674 w.writeEnum("Styl", "FStl", strokePositionToString(stroke->position()));
675 w.writeEnum("PntT", "FrFl", strokeFillTypeToString(stroke->fillType()));
676
677 w.writeEnum("Md ", "BlnM", compositeOpToBlendMode(stroke->blendMode()));
678 w.writeUnitFloat("Opct", "#Prc", stroke->opacity());
679
680 w.writeUnitFloat("Sz ", "#Pxl", stroke->size());
681
682 if (stroke->fillType() == psd_fill_solid_color) {
683 w.writeColor("Clr ", stroke->color());
684 }
685 else if (stroke->fillType() == psd_fill_gradient) {
686 KoSegmentGradient *segmentGradient = dynamic_cast<KoSegmentGradient*>(stroke->gradient(style->resourcesInterface()).data());
687 KoStopGradient *stopGradient = dynamic_cast<KoStopGradient*>(stroke->gradient(style->resourcesInterface()).data());
688
689 if (segmentGradient && segmentGradient->valid()) {
690 w.writeSegmentGradient("Grad", *segmentGradient);
691 } else if (stopGradient && stopGradient->valid()) {
692 w.writeStopGradient("Grad", *stopGradient);
693 } else {
694 warnKrita << "WARNING: Stroke: Unknown gradient type!";
695 w.writeColor("Clr ", stroke->color());
696 }
697
698 w.writeUnitFloat("Angl", "#Ang", stroke->angle());
699 w.writeEnum("Type", "GrdT", gradientTypeToString(stroke->style()));
700
701 w.writeBoolean("Rvrs", stroke->reverse());
702 w.writeUnitFloat("Scl ", "#Prc", stroke->scale());
703 w.writeBoolean("Algn", stroke->alignWithLayer());
704 w.writeOffsetPoint("Ofst", stroke->gradientOffset());
705
706 w.writeBoolean("Dthr", stroke->dither());
707
708 } else if (stroke->fillType() == psd_fill_pattern) {
709
710 KoPatternSP pattern = stroke->pattern(style->resourcesInterface());
711 w.writePatternRef("Ptrn", pattern, fetchPatternUuidSafe(pattern, patternToUuidMap));
712 w.writeUnitFloat("Scl ", "#Prc", stroke->scale());
713 w.writeBoolean("Lnkd", stroke->alignWithLayer());
714 w.writePhasePoint("phase", stroke->patternPhase());
715 }
716
717 w.leaveDescriptor();
718 }
719
720 w.leaveDescriptor();
721 w.leaveDescriptor();
722 }
723
724 return w.document();
725}
726
727inline QDomNode findNodeByClassId(const QString &classId, QDomNode parent) {
728 return KisDomUtils::findElementByAttribute(parent, "node", "classId", classId);
729}
730
731void replaceAllChildren(QDomNode src, QDomNode dst)
732{
733 QDomNode node;
734
735 do {
736 node = dst.lastChild();
737 dst.removeChild(node);
738
739 } while(!node.isNull());
740
741
742 node = src.firstChild();
743 while(!node.isNull()) {
744 dst.appendChild(node);
745 node = src.firstChild();
746 }
747
748 src.parentNode().removeChild(src);
749}
750
752{
753 QDomDocument doc = formXmlDocument();
754
755 QDomNode nullNode = findNodeByClassId("null", doc.documentElement());
756 QDomNode stylNode = findNodeByClassId("Styl", doc.documentElement());
757 QDomNode lefxNode = findNodeByClassId("Lefx", stylNode);
758
759 replaceAllChildren(lefxNode, nullNode);
760
761 return doc;
762}
763
765{
766 QVector<KoResourceSignature> embeddedResourceLinks = fetchAllPatternLinks(style);
767
768 if (style->gradientOverlay()->effectEnabled()) {
769 embeddedResourceLinks << style->gradientOverlay()->gradientLink();
770 }
771
772 if (style->innerGlow()->effectEnabled() && style->innerGlow()->fillType() == psd_fill_gradient) {
773 embeddedResourceLinks << style->innerGlow()->gradientLink();
774 }
775
776 if (style->outerGlow()->effectEnabled() && style->outerGlow()->fillType() == psd_fill_gradient) {
777 embeddedResourceLinks << style->outerGlow()->gradientLink();
778 }
779
780 if (style->stroke()->effectEnabled() && style->stroke()->fillType() == psd_fill_gradient) {
781 embeddedResourceLinks << style->stroke()->gradientLink();
782 }
783
784 return embeddedResourceLinks;
785}
786
788{
789 QDomDocument doc = formXmlDocument();
790 KIS_ASSERT(!doc.isNull());
791
792 KisAslWriter writer;
793 writer.writeFile(device, doc);
794}
795
796bool KisAslLayerStyleSerializer::saveToFile(const QString& filename)
797{
798 QFile file(filename);
799
800 if (!file.open(QIODevice::WriteOnly)) {
801 dbgKrita << "Can't open file " << filename;
802 return false;
803 }
804 saveToDevice(file);
805 file.close();
806
807 return true;
808}
809
810void convertAndSetBlendMode(const QString &mode, std::function<void(const QString &)> setBlendMode)
811{
812 QString compositeOp = COMPOSITE_OVER;
813
814 if (mode == "Nrml") {
815 compositeOp = COMPOSITE_OVER;
816 } else if (mode == "Dslv") {
817 compositeOp = COMPOSITE_DISSOLVE;
818 } else if (mode == "Drkn") {
819 compositeOp = COMPOSITE_DARKEN;
820 } else if (mode == "Mltp") {
821 compositeOp = COMPOSITE_MULT;
822 } else if (mode == "CBrn") {
823 compositeOp = COMPOSITE_BURN;
824 } else if (mode == "linearBurn") {
825 compositeOp = COMPOSITE_LINEAR_BURN;
826 } else if (mode == "darkerColor") {
827 compositeOp = COMPOSITE_DARKER_COLOR;
828 } else if (mode == "Lghn") {
829 compositeOp = COMPOSITE_LIGHTEN;
830 } else if (mode == "Scrn") {
831 compositeOp = COMPOSITE_SCREEN;
832 } else if (mode == "CDdg") {
833 compositeOp = COMPOSITE_DODGE;
834 } else if (mode == "linearDodge") {
835 compositeOp = COMPOSITE_LINEAR_DODGE;
836 } else if (mode == "lighterColor") {
837 compositeOp = COMPOSITE_LIGHTER_COLOR;
838 } else if (mode == "Ovrl") {
839 compositeOp = COMPOSITE_OVERLAY;
840 } else if (mode == "SftL") {
841 compositeOp = COMPOSITE_SOFT_LIGHT_PHOTOSHOP;
842 } else if (mode == "HrdL") {
843 compositeOp = COMPOSITE_HARD_LIGHT;
844 } else if (mode == "vividLight") {
845 compositeOp = COMPOSITE_VIVID_LIGHT;
846 } else if (mode == "linearLight") {
847 compositeOp = COMPOSITE_LINEAR_LIGHT;
848 } else if (mode == "pinLight") {
849 compositeOp = COMPOSITE_PIN_LIGHT;
850 } else if (mode == "hardMix") {
851 compositeOp = COMPOSITE_HARD_MIX_PHOTOSHOP;
852 } else if (mode == "Dfrn") {
853 compositeOp = COMPOSITE_DIFF;
854 } else if (mode == "Xclu") {
855 compositeOp = COMPOSITE_EXCLUSION;
856 } else if (mode == "Sbtr") {
857 compositeOp = COMPOSITE_SUBTRACT;
858 } else if (mode == "divide") {
859 compositeOp = COMPOSITE_DIVIDE;
860 } else if (mode == "H ") {
861 compositeOp = COMPOSITE_HUE;
862 } else if (mode == "Strt") {
863 compositeOp = COMPOSITE_SATURATION;
864 } else if (mode == "Clr ") {
865 compositeOp = COMPOSITE_COLOR;
866 } else if (mode == "Lmns") {
867 compositeOp = COMPOSITE_LUMINIZE;
868 } else {
869 dbgKrita << "Unknown blending mode:" << mode << "Returning COMPOSITE_OVER!";
870 }
871
872 setBlendMode(compositeOp);
873}
874
875void convertAndSetCurve(const QString &name, const QVector<QPointF> &points, std::function<void(const quint8 *)> setCurveLookupTable)
876{
877 Q_UNUSED(name);
878 Q_UNUSED(points);
879 Q_UNUSED(setCurveLookupTable);
880
881 warnKrita << "convertAndSetBlendMode:" << "Curve conversion is not implemented yet";
882}
883
884template<typename T>
885void convertAndSetEnum(const QString &value, const QMap<QString, T> map, std::function<void(T)> setMappedValue)
886{
887 setMappedValue(map[value]);
888}
889
890inline QString _prepaddr(const QString &pref, const QString &addr) {
891 return pref + addr;
892}
893
894#define CONN_TEXT_RADDR(addr, method, object, type) m_catcher.subscribeText(addr, std::bind(&type::method, object, _1))
895#define CONN_COLOR(addr, method, object, type, prefix) m_catcher.subscribeColor(_prepaddr(prefix, addr), std::bind(&type::method, object, _1))
896#define CONN_UNITF(addr, unit, method, object, type, prefix) m_catcher.subscribeUnitFloat(_prepaddr(prefix, addr), unit, std::bind(&type::method, object, _1))
897#define CONN_BOOL(addr, method, object, type, prefix) m_catcher.subscribeBoolean(_prepaddr(prefix, addr), std::bind(&type::method, object, _1))
898
899#define CONN_POINT(addr, method, object, type, prefix) m_catcher.subscribePoint(_prepaddr(prefix, addr), std::bind(&type::method, object, _1))
900
901#define CONN_COMPOSITE_OP(addr, method, object, type, prefix) \
902 { \
903 std::function<void(const QString &)> setter = std::bind(&type::method, object, _1); \
904 m_catcher.subscribeEnum(_prepaddr(prefix, addr), "BlnM", std::bind(convertAndSetBlendMode, _1, setter)); \
905 }
906
907#define CONN_CURVE(addr, method, object, type, prefix) \
908 { \
909 std::function<void(const quint8 *)> setter = std::bind(&type::method, object, _1); \
910 m_catcher.subscribeCurve(_prepaddr(prefix, addr), std::bind(convertAndSetCurve, _1, _2, setter)); \
911 }
912
913#define CONN_ENUM(addr, tag, method, map, mapped_type, object, type, prefix) \
914 { \
915 std::function<void(mapped_type)> setter = std::bind(&type::method, object, _1); \
916 m_catcher.subscribeEnum(_prepaddr(prefix, addr), tag, std::bind(convertAndSetEnum<mapped_type>, _1, map, setter)); \
917 }
918
919#define CONN_GRADIENT(addr, method, object, type, prefix) \
920 { \
921 std::function<void(KoAbstractGradientSP)> setter = std::bind(&type::method, object, _1); \
922 m_catcher.subscribeGradient(_prepaddr(prefix, addr), std::bind(&KisAslLayerStyleSerializer::assignGradientObject, this, _1, setter)); \
923 }
924
925#define CONN_PATTERN(addr, method, object, type, prefix) \
926 { \
927 std::function<void(KoPatternSP)> setter = std::bind(&type::method, object, _1); \
928 m_catcher.subscribePatternRef(_prepaddr(prefix, addr), std::bind(&KisAslLayerStyleSerializer::assignPatternObject, this, _1, _2, setter)); \
929 }
930
931void KisAslLayerStyleSerializer::registerPatternObject(const KoPatternSP pattern, const QString& patternUuid) {
932
933 if (!pattern) {
934 warnKrita << "WARNING: got an empty pattern:" << patternUuid;
935 return;
936 }
937
938 if (m_patternsStore.contains(patternUuid)) {
939 warnKrita << "WARNING: ASL style contains a duplicated pattern!" << ppVar(pattern->name()) << ppVar(m_patternsStore[patternUuid]->name());
940 } else {
941 pattern->setFilename(patternUuid + QString(".pat"));
942 m_patternsStore.insert(patternUuid, pattern);
943 m_localResourcesInterface->addResource(pattern);
944 }
945}
946
947void KisAslLayerStyleSerializer::assignPatternObject(const QString &patternUuid, const QString &patternName, std::function<void(KoPatternSP)> setPattern)
948{
949 Q_UNUSED(patternName);
950
951 KoPatternSP pattern;
952
953 if (!m_patternsStore.contains(patternUuid)) {
954 warnKrita << "WARNING: ASL style contains non-existent pattern reference! Searching for uuid: "
955 << patternUuid << " (name: " << patternName << ")";
956
957 QImage dumbImage(32, 32, QImage::Format_ARGB32);
958 dumbImage.fill(Qt::red);
959 KoPatternSP dumbPattern(new KoPattern(dumbImage, "invalid", ""));
960 registerPatternObject(dumbPattern, patternUuid + QString("_invalid"));
961 pattern = dumbPattern;
962 } else {
963 pattern = m_patternsStore[patternUuid];
964 }
965
966 setPattern(pattern);
967}
968
970{
971 m_gradientsStore.append(gradient);
972 m_localResourcesInterface->addResource(gradient);
973 setGradient(gradient);
974}
975
977public:
978
979 static void correct(KisPSDLayerStyle *style) {
982 correctWithPattern(style->stroke(), style->resourcesInterface());
983 }
984
985private:
986
987 template <class T>
988 static void correctWithPattern(T *config, KisResourcesInterfaceSP resourcesInterface) {
989 if (config->pattern(resourcesInterface)) {
990 config->setFillType(psd_fill_pattern);
991 } else if (config->gradient(resourcesInterface)) {
992 config->setFillType(psd_fill_gradient);
993 } else {
994 config->setFillType(psd_fill_solid_color);
995 }
996 }
997
998 template <class T>
999 static void correctWithoutPattern(T *config, KisResourcesInterfaceSP resourcesInterface) {
1000 if (config->gradient(resourcesInterface)) {
1001 config->setFillType(psd_fill_gradient);
1002 } else {
1003 config->setFillType(psd_fill_solid_color);
1004 }
1005 }
1006};
1007
1009{
1010 CONN_TEXT_RADDR("/null/Nm ", setName, style, KisPSDLayerStyle);
1011 CONN_TEXT_RADDR("/null/Idnt", setPsdUuid, style, KisPSDLayerStyle);
1012
1013 CONN_BOOL("/masterFXSwitch", setEnabled, style, KisPSDLayerStyle, prefix);
1014
1015 psd_layer_effects_drop_shadow *dropShadow = style->dropShadow();
1016
1017 CONN_COMPOSITE_OP("/DrSh/Md ", setBlendMode, dropShadow, psd_layer_effects_drop_shadow, prefix);
1018 CONN_COLOR("/DrSh/Clr ", setColor, dropShadow, psd_layer_effects_drop_shadow, prefix);
1019 CONN_UNITF("/DrSh/Opct", "#Prc", setOpacity, dropShadow, psd_layer_effects_drop_shadow, prefix);
1020 CONN_UNITF("/DrSh/lagl", "#Ang", setAngle, dropShadow, psd_layer_effects_drop_shadow, prefix);
1021 CONN_UNITF("/DrSh/Dstn", "#Pxl", setDistance, dropShadow, psd_layer_effects_drop_shadow, prefix);
1022 CONN_UNITF("/DrSh/Ckmt", "#Pxl", setSpread, dropShadow, psd_layer_effects_drop_shadow, prefix);
1023 CONN_UNITF("/DrSh/blur", "#Pxl", setSize, dropShadow, psd_layer_effects_drop_shadow, prefix);
1024 CONN_UNITF("/DrSh/Nose", "#Prc", setNoise, dropShadow, psd_layer_effects_drop_shadow, prefix);
1025 CONN_BOOL("/DrSh/enab", setEffectEnabled, dropShadow, psd_layer_effects_drop_shadow, prefix);
1026 CONN_BOOL("/DrSh/uglg", setUseGlobalLight, dropShadow, psd_layer_effects_drop_shadow, prefix);
1027 CONN_BOOL("/DrSh/AntA", setAntiAliased, dropShadow, psd_layer_effects_drop_shadow, prefix);
1028 CONN_BOOL("/DrSh/layerConceals", setKnocksOut, dropShadow, psd_layer_effects_drop_shadow, prefix);
1029 CONN_CURVE("/DrSh/TrnS", setContourLookupTable, dropShadow, psd_layer_effects_drop_shadow, prefix);
1030
1031 psd_layer_effects_inner_shadow *innerShadow = style->innerShadow();
1032
1033 CONN_COMPOSITE_OP("/IrSh/Md ", setBlendMode, innerShadow, psd_layer_effects_inner_shadow, prefix);
1034 CONN_COLOR("/IrSh/Clr ", setColor, innerShadow, psd_layer_effects_inner_shadow, prefix);
1035 CONN_UNITF("/IrSh/Opct", "#Prc", setOpacity, innerShadow, psd_layer_effects_inner_shadow, prefix);
1036 CONN_UNITF("/IrSh/lagl", "#Ang", setAngle, innerShadow, psd_layer_effects_inner_shadow, prefix);
1037 CONN_UNITF("/IrSh/Dstn", "#Pxl", setDistance, innerShadow, psd_layer_effects_inner_shadow, prefix);
1038 CONN_UNITF("/IrSh/Ckmt", "#Pxl", setSpread, innerShadow, psd_layer_effects_inner_shadow, prefix);
1039 CONN_UNITF("/IrSh/blur", "#Pxl", setSize, innerShadow, psd_layer_effects_inner_shadow, prefix);
1040 CONN_UNITF("/IrSh/Nose", "#Prc", setNoise, innerShadow, psd_layer_effects_inner_shadow, prefix);
1041 CONN_BOOL("/IrSh/enab", setEffectEnabled, innerShadow, psd_layer_effects_inner_shadow, prefix);
1042 CONN_BOOL("/IrSh/uglg", setUseGlobalLight, innerShadow, psd_layer_effects_inner_shadow, prefix);
1043 CONN_BOOL("/IrSh/AntA", setAntiAliased, innerShadow, psd_layer_effects_inner_shadow, prefix);
1044 CONN_CURVE("/IrSh/TrnS", setContourLookupTable, innerShadow, psd_layer_effects_inner_shadow, prefix);
1045
1046 psd_layer_effects_outer_glow *outerGlow = style->outerGlow();
1047
1048 CONN_COMPOSITE_OP("/OrGl/Md ", setBlendMode, outerGlow, psd_layer_effects_outer_glow, prefix);
1049 CONN_COLOR("/OrGl/Clr ", setColor, outerGlow, psd_layer_effects_outer_glow, prefix);
1050 CONN_UNITF("/OrGl/Opct", "#Prc", setOpacity, outerGlow, psd_layer_effects_outer_glow, prefix);
1051 CONN_UNITF("/OrGl/Ckmt", "#Pxl", setSpread, outerGlow, psd_layer_effects_outer_glow, prefix);
1052 CONN_UNITF("/OrGl/blur", "#Pxl", setSize, outerGlow, psd_layer_effects_outer_glow, prefix);
1053 CONN_UNITF("/OrGl/Nose", "#Prc", setNoise, outerGlow, psd_layer_effects_outer_glow, prefix);
1054 CONN_BOOL("/OrGl/enab", setEffectEnabled, outerGlow, psd_layer_effects_outer_glow, prefix);
1055 CONN_BOOL("/OrGl/AntA", setAntiAliased, outerGlow, psd_layer_effects_outer_glow, prefix);
1056 CONN_CURVE("/OrGl/TrnS", setContourLookupTable, outerGlow, psd_layer_effects_outer_glow, prefix);
1057
1058 QMap<QString, psd_technique_type> fillTechniqueMap;
1059 fillTechniqueMap.insert("PrBL", psd_technique_precise);
1060 fillTechniqueMap.insert("SfBL", psd_technique_softer);
1061 CONN_ENUM("/OrGl/GlwT", "BETE", setTechnique, fillTechniqueMap, psd_technique_type, outerGlow, psd_layer_effects_outer_glow, prefix);
1062
1063 CONN_GRADIENT("/OrGl/Grad", setGradient, outerGlow, psd_layer_effects_outer_glow, prefix);
1064
1065 CONN_UNITF("/OrGl/Inpr", "#Prc", setRange, outerGlow, psd_layer_effects_outer_glow, prefix);
1066 CONN_UNITF("/OrGl/ShdN", "#Prc", setJitter, outerGlow, psd_layer_effects_outer_glow, prefix);
1067
1068
1069 psd_layer_effects_inner_glow *innerGlow = style->innerGlow();
1070
1071 CONN_COMPOSITE_OP("/IrGl/Md ", setBlendMode, innerGlow, psd_layer_effects_inner_glow, prefix);
1072 CONN_COLOR("/IrGl/Clr ", setColor, innerGlow, psd_layer_effects_inner_glow, prefix);
1073 CONN_UNITF("/IrGl/Opct", "#Prc", setOpacity, innerGlow, psd_layer_effects_inner_glow, prefix);
1074 CONN_UNITF("/IrGl/Ckmt", "#Pxl", setSpread, innerGlow, psd_layer_effects_inner_glow, prefix);
1075 CONN_UNITF("/IrGl/blur", "#Pxl", setSize, innerGlow, psd_layer_effects_inner_glow, prefix);
1076 CONN_UNITF("/IrGl/Nose", "#Prc", setNoise, innerGlow, psd_layer_effects_inner_glow, prefix);
1077 CONN_BOOL("/IrGl/enab", setEffectEnabled, innerGlow, psd_layer_effects_inner_glow, prefix);
1078 CONN_BOOL("/IrGl/AntA", setAntiAliased, innerGlow, psd_layer_effects_inner_glow, prefix);
1079 CONN_CURVE("/IrGl/TrnS", setContourLookupTable, innerGlow, psd_layer_effects_inner_glow, prefix);
1080
1081 CONN_ENUM("/IrGl/GlwT", "BETE", setTechnique, fillTechniqueMap, psd_technique_type, innerGlow, psd_layer_effects_inner_glow, prefix);
1082
1083 CONN_GRADIENT("/IrGl/Grad", setGradient, innerGlow, psd_layer_effects_inner_glow, prefix);
1084
1085 CONN_UNITF("/IrGl/Inpr", "#Prc", setRange, innerGlow, psd_layer_effects_inner_glow, prefix);
1086 CONN_UNITF("/IrGl/ShdN", "#Prc", setJitter, innerGlow, psd_layer_effects_inner_glow, prefix);
1087
1088 QMap<QString, psd_glow_source> glowSourceMap;
1089 glowSourceMap.insert("SrcC", psd_glow_center);
1090 glowSourceMap.insert("SrcE", psd_glow_edge);
1091 CONN_ENUM("/IrGl/glwS", "IGSr", setSource, glowSourceMap, psd_glow_source, innerGlow, psd_layer_effects_inner_glow, prefix);
1092
1093
1094 psd_layer_effects_satin *satin = style->satin();
1095
1096 CONN_COMPOSITE_OP("/ChFX/Md ", setBlendMode, satin, psd_layer_effects_satin, prefix);
1097 CONN_COLOR("/ChFX/Clr ", setColor, satin, psd_layer_effects_satin, prefix);
1098
1099 CONN_UNITF("/ChFX/Opct", "#Prc", setOpacity, satin, psd_layer_effects_satin, prefix);
1100 CONN_UNITF("/ChFX/lagl", "#Ang", setAngle, satin, psd_layer_effects_satin, prefix);
1101 CONN_UNITF("/ChFX/Dstn", "#Pxl", setDistance, satin, psd_layer_effects_satin, prefix);
1102 CONN_UNITF("/ChFX/blur", "#Pxl", setSize, satin, psd_layer_effects_satin, prefix);
1103
1104 CONN_BOOL("/ChFX/enab", setEffectEnabled, satin, psd_layer_effects_satin, prefix);
1105 CONN_BOOL("/ChFX/AntA", setAntiAliased, satin, psd_layer_effects_satin, prefix);
1106 CONN_BOOL("/ChFX/Invr", setInvert, satin, psd_layer_effects_satin, prefix);
1107 CONN_CURVE("/ChFX/MpgS", setContourLookupTable, satin, psd_layer_effects_satin, prefix);
1108
1109 psd_layer_effects_color_overlay *colorOverlay = style->colorOverlay();
1110
1111 CONN_COMPOSITE_OP("/SoFi/Md ", setBlendMode, colorOverlay, psd_layer_effects_color_overlay, prefix);
1112 CONN_COLOR("/SoFi/Clr ", setColor, colorOverlay, psd_layer_effects_color_overlay, prefix);
1113 CONN_UNITF("/SoFi/Opct", "#Prc", setOpacity, colorOverlay, psd_layer_effects_color_overlay, prefix);
1114 CONN_BOOL("/SoFi/enab", setEffectEnabled, colorOverlay, psd_layer_effects_color_overlay, prefix);
1115
1116 psd_layer_effects_gradient_overlay *gradientOverlay = style->gradientOverlay();
1117
1118 CONN_COMPOSITE_OP("/GrFl/Md ", setBlendMode, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1119 CONN_UNITF("/GrFl/Opct", "#Prc", setOpacity, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1120 CONN_UNITF("/GrFl/Scl ", "#Prc", setScale, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1121 CONN_UNITF("/GrFl/Angl", "#Ang", setAngle, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1122 CONN_BOOL("/GrFl/enab", setEffectEnabled, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1123 CONN_BOOL("/GrFl/Dthr", setDither, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1124 CONN_BOOL("/GrFl/Rvrs", setReverse, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1125 CONN_BOOL("/GrFl/Algn", setAlignWithLayer, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1126 CONN_POINT("/GrFl/Ofst", setGradientOffset, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1127 CONN_GRADIENT("/GrFl/Grad", setGradient, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1128
1129
1130 QMap<QString, psd_gradient_style> gradientStyleMap;
1131 gradientStyleMap.insert("Lnr ", psd_gradient_style_linear);
1132 gradientStyleMap.insert("Rdl ", psd_gradient_style_radial);
1133 gradientStyleMap.insert("Angl", psd_gradient_style_angle);
1134 gradientStyleMap.insert("Rflc", psd_gradient_style_reflected);
1135 gradientStyleMap.insert("Dmnd", psd_gradient_style_diamond);
1136 CONN_ENUM("/GrFl/Type", "GrdT", setStyle, gradientStyleMap, psd_gradient_style, gradientOverlay, psd_layer_effects_gradient_overlay, prefix);
1137
1138 psd_layer_effects_pattern_overlay *patternOverlay = style->patternOverlay();
1139
1140 CONN_BOOL("/patternFill/enab", setEffectEnabled, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1141 CONN_COMPOSITE_OP("/patternFill/Md ", setBlendMode, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1142 CONN_UNITF("/patternFill/Opct", "#Prc", setOpacity, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1143 CONN_PATTERN("/patternFill/Ptrn", setPattern, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1144 CONN_UNITF("/patternFill/Scl ", "#Prc", setScale, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1145 CONN_BOOL("/patternFill/Algn", setAlignWithLayer, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1146 CONN_POINT("/patternFill/phase", setPatternPhase, patternOverlay, psd_layer_effects_pattern_overlay, prefix);
1147
1148 psd_layer_effects_stroke *stroke = style->stroke();
1149
1150 CONN_COMPOSITE_OP("/FrFX/Md ", setBlendMode, stroke, psd_layer_effects_stroke, prefix);
1151 CONN_BOOL("/FrFX/enab", setEffectEnabled, stroke, psd_layer_effects_stroke, prefix);
1152 CONN_UNITF("/FrFX/Opct", "#Prc", setOpacity, stroke, psd_layer_effects_stroke, prefix);
1153 CONN_UNITF("/FrFX/Sz ", "#Pxl", setSize, stroke, psd_layer_effects_stroke, prefix);
1154
1155 QMap<QString, psd_stroke_position> strokeStyleMap;
1156 strokeStyleMap.insert("OutF", psd_stroke_outside);
1157 strokeStyleMap.insert("InsF", psd_stroke_inside);
1158 strokeStyleMap.insert("CtrF", psd_stroke_center);
1159 CONN_ENUM("/FrFX/Styl", "FStl", setPosition, strokeStyleMap, psd_stroke_position, stroke, psd_layer_effects_stroke, prefix);
1160
1161 QMap<QString, psd_fill_type> strokeFillType;
1162 strokeFillType.insert("SClr", psd_fill_solid_color);
1163 strokeFillType.insert("GrFl", psd_fill_gradient);
1164 strokeFillType.insert("Ptrn", psd_fill_pattern);
1165 CONN_ENUM("/FrFX/PntT", "FrFl", setFillType, strokeFillType, psd_fill_type, stroke, psd_layer_effects_stroke, prefix);
1166
1167 // Color type
1168 CONN_COLOR("/FrFX/Clr ", setColor, stroke, psd_layer_effects_stroke, prefix);
1169
1170 // Gradient Type
1171 CONN_GRADIENT("/FrFX/Grad", setGradient, stroke, psd_layer_effects_stroke, prefix);
1172 CONN_UNITF("/FrFX/Angl", "#Ang", setAngle, stroke, psd_layer_effects_stroke, prefix);
1173 CONN_UNITF("/FrFX/Scl ", "#Prc", setScale, stroke, psd_layer_effects_stroke, prefix);
1174 CONN_ENUM("/FrFX/Type", "GrdT", setStyle, gradientStyleMap, psd_gradient_style, stroke, psd_layer_effects_stroke, prefix);
1175 CONN_BOOL("/FrFX/Rvrs", setReverse, stroke, psd_layer_effects_stroke, prefix);
1176 CONN_BOOL("/FrFX/Algn", setAlignWithLayer, stroke, psd_layer_effects_stroke, prefix);
1177 CONN_POINT("/FrFX/Ofst", setGradientOffset, stroke, psd_layer_effects_stroke, prefix);
1178 CONN_BOOL("/FrFX/Dthr", setDither, stroke, psd_layer_effects_stroke, prefix);
1179
1180 // Pattern type
1181
1182 CONN_PATTERN("/FrFX/Ptrn", setPattern, stroke, psd_layer_effects_stroke, prefix);
1183 CONN_BOOL("/FrFX/Lnkd", setAlignWithLayer, stroke, psd_layer_effects_stroke, prefix); // yes, we share the params...
1184 CONN_POINT("/FrFX/phase", setPatternPhase, stroke, psd_layer_effects_stroke, prefix);
1185
1186
1187 psd_layer_effects_bevel_emboss *bevelAndEmboss = style->bevelAndEmboss();
1188
1189 CONN_BOOL("/ebbl/enab", setEffectEnabled, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1190
1191 CONN_COMPOSITE_OP("/ebbl/hglM", setHighlightBlendMode, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1192 CONN_COLOR("/ebbl/hglC", setHighlightColor, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1193 CONN_UNITF("/ebbl/hglO", "#Prc", setHighlightOpacity, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1194
1195 CONN_COMPOSITE_OP("/ebbl/sdwM", setShadowBlendMode, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1196 CONN_COLOR("/ebbl/sdwC", setShadowColor, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1197 CONN_UNITF("/ebbl/sdwO", "#Prc", setShadowOpacity, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1198
1199 QMap<QString, psd_technique_type> bevelTechniqueMap;
1200 bevelTechniqueMap.insert("PrBL", psd_technique_precise);
1201 bevelTechniqueMap.insert("SfBL", psd_technique_softer);
1202 bevelTechniqueMap.insert("Slmt", psd_technique_slope_limit);
1203 CONN_ENUM("/ebbl/bvlT", "bvlT", setTechnique, bevelTechniqueMap, psd_technique_type, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1204
1205 QMap<QString, psd_bevel_style> bevelStyleMap;
1206 bevelStyleMap.insert("OtrB", psd_bevel_outer_bevel);
1207 bevelStyleMap.insert("InrB", psd_bevel_inner_bevel);
1208 bevelStyleMap.insert("Embs", psd_bevel_emboss);
1209 bevelStyleMap.insert("PlEb", psd_bevel_pillow_emboss);
1210 bevelStyleMap.insert("strokeEmboss", psd_bevel_stroke_emboss);
1211 CONN_ENUM("/ebbl/bvlS", "BESl", setStyle, bevelStyleMap, psd_bevel_style, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1212
1213 CONN_BOOL("/ebbl/uglg", setUseGlobalLight, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1214
1215 CONN_UNITF("/ebbl/lagl", "#Ang", setAngle, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1216 CONN_UNITF("/ebbl/Lald", "#Ang", setAltitude, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1217
1218 CONN_UNITF("/ebbl/srgR", "#Prc", setDepth, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1219
1220 CONN_UNITF("/ebbl/blur", "#Pxl", setSize, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1221
1222
1223 QMap<QString, psd_direction> bevelDirectionMap;
1224 bevelDirectionMap.insert("In ", psd_direction_up);
1225 bevelDirectionMap.insert("Out ", psd_direction_down);
1226 CONN_ENUM("/ebbl/bvlD", "BESs", setDirection, bevelDirectionMap, psd_direction, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1227
1228 CONN_CURVE("/ebbl/TrnS", setContourLookupTable, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1229
1230 CONN_BOOL("/ebbl/antialiasGloss", setGlossAntiAliased, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1231
1232 CONN_UNITF("/ebbl/Sftn", "#Pxl", setSoften, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1233
1234 // Use shape mode
1235
1236 CONN_BOOL("/ebbl/useShape", setContourEnabled, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1237 CONN_CURVE("/ebbl/MpgS", setGlossContourLookupTable, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1238 CONN_BOOL("/ebbl/AntA", setAntiAliased, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1239 CONN_UNITF("/ebbl/Inpr", "#Prc", setContourRange, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1240
1241 // Use texture mode
1242
1243 CONN_BOOL("/ebbl/useTexture", setTextureEnabled, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1244 CONN_BOOL("/ebbl/InvT", setTextureInvert, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1245 CONN_BOOL("/ebbl/Algn", setTextureAlignWithLayer, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1246 CONN_UNITF("/ebbl/Scl ", "#Prc", setTextureScale, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1247 CONN_UNITF("/ebbl/textureDepth ", "#Prc", setTextureDepth, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1248 CONN_PATTERN("/ebbl/Ptrn", setTexturePattern, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1249 CONN_POINT("/ebbl/phase", setTexturePhase, bevelAndEmboss, psd_layer_effects_bevel_emboss, prefix);
1250}
1251
1253{
1255 KisPSDLayerStyleSP currentStyleSP = m_stylesVector.last();
1256 KisPSDLayerStyle *currentStyle = currentStyleSP.data();
1257
1258 psd_layer_effects_context *context = currentStyleSP->context();
1259 context->keep_original = 0;
1260
1261 QString prefix = isPsdStructure ? "/null" : "/Styl/Lefx";
1262 connectCatcherToStyle(currentStyle, prefix);
1263}
1264
1265bool KisAslLayerStyleSerializer::readFromFile(const QString& filename)
1266{
1267 QFile file(filename);
1268 if (file.size() == 0) return false;
1269
1270 if (!file.open(QIODevice::ReadOnly)) {
1271 dbgKrita << "Can't open file " << filename;
1272 return false;
1273 }
1274
1275 readFromDevice(file);
1276 file.close();
1277
1278 return m_initialized;
1279}
1280
1282{
1283 KisLayer* layer = qobject_cast<KisLayer*>(root.data());
1284 QVector<KisPSDLayerStyleSP> layerStyles;
1285
1286 if (layer && layer->layerStyle()) {
1287 KisPSDLayerStyleSP clone = layer->layerStyle()->clone().dynamicCast<KisPSDLayerStyle>();
1288 clone->setName(i18nc("Auto-generated layer style name for embedded styles (style itself)", "<%1> (embedded)", layer->name()));
1289 layerStyles << clone;
1290 }
1291
1292 KisNodeSP child = root->firstChild();
1293 while (child) {
1294 layerStyles += collectAllLayerStyles(child);
1295 child = child->nextSibling();
1296 }
1297
1298 return layerStyles;
1299}
1300
1302 KisResourcesInterfaceSP resourcesInterface)
1303{
1304 const QList<KoResourceLoadResult> linkedResources = style->linkedResources(resourcesInterface);
1305 QList<KoEmbeddedResource> sideLoadedResourcesStorage;
1306 Q_FOREACH (const KoResourceLoadResult &res, linkedResources) {
1308 qWarning() << "WARNING: failed to load layer style's embedded resource into the database"
1309 << res.signature();
1310 continue;
1311 }
1312
1313 QBuffer buffer;
1314 buffer.open(QIODevice::WriteOnly);
1315 bool result = res.resource()->saveToDevice(&buffer);
1316 buffer.close();
1317 KIS_SAFE_ASSERT_RECOVER(result) { continue; }
1318 KIS_SAFE_ASSERT_RECOVER(res.resource()->md5Sum() == KoMD5Generator::generateHash(buffer.data())) { continue; }
1319
1320 sideLoadedResourcesStorage.append(KoEmbeddedResource(res.signature(), buffer.data()));
1321 }
1322 style->setSideLoadedResources(sideLoadedResourcesStorage);
1323}
1324
1326{
1327 if (!storageLocation.isEmpty()) {
1329 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
1330 KisPSDLayerStyleSP newStyle = style->clone().dynamicCast<KisPSDLayerStyle>();
1332 style->setResourcesInterface(KisGlobalResourcesInterface::instance());
1333
1334 stylesModel.addResourceDeduplicateFileName(newStyle, storageLocation);
1335 }
1336 }
1337
1338 // we iterate over non-uploaded styles which store all the dependent resources
1339 // internally
1341 KisLayer* layer = qobject_cast<KisLayer*>(node.data());
1342
1343 if (layer && layer->layerStyle()) {
1344 QUuid uuid = layer->layerStyle()->uuid();
1345
1346 bool found = false;
1347
1348 Q_FOREACH (KisPSDLayerStyleSP style, styles) {
1349 if (style->uuid() == uuid) {
1350 layer->setLayerStyle(style->cloneWithResourcesSnapshot(style->resourcesInterface(), 0));
1351 found = true;
1352 break;
1353 }
1354 }
1355
1356 if (!found) {
1357 warnKrita << "WARNING: loading layer style for" << layer->name() << "failed! It requests inexistent style:" << uuid;
1358 }
1359 }
1360 });
1361}
1362
1364{
1365 m_catcher.subscribePattern("/patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1366 m_catcher.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1368
1369 KisAslReader reader;
1370 const QDomDocument doc = reader.readFile(device);
1371
1372 if (doc.isNull()) {
1373 m_initialized = false;
1374 return;
1375 }
1376
1377 //dbgKrita << ppVar(doc.toString());
1378
1379 //KisAslObjectCatcher c2;
1380 KisAslXmlParser parser;
1381 parser.parseXML(doc, m_catcher);
1382
1383 QMultiHash<QString, KisPSDLayerStyleSP> allStyles;
1384 QHash<QString, KisPSDLayerStyleSP> cleanedStyles;
1385
1386 for(const auto &style : m_stylesVector)
1387 allStyles.insert(style->psdUuid(), style);
1388
1389 // correct all the layer styles
1390 for (const auto &style : allStyles) {
1391 FillStylesCorrector::correct(style.data());
1392
1393 if (allStyles.count(style->psdUuid()) > 1) {
1394 const auto &existingStyle = cleanedStyles.find(style->psdUuid());
1395
1396 if (existingStyle != cleanedStyles.end()) {
1397 if (existingStyle.value()->name() != style->name()) {
1398 qWarning() << "Duplicated UUID" << style->psdUuid() << "for styles" << style->name() << "and"
1399 << existingStyle.value()->name();
1400 style->setMD5Sum("");
1401 style->setUuid(QUuid::createUuid());
1402 } else {
1403 qWarning() << "Duplicated style" << style->name();
1404 continue;
1405 }
1406 }
1407 }
1408
1409 style->setValid(!style->isEmpty());
1410
1411 style->setFilename(style->uuid().toString());
1412
1413 cleanedStyles.insert(style->psdUuid(), style);
1414 }
1415
1416 m_stylesVector = cleanedStyles.values().toVector();
1417
1418 m_initialized = true;
1419}
1420
1422{
1424 catcher.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1425 catcher.subscribePattern("/patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1, _2));
1426
1427 //KisAslObjectCatcher c2;
1428 KisAslXmlParser parser;
1429 parser.parseXML(doc, catcher);
1430}
1431
1433{
1434 // The caller prepares the document using the following code
1435 //
1436 // KisAslReader reader;
1437 // QDomDocument doc = reader.readLfx2PsdSection(device);
1438
1439 m_stylesVector.clear();
1440
1441 //m_catcher.subscribePattern("/Patterns/KisPattern", std::bind(&KisAslLayerStyleSerializer::registerPatternObject, this, _1));
1443
1444 //KisAslObjectCatcher c2;
1445 KisAslXmlParser parser;
1446 parser.parseXML(doc, m_catcher);
1447
1448 // correct all the layer styles
1449 Q_FOREACH (KisPSDLayerStyleSP style, m_stylesVector) {
1450 FillStylesCorrector::correct(style.data());
1451 }
1452}
float value(const T *src, size_t ch)
const QString COMPOSITE_OVER
const QString COMPOSITE_DARKEN
const QString COMPOSITE_OVERLAY
const QString COMPOSITE_DIVIDE
const QString COMPOSITE_DODGE
const QString COMPOSITE_LIGHTEN
const QString COMPOSITE_LINEAR_BURN
const QString COMPOSITE_SOFT_LIGHT_PHOTOSHOP
const QString COMPOSITE_LIGHTER_COLOR
const QString COMPOSITE_MULT
const QString COMPOSITE_SATURATION
const QString COMPOSITE_LINEAR_LIGHT
const QString COMPOSITE_HARD_LIGHT
const QString COMPOSITE_SCREEN
const QString COMPOSITE_PIN_LIGHT
const QString COMPOSITE_DIFF
const QString COMPOSITE_HUE
const QString COMPOSITE_SUBTRACT
const QString COMPOSITE_DISSOLVE
const QString COMPOSITE_BURN
const QString COMPOSITE_LINEAR_DODGE
const QString COMPOSITE_COLOR
const QString COMPOSITE_EXCLUSION
const QString COMPOSITE_DARKER_COLOR
const QString COMPOSITE_VIVID_LIGHT
const QString COMPOSITE_LUMINIZE
const QString COMPOSITE_HARD_MIX_PHOTOSHOP
static void correctWithoutPattern(T *config, KisResourcesInterfaceSP resourcesInterface)
static void correct(KisPSDLayerStyle *style)
static void correctWithPattern(T *config, KisResourcesInterfaceSP resourcesInterface)
void subscribeNewStyleStarted(ASLCallbackNewStyle callback)
void subscribePattern(const QString &path, ASLCallbackPattern callback)
QHash< QString, KisPSDLayerStyleSP > m_stylesHash
void registerPatternObject(const KoPatternSP pattern, const QString &patternUuid)
QHash< QString, KoPatternSP > m_patternsStore
void assignGradientObject(KoAbstractGradientSP gradient, std::function< void(KoAbstractGradientSP)> setGradient)
QVector< KoAbstractGradientSP > gradients() const
QSharedPointer< KisLocalStrokeResources > m_localResourcesInterface
QVector< KisPSDLayerStyleSP > styles() const
KisAslCallbackObjectCatcher m_catcher
void readFromPSDXML(const QDomDocument &doc)
static QVector< KoResourceSignature > fetchLinkedResourceSignatures(const KisPSDLayerStyle *style)
static void sideLoadLinkedResources(KisPSDLayerStyle *style, KisResourcesInterfaceSP resourcesInterface)
static QVector< KisPSDLayerStyleSP > collectAllLayerStyles(KisNodeSP root)
QVector< KoAbstractGradientSP > m_gradientsStore
QHash< QString, KisPSDLayerStyleSP > stylesHash()
void registerPSDPattern(const QDomDocument &doc)
void assignAllLayerStylesToLayers(KisNodeSP root, const QString &storageLocation)
bool readFromFile(const QString &filename)
QVector< KisPSDLayerStyleSP > m_stylesVector
QHash< QString, KoPatternSP > patterns() const
void connectCatcherToStyle(KisPSDLayerStyle *style, const QString &prefix)
static QVector< KoResourceSignature > fetchAllPatternLinks(const KisPSDLayerStyle *style)
static QVector< KoPatternSP > fetchAllPatterns(const KisPSDLayerStyle *style, KisResourcesInterfaceSP resourcesInterface)
void assignPatternObject(const QString &patternUuid, const QString &patternName, std::function< void(KoPatternSP)> setPattern)
void setStyles(const QVector< KisPSDLayerStyleSP > &styles)
bool saveToFile(const QString &filename)
QDomDocument readFile(QIODevice &device)
void writeFile(QIODevice &device, const QDomDocument &doc)
void parseXML(const QDomDocument &doc, KisAslObjectCatcher &catcher)
static KisResourcesInterfaceSP instance()
a KisResourcesInterface-like resources storage for preloaded resources
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
bool addResourceDeduplicateFileName(KoResourceSP resource, const QString &storageId=QString("")) override
addResource adds the given resource to the database and storage. If the resource already exists in th...
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.
Write API docs here.
Definition KoPattern.h:21
KoResourceSP resource() const noexcept
KoResourceSignature signature() const
A simple wrapper object for the main information about the resource.
psd_glow_source source() const
Definition psd.h:606
qint32 opacity() const
Definition psd.h:281
qint32 range() const
Definition psd.h:351
qint32 distance() const
Definition psd.h:296
bool useGlobalLight() const
Definition psd.h:291
QString blendMode() const
Definition psd.h:266
bool knocksOut() const
Definition psd.h:326
bool effectEnabled() const
Definition psd.h:261
qint32 spread() const
Definition psd.h:301
psd_technique_type technique() const
Definition psd.h:346
KoColor color() const
Definition psd.h:271
qint32 jitter() const
Definition psd.h:356
qint32 noise() const
Definition psd.h:321
qint32 angle() const
Definition psd.h:286
qint32 size() const
Definition psd.h:306
KoAbstractGradientSP gradient(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:365
psd_fill_type fillType() const
Definition psd.h:341
bool antiAliased() const
Definition psd.h:316
KoResourceSignature gradientLink() const
Definition psd.h:361
#define CONN_TEXT_RADDR(addr, method, object, type)
#define CONN_ENUM(addr, tag, method, map, mapped_type, object, type, prefix)
#define CONN_CURVE(addr, method, object, type, prefix)
#define CONN_COMPOSITE_OP(addr, method, object, type, prefix)
#define CONN_BOOL(addr, method, object, type, prefix)
#define CONN_UNITF(addr, unit, method, object, type, prefix)
QString bevelStyleToString(psd_bevel_style style)
#define CONN_GRADIENT(addr, method, object, type, prefix)
QString techniqueToString(psd_technique_type technique, const QString &typeId)
void replaceAllChildren(QDomNode src, QDomNode dst)
QString strokePositionToString(psd_stroke_position position)
QString gradientTypeToString(psd_gradient_style style)
void convertAndSetEnum(const QString &value, const QMap< QString, T > map, std::function< void(T)> setMappedValue)
QString fetchPatternUuidSafe(KoPatternSP pattern, QHash< KoPatternSP, QString > patternToUuid)
void convertAndSetCurve(const QString &name, const QVector< QPointF > &points, std::function< void(const quint8 *)> setCurveLookupTable)
QString strokeFillTypeToString(psd_fill_type position)
#define CONN_PATTERN(addr, method, object, type, prefix)
QString _prepaddr(const QString &pref, const QString &addr)
QString compositeOpToBlendMode(const QString &compositeOp)
void convertAndSetBlendMode(const QString &mode, std::function< void(const QString &)> setBlendMode)
#define CONN_COLOR(addr, method, object, type, prefix)
#define CONN_POINT(addr, method, object, type, prefix)
QDomNode findNodeByClassId(const QString &classId, QDomNode parent)
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
#define dbgKrita
Definition kis_debug.h:45
#define warnKrita
Definition kis_debug.h:87
#define ppVar(var)
Definition kis_debug.h:155
QSharedPointer< T > toQShared(T *ptr)
QDomElement findElementByAttribute(QDomNode parent, const QString &tag, const QString &attribute, const QString &value)
void recursiveApplyNodes(NodePointer node, Functor func)
const QString LayerStyles
const QString Patterns
psd_glow_source
Definition psd.h:129
@ psd_glow_edge
Definition psd.h:131
@ psd_glow_center
Definition psd.h:130
psd_direction
Definition psd.h:142
@ psd_direction_up
Definition psd.h:142
@ psd_direction_down
Definition psd.h:142
psd_gradient_style
Definition psd.h:101
@ psd_gradient_style_linear
Definition psd.h:102
@ psd_gradient_style_reflected
Definition psd.h:105
@ psd_gradient_style_angle
Definition psd.h:104
@ psd_gradient_style_radial
Definition psd.h:103
@ psd_gradient_style_diamond
Definition psd.h:106
psd_fill_type
Definition psd.h:123
@ psd_fill_solid_color
Definition psd.h:124
@ psd_fill_gradient
Definition psd.h:125
@ psd_fill_pattern
Definition psd.h:126
psd_technique_type
Definition psd.h:115
@ psd_technique_softer
Definition psd.h:116
@ psd_technique_precise
Definition psd.h:117
@ psd_technique_slope_limit
Definition psd.h:118
psd_bevel_style
Definition psd.h:134
@ psd_bevel_pillow_emboss
Definition psd.h:138
@ psd_bevel_inner_bevel
Definition psd.h:136
@ psd_bevel_stroke_emboss
Definition psd.h:139
@ psd_bevel_outer_bevel
Definition psd.h:135
@ psd_bevel_emboss
Definition psd.h:137
psd_stroke_position
Definition psd.h:121
@ psd_stroke_outside
Definition psd.h:121
@ psd_stroke_inside
Definition psd.h:121
@ psd_stroke_center
Definition psd.h:121
QString name() const
KisPSDLayerStyleSP layerStyle
Definition kis_layer.cc:171
void setLayerStyle(KisPSDLayerStyleSP layerStyle)
Definition kis_layer.cc:254
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408
The KisPSDLayerStyle class implements loading, saving and applying the PSD layer effects.
KisResourcesInterfaceSP resourcesInterface
QList< KoResourceLoadResult > linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const override
const psd_layer_effects_bevel_emboss * bevelAndEmboss() const
void setSideLoadedResources(const QList< KoEmbeddedResource > &value)
const psd_layer_effects_drop_shadow * dropShadow() const
const psd_layer_effects_color_overlay * colorOverlay() const
const psd_layer_effects_gradient_overlay * gradientOverlay() const
const psd_layer_effects_inner_glow * innerGlow() const
psd_layer_effects_stroke stroke
const psd_layer_effects_pattern_overlay * patternOverlay() const
const psd_layer_effects_inner_shadow * innerShadow() const
const psd_layer_effects_outer_glow * outerGlow() const
psd_layer_effects_satin satin
QString shadowBlendMode() const
Definition psd.h:821
psd_technique_type technique() const
Definition psd.h:730
KoResourceSignature texturePatternLink() const
Definition psd.h:875
qint32 highlightOpacity() const
Definition psd.h:812
psd_bevel_style style() const
Definition psd.h:721
bool contourEnabled() const
Definition psd.h:848
psd_direction direction() const
Definition psd.h:748
bool glossAntiAliased() const
Definition psd.h:785
KoPatternSP texturePattern(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:879
bool textureInvert() const
Definition psd.h:912
qint32 shadowOpacity() const
Definition psd.h:839
bool textureEnabled() const
Definition psd.h:866
bool textureAlignWithLayer() const
Definition psd.h:921
QString highlightBlendMode() const
Definition psd.h:794
KoColor shadowColor() const
Definition psd.h:830
KoColor highlightColor() const
Definition psd.h:803
QPointF texturePhase() const
Definition psd.h:936
KoPatternSP pattern(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:1061
QPointF gradientOffset() const
Definition psd.h:1110
QPointF patternPhase() const
Definition psd.h:1129
KoResourceSignature patternLink() const
Definition psd.h:1057
bool alignWithLayer() const
Definition psd.h:1027
psd_gradient_style style() const
Definition psd.h:1042
bool invert() const
Definition psd.h:650
psd_stroke_position position() const
Definition psd.h:1280