Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOnionSkinCompositor::Private Struct Reference

Public Member Functions

KisRasterKeyframeSP getNextFrameToComposite (KisKeyframeChannel *channel, int &outFrame, bool backwards)
 
void refreshConfig ()
 
KisPaintDeviceSP setUpTintDevice (const QColor &tintColor, const KoColorSpace *colorSpace)
 
int skinOpacity (int offset)
 
void tryCompositeFrame (KisRasterKeyframeSP keyframe, KisPainter &gcFrame, KisPainter &gcDest, KisPaintDeviceSP tintSource, int opacity, const QRect &rect)
 
QRect updateExtentOnFrameChange (KisRasterKeyframeChannel *channel, int prevActiveTime, int prevIgnoredTime, int nowActiveTime, int nowIgnoredTime)
 

Public Attributes

QVector< int > backwardOpacities
 
QColor backwardTintColor
 
QSet< int > colorLabelFilter
 
int configSeqNo = 0
 
QVector< int > forwardOpacities
 
QColor forwardTintColor
 
int numberOfSkins = 0
 
int tintFactor = 0
 

Detailed Description

Definition at line 20 of file kis_onion_skin_compositor.cpp.

Member Function Documentation

◆ getNextFrameToComposite()

KisRasterKeyframeSP KisOnionSkinCompositor::Private::getNextFrameToComposite ( KisKeyframeChannel * channel,
int & outFrame,
bool backwards )
inline

Definition at line 48 of file kis_onion_skin_compositor.cpp.

49 {
50 while (!channel->keyframeAt(outFrame).isNull()) {
51 outFrame = backwards ? channel->previousKeyframeTime(outFrame) : channel->nextKeyframeTime(outFrame);
52 if (colorLabelFilter.isEmpty()) {
53 return channel->keyframeAt<KisRasterKeyframe>(outFrame);
54 } else if (channel->keyframeAt<KisRasterKeyframe>(outFrame)) {
55 if (colorLabelFilter.contains(channel->keyframeAt(outFrame)->colorLabel())) {
56 return channel->keyframeAt<KisRasterKeyframe>(outFrame);
57 }
58 }
59 }
60 return channel->keyframeAt<KisRasterKeyframe>(outFrame);
61 }
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
The KisRasterKeyframe class is a concrete subclass of KisKeyframe that wraps a physical raster image ...

References KisKeyframeChannel::keyframeAt(), KisKeyframeChannel::nextKeyframeTime(), and KisKeyframeChannel::previousKeyframeTime().

◆ refreshConfig()

void KisOnionSkinCompositor::Private::refreshConfig ( )
inline

Definition at line 75 of file kis_onion_skin_compositor.cpp.

76 {
77 KisImageConfig config(true);
78
79 numberOfSkins = config.numberOfOnionSkins();
80 tintFactor = config.onionSkinTintFactor();
81 backwardTintColor = config.onionSkinTintColorBackward();
82 forwardTintColor = config.onionSkinTintColorForward();
83
86
87 const int mainState = (int) config.onionSkinState(0);
88 const qreal scaleFactor = mainState * config.onionSkinOpacity(0) / 255.0;
89
90 for (int i = 0; i < numberOfSkins; i++) {
91 int backwardState = (int) config.onionSkinState(-(i + 1));
92 int forwardState = (int) config.onionSkinState(i + 1);
93
94 backwardOpacities[i] = scaleFactor * backwardState * config.onionSkinOpacity(-(i + 1));
95 forwardOpacities[i] = scaleFactor * forwardState * config.onionSkinOpacity(i + 1);
96 }
97
99 }

References KisImageConfig::numberOfOnionSkins(), KisImageConfig::onionSkinOpacity(), KisImageConfig::onionSkinState(), KisImageConfig::onionSkinTintColorBackward(), KisImageConfig::onionSkinTintColorForward(), and KisImageConfig::onionSkinTintFactor().

◆ setUpTintDevice()

KisPaintDeviceSP KisOnionSkinCompositor::Private::setUpTintDevice ( const QColor & tintColor,
const KoColorSpace * colorSpace )
inline

Definition at line 39 of file kis_onion_skin_compositor.cpp.

40 {
41 KisPaintDeviceSP tintDevice = new KisPaintDevice(colorSpace);
42 KoColor color = KoColor(tintColor, colorSpace);
43 tintDevice->setDefaultPixel(color);
44 return tintDevice;
45 }
void setDefaultPixel(const KoColor &defPixel)

References KisPaintDevice::setDefaultPixel().

◆ skinOpacity()

int KisOnionSkinCompositor::Private::skinOpacity ( int offset)
inline

Definition at line 31 of file kis_onion_skin_compositor.cpp.

32 {
35
36 return offset > 0 ? fo[qAbs(offset) - 1] : bo[qAbs(offset) - 1];
37 }

◆ tryCompositeFrame()

void KisOnionSkinCompositor::Private::tryCompositeFrame ( KisRasterKeyframeSP keyframe,
KisPainter & gcFrame,
KisPainter & gcDest,
KisPaintDeviceSP tintSource,
int opacity,
const QRect & rect )
inline

Definition at line 63 of file kis_onion_skin_compositor.cpp.

64 {
65 if (keyframe.isNull() || opacity == OPACITY_TRANSPARENT_U8) return;
66
67 keyframe->writeFrameToDevice(gcFrame.device());
68
69 gcFrame.bitBlt(rect.topLeft(), tintSource, rect);
70
71 gcDest.setOpacityU8(opacity);
72 gcDest.bitBlt(rect.topLeft(), gcFrame.device(), rect);
73 }
const quint8 OPACITY_TRANSPARENT_U8
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
void setOpacityU8(quint8 opacity)
Set the opacity which is used in painting (like filling polygons)
KisPaintDeviceSP device

References KisPainter::bitBlt(), KisPainter::device, OPACITY_TRANSPARENT_U8, and KisPainter::setOpacityU8().

◆ updateExtentOnFrameChange()

QRect KisOnionSkinCompositor::Private::updateExtentOnFrameChange ( KisRasterKeyframeChannel * channel,
int prevActiveTime,
int prevIgnoredTime,
int nowActiveTime,
int nowIgnoredTime )

Definition at line 242 of file kis_onion_skin_compositor.cpp.

245{
246 QRect rect;
247
248 std::vector<int> skinsBefore;
249 std::vector<int> skinsAfter;
250
251 auto fetchSkins = [this] (KisRasterKeyframeChannel *channel, const int activeTime, int ignoredFrame) {
252 std::vector<int> skinsLeft;
253 std::vector<int> skinsRight;
254
255 int keyframeTimeBck = activeTime;
256 int keyframeTimeFwd = activeTime;
257
258 auto addNextFrame = [channel, this, ignoredFrame] (int offset, int &startTime, std::vector<int> &skins, bool backwards) {
259 KisRasterKeyframeSP keyframe;
260 do {
261 keyframe = getNextFrameToComposite(channel, startTime, backwards);
262 } while (keyframe && startTime == ignoredFrame);
263
264 if (keyframe && skinOpacity(-offset) != OPACITY_TRANSPARENT_U8) {
265 skins.push_back(startTime);
266 }
267 };
268
269 for (int offset = 1; offset <= numberOfSkins; offset++) {
270 addNextFrame(offset, keyframeTimeBck, skinsLeft, true);
271 addNextFrame(offset, keyframeTimeFwd, skinsRight, false);
272 }
273
274 std::reverse(skinsLeft.begin(), skinsLeft.end());
275 skinsLeft.reserve(skinsLeft.size() + skinsRight.size());
276 std::copy(skinsRight.begin(), skinsRight.end(), std::back_inserter(skinsLeft));
277
278 return skinsLeft;
279 };
280
281 skinsBefore = fetchSkins(channel, prevActiveTime, prevIgnoredTime);
282 skinsAfter = fetchSkins(channel, nowActiveTime, nowIgnoredTime);
283
284 std::vector<int> changedSkins;
285
286 std::set_symmetric_difference(skinsBefore.begin(), skinsBefore.end(),
287 skinsAfter.begin(), skinsAfter.end(),
288 std::back_inserter(changedSkins));
289
290// ENTER_FUNCTION() << ppVar(skinsBefore);
291// ENTER_FUNCTION() << ppVar(skinsAfter);
292// ENTER_FUNCTION() << ppVar(changedSkins);
293
294 for (auto it = changedSkins.begin(); it != changedSkins.end(); ++it) {
295 KIS_SAFE_ASSERT_RECOVER(channel->keyframeAt(*it)) { continue; }
296 rect |= channel->frameExtents(channel->keyframeAt(*it));
297 }
298
299 return rect;
300}
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...
QRect frameExtents(KisKeyframeSP keyframe)
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
KisRasterKeyframeSP getNextFrameToComposite(KisKeyframeChannel *channel, int &outFrame, bool backwards)

References KisRasterKeyframeChannel::frameExtents(), getNextFrameToComposite(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER, numberOfSkins, OPACITY_TRANSPARENT_U8, and skinOpacity().

Member Data Documentation

◆ backwardOpacities

QVector<int> KisOnionSkinCompositor::Private::backwardOpacities

Definition at line 26 of file kis_onion_skin_compositor.cpp.

◆ backwardTintColor

QColor KisOnionSkinCompositor::Private::backwardTintColor

Definition at line 24 of file kis_onion_skin_compositor.cpp.

◆ colorLabelFilter

QSet<int> KisOnionSkinCompositor::Private::colorLabelFilter

Definition at line 29 of file kis_onion_skin_compositor.cpp.

◆ configSeqNo

int KisOnionSkinCompositor::Private::configSeqNo = 0

Definition at line 28 of file kis_onion_skin_compositor.cpp.

◆ forwardOpacities

QVector<int> KisOnionSkinCompositor::Private::forwardOpacities

Definition at line 27 of file kis_onion_skin_compositor.cpp.

◆ forwardTintColor

QColor KisOnionSkinCompositor::Private::forwardTintColor

Definition at line 25 of file kis_onion_skin_compositor.cpp.

◆ numberOfSkins

int KisOnionSkinCompositor::Private::numberOfSkins = 0

Definition at line 22 of file kis_onion_skin_compositor.cpp.

◆ tintFactor

int KisOnionSkinCompositor::Private::tintFactor = 0

Definition at line 23 of file kis_onion_skin_compositor.cpp.


The documentation for this struct was generated from the following file: