Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_multiple_projection.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QMap>
10#include <QReadWriteLock>
11
12
13#include <KoColorSpace.h>
14
15#include "kis_painter.h"
16#include "kis_paint_device.h"
18
19
26
27typedef QMap<QString, ProjectionStruct> PlanesMap;
28
34
35
40
42 : m_d(new Private)
43{
44 QReadLocker readLocker(&rhs.m_d->lock);
45
46 auto it = rhs.m_d->planes.constBegin();
47 for (; it != rhs.m_d->planes.constEnd(); ++it) {
49 proj.device = new KisPaintDevice(*it->device);
50 proj.compositeOpId = it->compositeOpId;
51 proj.opacity = it->opacity;
52 proj.channelFlags = it->channelFlags;
53
54 m_d->planes.insert(it.key(), proj);
55 }
56}
57
61
63{
64 return "00_default";
65}
66
68 const QString &compositeOpId,
69 quint8 opacity,
70 const QBitArray &channelFlags,
71 KisPaintDeviceSP prototype)
72{
73 QReadLocker readLocker(&m_d->lock);
74
75 PlanesMap::const_iterator constIt = m_d->planes.constFind(id);
76
77 if (constIt == m_d->planes.constEnd() ||
78 constIt->compositeOpId != compositeOpId ||
79 constIt->opacity != opacity ||
80 constIt->channelFlags != channelFlags ||
81 *constIt->device->colorSpace() != *prototype->colorSpace()) {
82
83 readLocker.unlock();
84
85 {
86 QWriteLocker writeLocker(&m_d->lock);
87
88 PlanesMap::iterator writeIt = m_d->planes.find(id);
89 if (writeIt == m_d->planes.end()) {
90 ProjectionStruct plane;
91 plane.device = new KisPaintDevice(prototype->colorSpace());
92 plane.device->prepareClone(prototype);
93 plane.compositeOpId = compositeOpId;
94 plane.opacity = opacity;
95 plane.channelFlags = channelFlags;
96 writeIt = m_d->planes.insert(id, plane);
97 } else if (writeIt->compositeOpId != compositeOpId ||
98 *writeIt->device->colorSpace() != *prototype->colorSpace()) {
99
100 writeIt->device->prepareClone(prototype);
101 writeIt->compositeOpId = compositeOpId;
102 writeIt->opacity = opacity;
103 writeIt->channelFlags = channelFlags;
104 }
105
106 return writeIt->device;
107 }
108 }
109
110 return constIt->device;
111}
112
114{
115 QWriteLocker writeLocker(&m_d->lock);
116 m_d->planes.remove(id);
117}
118
120{
121 QWriteLocker writeLocker(&m_d->lock);
122 m_d->planes.clear();
123}
124
125void KisMultipleProjection::clear(const QRect &rc)
126{
127 QReadLocker readLocker(&m_d->lock);
128
129 PlanesMap::const_iterator it = m_d->planes.constBegin();
130 PlanesMap::const_iterator end = m_d->planes.constEnd();
131
132 for (; it != end; ++it) {
133 const_cast<KisPaintDevice*>(it->device.data())->clear(rc);
134 }
135}
136
138{
139 QReadLocker readLocker(&m_d->lock);
140
141 PlanesMap::const_iterator it = m_d->planes.constBegin();
142 PlanesMap::const_iterator end = m_d->planes.constEnd();
143
144 for (; it != end; ++it) {
145 KisPainter gc(dstDevice);
146 gc.setCompositeOpId(it->compositeOpId);
147 env->setupFinalPainter(&gc, it->opacity, it->channelFlags);
148 gc.bitBlt(rect.topLeft(), it->device, rect);
149 }
150}
151
153{
154 QReadLocker readLocker(&m_d->lock);
155
156 PlanesMap::const_iterator it = m_d->planes.constBegin();
157 PlanesMap::const_iterator end = m_d->planes.constEnd();
158
160 for (; it != end; ++it) {
161 list << it->device;
162 }
163
164 return list;
165}
166
168{
169 return m_d->planes.isEmpty();
170}
171
const quint8 OPACITY_OPAQUE_U8
KisPaintDeviceSP getProjection(const QString &id, const QString &compositeOpId, quint8 opacity, const QBitArray &channelFlags, KisPaintDeviceSP prototype)
void freeProjection(const QString &id)
KisPaintDeviceList getLodCapableDevices() const
const QScopedPointer< Private > m_d
void apply(KisPaintDeviceSP dstDevice, const QRect &rect, KisLayerStyleFilterEnvironment *env)
const KoColorSpace * colorSpace() const
void prepareClone(KisPaintDeviceSP src)
QBitArray channelFlags()
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
void setCompositeOpId(const KoCompositeOp *op)
QMap< QString, ProjectionStruct > PlanesMap
void setupFinalPainter(KisPainter *gc, quint8 opacity, const QBitArray &channelFlags) const