Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_psd_layer_style.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <QBuffer>
9#include <QIODevice>
10#include <QUuid>
11#include <KLocalizedString>
12
13#include <kis_assert.h>
14#include <kis_global.h>
15#include <psd_utils.h>
17
19#include <KoAbstractGradient.h>
21#include <KoMD5Generator.h>
22
24
25
26struct Q_DECL_HIDDEN KisPSDLayerStyle::Private
27{
28 Private(KisResourcesInterfaceSP _resourcesInterface)
29 : version(-1)
30 , effectEnabled(true)
31 , resourcesInterface(_resourcesInterface)
32 {
33 if (!resourcesInterface) {
34 resourcesInterface.reset(new KisLocalStrokeResources());
35 }
36 }
37
38 Private(const Private &rhs)
39 : name(rhs.name),
40 uuid(rhs.uuid),
41 version(rhs.version),
42 effectEnabled(rhs.effectEnabled),
43 context(rhs.context),
44 drop_shadow(rhs.drop_shadow),
45 inner_shadow(rhs.inner_shadow),
46 outer_glow(rhs.outer_glow),
47 inner_glow(rhs.inner_glow),
48 bevel_emboss(rhs.bevel_emboss),
49 satin(rhs.satin),
50 color_overlay(rhs.color_overlay),
51 gradient_overlay(rhs.gradient_overlay),
52 pattern_overlay(rhs.pattern_overlay),
53 stroke(rhs.stroke),
54 resourcesInterface(rhs.resourcesInterface)
55 {}
56
58 {
59 if (this != &rhs) {
60 name = rhs.name;
61 uuid = rhs.uuid;
62 version = rhs.version;
63 effectEnabled = rhs.effectEnabled;
64 context = rhs.context;
65 drop_shadow = rhs.drop_shadow;
66 inner_shadow = rhs.inner_shadow;
67 outer_glow = rhs.outer_glow;
68 inner_glow = rhs.inner_glow;
69 bevel_emboss = rhs.bevel_emboss;
70 satin = rhs.satin;
71 color_overlay = rhs.color_overlay;
72 gradient_overlay = rhs.gradient_overlay;
73 pattern_overlay = rhs.pattern_overlay;
74 stroke = rhs.stroke;
75 resourcesInterface = rhs.resourcesInterface;
76 }
77
78 return *this;
79 }
80
81 QString name;
82 QUuid uuid;
83 quint16 version;
96
98};
99
100KisPSDLayerStyle::KisPSDLayerStyle(const QString &filename, KisResourcesInterfaceSP resourcesInterface)
101 : KoResource(filename)
102 , d(new Private(resourcesInterface))
103{
104 d->name = i18n("Unnamed");
105 d->version = 7;
106}
107
112
114 : KoResource(rhs)
115 , d(new Private(*rhs.d))
116{
117 setValid(valid());
118}
119
121{
122 return d->effectEnabled;
123}
124
126{
127 d->effectEnabled = value;
128}
129
131{
132 return toQShared(new KisPSDLayerStyle(*this)).dynamicCast<KoResource>();
133}
134
136{
137 return false;
138}
139
140bool KisPSDLayerStyle::loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface)
141{
142 Q_UNUSED(dev);
143 Q_UNUSED(resourcesInterface);
144 return false;
145}
146
147bool KisPSDLayerStyle::saveToDevice(QIODevice *) const
148{
149 KIS_SAFE_ASSERT_RECOVER_NOOP(false && "KisPSDLayerStyle is not meant to be serializable!");
150 return false;
151}
152
154{
155 *d = Private(d->resourcesInterface);
156}
157
159{
160 return !(d->drop_shadow.effectEnabled() ||
161 d->inner_shadow.effectEnabled() ||
162 d->outer_glow.effectEnabled() ||
163 d->inner_glow.effectEnabled() ||
164 d->bevel_emboss.effectEnabled() ||
165 d->satin.effectEnabled() ||
166 d->color_overlay.effectEnabled() ||
167 d->gradient_overlay.effectEnabled() ||
168 d->pattern_overlay.effectEnabled() ||
169 d->stroke.effectEnabled());
170}
171
172QString KisPSDLayerStyle::name() const
173{
174 return d->name;
175}
176
178{
179 d->name = value;
180 dynamic_cast<KoResource*>(this)->setName(value);
181}
182
183QUuid KisPSDLayerStyle::uuid() const
184{
185 if (d->uuid.isNull()) {
186 d->uuid = QUuid::createUuid();
187 }
188
189 return d->uuid;
190}
191
193{
194 d->uuid = value;
195 this->setMD5Sum(KoMD5Generator::generateHash(value.toByteArray()));
196}
197
199{
200 return uuid().toString().mid(1, 36);
201}
202
204{
205 setUuid(QUuid(QString("{%1}").arg(value)));
206}
207
209{
210 return &d->context;
211}
212
214{
215 return &d->drop_shadow;
216}
217
219{
220 return &d->inner_shadow;
221}
222
224{
225 return &d->outer_glow;
226}
227
229{
230 return &d->inner_glow;
231}
232
234{
235 return &d->satin;
236}
237
239{
240 return &d->color_overlay;
241}
242
244{
245 return &d->gradient_overlay;
246}
247
249{
250 return &d->pattern_overlay;
251}
252
254{
255 return &d->stroke;
256}
257
259{
260 return &d->bevel_emboss;
261}
262
264{
265 return &d->context;
266}
267
269{
270 return &d->drop_shadow;
271}
272
274{
275 return &d->inner_shadow;
276}
277
279{
280 return &d->outer_glow;
281}
282
284{
285 return &d->inner_glow;
286}
287
289{
290 return &d->satin;
291}
292
294{
295 return &d->color_overlay;
296}
297
302
307
309{
310 return &d->stroke;
311}
312
317
319{
320 return d->resourcesInterface;
321}
322
324{
325 d->resourcesInterface = resourcesInterface;
326}
327
332
334{
335 KisPSDLayerStyleSP style = KisRequiredResourcesOperators::cloneWithResourcesSnapshot<KisPSDLayerStyleSP>(this, globalResourcesInterface);
336
343 if (!requiredCanvasResources().isEmpty() && !canvasResourcesInterface) {
344 qWarning() << "KisPSDLayerStyle::cloneWithResourcesSnapshot: layer style"
345 << name() << "is expected to have all the canvas resources"
346 << "backed, but still depends on something";
347 qWarning() << ppVar(requiredCanvasResources());
348 }
349
350 if (canvasResourcesInterface) {
351
352 QSharedPointer<KisLocalStrokeResources> localResourcesSnapshot =
353 style->resourcesInterface().dynamicCast<KisLocalStrokeResources>();
354 KIS_ASSERT_RECOVER_RETURN_VALUE(localResourcesSnapshot, style);
355
356 auto bakeGradient = [canvasResourcesInterface, localResourcesSnapshot] (KoAbstractGradientSP gradient) {
357 if (gradient && !gradient->requiredCanvasResources().isEmpty()) {
358
365 KoAbstractGradientSP clonedGradient =
366 gradient->cloneAndBakeVariableColors(canvasResourcesInterface);
367
368 localResourcesSnapshot->removeResource(gradient);
369 localResourcesSnapshot->addResource(clonedGradient);
370 }
371 };
372
373 if (style->gradientOverlay()->effectEnabled()) {
374 bakeGradient(style->gradientOverlay()->gradient(style->resourcesInterface()));
375 }
376
377 if (style->innerGlow()->effectEnabled() && style->innerGlow()->fillType() == psd_fill_gradient) {
378 bakeGradient(style->innerGlow()->gradient(style->resourcesInterface()));
379 }
380
381 if (style->outerGlow()->effectEnabled() && style->outerGlow()->fillType() == psd_fill_gradient) {
382 bakeGradient(style->outerGlow()->gradient(style->resourcesInterface()));
383 }
384
385 if (style->stroke()->effectEnabled() && style->stroke()->fillType() == psd_fill_gradient) {
386 bakeGradient(style->stroke()->gradient(style->resourcesInterface()));
387 }
388 }
389
390 return style;
391}
392
394{
395 Q_UNUSED(globalResourcesInterface);
396 return implicitCastList<KoResourceLoadResult>(QList<KoResourceSP>::fromVector(KisAslLayerStyleSerializer::fetchEmbeddedResources(this)));
397}
398
400{
401 QList<int> result;
402
403 auto addCanvasResources = [&result] (KoAbstractGradientSP gradient) {
404 if (gradient) {
405 result << gradient->requiredCanvasResources();
406 }
407 };
408
410 addCanvasResources(gradientOverlay()->gradient(resourcesInterface()));
411 }
412
413 if (innerGlow()->effectEnabled() && innerGlow()->fillType() == psd_fill_gradient) {
414 addCanvasResources(innerGlow()->gradient(resourcesInterface()));
415 }
416
417 if (outerGlow()->effectEnabled() && outerGlow()->fillType() == psd_fill_gradient) {
418 addCanvasResources(outerGlow()->gradient(resourcesInterface()));
419 }
420
421 if (stroke()->effectEnabled() && stroke()->fillType() == psd_fill_gradient) {
422 addCanvasResources(stroke()->gradient(resourcesInterface()));
423 }
424
426
427 return result;
428}
float value(const T *src, size_t ch)
static QVector< KoResourceSP > fetchEmbeddedResources(const KisPSDLayerStyle *style)
a KisResourcesInterface-like resources storage for preloaded resources
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.
bool effectEnabled() const
Definition psd.h:261
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define ppVar(var)
Definition kis_debug.h:155
QSharedPointer< T > toQShared(T *ptr)
void makeContainerUnique(C &container)
@ psd_fill_gradient
Definition psd.h:125
The KisPSDLayerStyle class implements loading, saving and applying the PSD layer effects.
KisResourcesInterfaceSP resourcesInterface
QList< int > requiredCanvasResources() const override
KisPSDLayerStyleSP cloneWithResourcesSnapshot(KisResourcesInterfaceSP globalResourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface) const
Private(const Private &rhs)
bool hasLocalResourcesSnapshot() const
bool loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
psd_layer_effects_inner_glow inner_glow
psd_layer_effects_context context
const psd_layer_effects_bevel_emboss * bevelAndEmboss() const
psd_layer_effects_color_overlay color_overlay
bool saveToDevice(QIODevice *dev) const override
psd_layer_effects_gradient_overlay gradient_overlay
QList< KoResourceLoadResult > embeddedResources(KisResourcesInterfaceSP globalResourcesInterface) const override
void setEnabled(bool value)
bool isSerializable() const override
psd_layer_effects_outer_glow outer_glow
void setResourcesInterface(KisResourcesInterfaceSP resourcesInterface)
const psd_layer_effects_drop_shadow * dropShadow() const
const psd_layer_effects_color_overlay * colorOverlay() const
const psd_layer_effects_gradient_overlay * gradientOverlay() const
void setName(const QString &value)
void setUuid(const QUuid &value)
psd_layer_effects_bevel_emboss bevel_emboss
psd_layer_effects_inner_shadow inner_shadow
void setPsdUuid(const QString &value)
const psd_layer_effects_inner_glow * innerGlow() const
psd_layer_effects_stroke stroke
psd_layer_effects_pattern_overlay pattern_overlay
Private operator=(const Private &rhs)
KoResourceSP clone() const override
KisPSDLayerStyle(const QString &filename="", KisResourcesInterfaceSP resourcesInterface=KisResourcesInterfaceSP())
const psd_layer_effects_pattern_overlay * patternOverlay() const
const psd_layer_effects_inner_shadow * innerShadow() const
psd_layer_effects_drop_shadow drop_shadow
Private(KisResourcesInterfaceSP _resourcesInterface)
const psd_layer_effects_outer_glow * outerGlow() const
psd_layer_effects_satin satin
void setValid(bool valid)
void setMD5Sum(const QString &md5sum)
Set the md5sum of this resource. It must be in hex-encoded string format.