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