Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOnionSkinCompositor Class Reference

#include <kis_onion_skin_compositor.h>

+ Inheritance diagram for KisOnionSkinCompositor:

Classes

struct  Private
 

Public Slots

void configChanged ()
 

Signals

void sigOnionSkinChanged ()
 

Public Member Functions

QRect calculateExtent (const KisPaintDeviceSP device)
 
QRect calculateExtent (const KisPaintDeviceSP device, int time)
 
QRect calculateFullExtent (const KisPaintDeviceSP device)
 
QSet< int > colorLabelFilter ()
 
void composite (const KisPaintDeviceSP sourceDevice, KisPaintDeviceSP targetDevice, const QRect &rect)
 
int configSeqNo () const
 
 KisOnionSkinCompositor ()
 
void setColorLabelFilter (QSet< int > colors)
 
QRect updateExtentOnAddition (const KisPaintDeviceSP device, int addedTime)
 
 ~KisOnionSkinCompositor () override
 

Static Public Member Functions

static KisOnionSkinCompositorinstance ()
 

Private Attributes

QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 15 of file kis_onion_skin_compositor.h.

Constructor & Destructor Documentation

◆ KisOnionSkinCompositor()

KisOnionSkinCompositor::KisOnionSkinCompositor ( )

Definition at line 112 of file kis_onion_skin_compositor.cpp.

113 : m_d(new Private)
114{
115 m_d->refreshConfig();
116}
QScopedPointer< Private > m_d

References m_d.

◆ ~KisOnionSkinCompositor()

KisOnionSkinCompositor::~KisOnionSkinCompositor ( )
override

Definition at line 118 of file kis_onion_skin_compositor.cpp.

119{}

Member Function Documentation

◆ calculateExtent() [1/2]

QRect KisOnionSkinCompositor::calculateExtent ( const KisPaintDeviceSP device)

Definition at line 230 of file kis_onion_skin_compositor.cpp.

231{
232 KisRasterKeyframeChannel *channel = device->keyframeChannel(); //TODO: take in channel instead of device...?
233
234 if (!channel) { // it happens when you try to show onion skins on non-animated layer with opacity keyframes
235 return QRect();
236 }
237
238 return calculateExtent(device, channel->activeKeyframeTime());
239}
int activeKeyframeTime(int time) const
Get the time of the active keyframe. Useful for snapping any time to that of the most recent keyframe...
QRect calculateExtent(const KisPaintDeviceSP device, int time)
KisRasterKeyframeChannel * keyframeChannel() const
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...

References KisKeyframeChannel::activeKeyframeTime(), calculateExtent(), and KisPaintDevice::keyframeChannel().

◆ calculateExtent() [2/2]

QRect KisOnionSkinCompositor::calculateExtent ( const KisPaintDeviceSP device,
int time )

Definition at line 195 of file kis_onion_skin_compositor.cpp.

196{
197 QRect rect;
198 int keyframeTimeBack;
199 int keyframeTimeFwd;
200
201 KisRasterKeyframeChannel *channel = device->keyframeChannel(); //TODO: take in channel instead of device...?
202
203 if (!channel) { // it happens when you try to show onion skins on non-animated layer with opacity keyframes
204 return rect;
205 }
206
207 keyframeTimeBack = keyframeTimeFwd = time;
208
209 for (int offset = 1; offset <= m_d->numberOfSkins; offset++) {
210 if (channel->keyframeAt(keyframeTimeBack)) {
211 keyframeTimeBack = channel->previousKeyframeTime(keyframeTimeBack);
212
213 if (channel->keyframeAt(keyframeTimeBack)) {
214 rect |= channel->frameExtents(channel->keyframeAt(keyframeTimeBack));
215 }
216 }
217
218 if (channel->keyframeAt(keyframeTimeFwd)) {
219 keyframeTimeFwd = channel->nextKeyframeTime(keyframeTimeFwd);
220
221 if (channel->keyframeAt(keyframeTimeFwd)) {
222 rect |= channel->frameExtents(channel->keyframeAt(keyframeTimeFwd));
223 }
224 }
225 }
226
227 return rect;
228}
int previousKeyframeTime(const int time) const
KisKeyframeSP keyframeAt(int time) const
Get a keyframe at specified time. Used primarily when the value of a given keyframe is needed.
int nextKeyframeTime(const int time) const
QRect frameExtents(KisKeyframeSP keyframe)

References KisRasterKeyframeChannel::frameExtents(), KisKeyframeChannel::keyframeAt(), KisPaintDevice::keyframeChannel(), m_d, KisKeyframeChannel::nextKeyframeTime(), and KisKeyframeChannel::previousKeyframeTime().

◆ calculateFullExtent()

QRect KisOnionSkinCompositor::calculateFullExtent ( const KisPaintDeviceSP device)

Definition at line 178 of file kis_onion_skin_compositor.cpp.

179{
180 QRect rect;
181
182 KisRasterKeyframeChannel *channel = device->keyframeChannel();
183 if (!channel) return rect;
184
185 int currentKeyTime = channel->firstKeyframeTime();
186
187 while (channel->keyframeAt(currentKeyTime)) {
188 rect |= channel->frameExtents(channel->keyframeAt(currentKeyTime));
189 currentKeyTime = channel->nextKeyframeTime(currentKeyTime);
190 }
191
192 return rect;
193}

References KisKeyframeChannel::firstKeyframeTime(), KisRasterKeyframeChannel::frameExtents(), KisKeyframeChannel::keyframeAt(), KisPaintDevice::keyframeChannel(), and KisKeyframeChannel::nextKeyframeTime().

◆ colorLabelFilter()

QSet< int > KisOnionSkinCompositor::colorLabelFilter ( )

Definition at line 131 of file kis_onion_skin_compositor.cpp.

132{
133 return m_d->colorLabelFilter;
134}

References m_d.

◆ composite()

void KisOnionSkinCompositor::composite ( const KisPaintDeviceSP sourceDevice,
KisPaintDeviceSP targetDevice,
const QRect & rect )

Definition at line 136 of file kis_onion_skin_compositor.cpp.

137{
138 KisRasterKeyframeChannel *keyframes = sourceDevice->keyframeChannel();
139
140 KisPaintDeviceSP frameDevice = new KisPaintDevice(sourceDevice->colorSpace());
141 KisPainter gcFrame(frameDevice);
142 QBitArray channelFlags = sourceDevice->colorSpace()->channelFlags(true, false);
143 gcFrame.setChannelFlags(channelFlags);
144 gcFrame.setOpacityU8(m_d->tintFactor);
145
146 KisPaintDeviceSP backwardTintDevice = m_d->setUpTintDevice(m_d->backwardTintColor, sourceDevice->colorSpace());
147 KisPaintDeviceSP forwardTintDevice = m_d->setUpTintDevice(m_d->forwardTintColor, sourceDevice->colorSpace());
148
149 KisPainter gcDest(targetDevice);
150 gcDest.setCompositeOpId(sourceDevice->colorSpace()->compositeOp(COMPOSITE_BEHIND));
151
152 int keyframeTimeBck;
153 int keyframeTimeFwd;
154
155 int time = sourceDevice->defaultBounds()->currentTime();
156
157 if (!keyframes) { // it happens when you try to show onion skins on non-animated layer with opacity keyframes
158 return;
159 }
160
161 keyframeTimeBck = keyframeTimeFwd = keyframes->activeKeyframeTime(time);
162
163 for (int offset = 1; offset <= m_d->numberOfSkins; offset++) {
164 KisRasterKeyframeSP backKeyframe = m_d->getNextFrameToComposite(keyframes, keyframeTimeBck, true);
165 KisRasterKeyframeSP forwardKeyframe = m_d->getNextFrameToComposite(keyframes, keyframeTimeFwd, false);
166
167 if (!backKeyframe.isNull()) {
168 m_d->tryCompositeFrame(backKeyframe, gcFrame, gcDest, backwardTintDevice, m_d->skinOpacity(-offset), rect);
169 }
170
171 if (!forwardKeyframe.isNull()) {
172 m_d->tryCompositeFrame(forwardKeyframe, gcFrame, gcDest, forwardTintDevice, m_d->skinOpacity(offset), rect);
173 }
174 }
175
176}
const QString COMPOSITE_BEHIND
virtual int currentTime() const =0
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
QBitArray channelFlags(bool color=true, bool alpha=false) const
const KoCompositeOp * compositeOp(const QString &id, const KoColorSpace *srcSpace=nullptr) const

References KisKeyframeChannel::activeKeyframeTime(), KoColorSpace::channelFlags(), KisPaintDevice::colorSpace(), COMPOSITE_BEHIND, KoColorSpace::compositeOp(), KisDefaultBoundsBase::currentTime(), KisPaintDevice::defaultBounds(), KisPaintDevice::keyframeChannel(), m_d, KisPainter::setChannelFlags(), KisPainter::setCompositeOpId(), and KisPainter::setOpacityU8().

◆ configChanged

void KisOnionSkinCompositor::configChanged ( )
slot

Definition at line 328 of file kis_onion_skin_compositor.cpp.

329{
330 m_d->refreshConfig();
331 Q_EMIT sigOnionSkinChanged();
332}

References m_d, and sigOnionSkinChanged().

◆ configSeqNo()

int KisOnionSkinCompositor::configSeqNo ( ) const

Definition at line 121 of file kis_onion_skin_compositor.cpp.

122{
123 return m_d->configSeqNo;
124}

References m_d.

◆ instance()

KisOnionSkinCompositor * KisOnionSkinCompositor::instance ( )
static

Definition at line 107 of file kis_onion_skin_compositor.cpp.

108{
109 return s_instance;
110}

◆ setColorLabelFilter()

void KisOnionSkinCompositor::setColorLabelFilter ( QSet< int > colors)

Definition at line 126 of file kis_onion_skin_compositor.cpp.

127{
128 m_d->colorLabelFilter = colors;
129}

References m_d.

◆ sigOnionSkinChanged

void KisOnionSkinCompositor::sigOnionSkinChanged ( )
signal

◆ updateExtentOnAddition()

QRect KisOnionSkinCompositor::updateExtentOnAddition ( const KisPaintDeviceSP device,
int addedTime )

Definition at line 302 of file kis_onion_skin_compositor.cpp.

303{
304 QRect rect;
305
306 KisRasterKeyframeChannel *channel = device->keyframeChannel(); //TODO: take in channel instead of device...?
307
308 if (!channel) { // it happens when you try to show onion skins on non-animated layer with opacity keyframes
309 return rect;
310 }
311
312 int currentActiveTime = channel->activeKeyframeTime();
313 int prevActiveTime = -1;
314
315 if (currentActiveTime == addedTime) {
316 prevActiveTime = channel->previousKeyframeTime(currentActiveTime);
317 } else {
318 prevActiveTime = currentActiveTime;
319 }
320
321 rect = m_d->updateExtentOnFrameChange(channel,
322 prevActiveTime, addedTime,
323 currentActiveTime, -1);
324
325 return rect;
326}

References KisKeyframeChannel::activeKeyframeTime(), KisPaintDevice::keyframeChannel(), m_d, and KisKeyframeChannel::previousKeyframeTime().

Member Data Documentation

◆ m_d

QScopedPointer<Private> KisOnionSkinCompositor::m_d
private

Definition at line 45 of file kis_onion_skin_compositor.h.


The documentation for this class was generated from the following files: