[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [calligra/krita-animation-pentikainen] krita: Refactor fetching individual frames through raster cha
From: Jouni_Pentikäinen <joupent () gmail ! com>
Date: 2015-08-12 9:41:18
Message-ID: E1ZPSX8-0000UW-BA () scm ! kde ! org
[Download RAW message or body]
Git commit a493164fc537889cc9c1855dae46c9deddd6365e by Jouni Pentikäinen.
Committed on 12/08/2015 at 09:14.
Pushed by jounip into branch 'krita-animation-pentikainen'.
Refactor fetching individual frames through raster channel
M +23 -2 krita/image/kis_keyframe_channel.cpp
M +4 -1 krita/image/kis_keyframe_channel.h
M +21 -11 krita/image/kis_onion_skin_compositor.cpp
M +3 -18 krita/image/kis_raster_keyframe_channel.cpp
M +1 -1 krita/image/kis_raster_keyframe_channel.h
M +8 -24 krita/image/tests/kis_keyframing_test.cpp
M +4 -4 krita/image/tests/kis_paint_device_test.cpp
M +2 -2 krita/plugins/extensions/dockers/animation/animation_docker.cpp
http://commits.kde.org/calligra/a493164fc537889cc9c1855dae46c9deddd6365e
diff --git a/krita/image/kis_keyframe_channel.cpp \
b/krita/image/kis_keyframe_channel.cpp index 5d353b0..19b4fcc 100644
--- a/krita/image/kis_keyframe_channel.cpp
+++ b/krita/image/kis_keyframe_channel.cpp
@@ -230,9 +230,30 @@ KisKeyframe *KisKeyframeChannel::keyframeAt(int time)
return 0;
}
-KisKeyframe *KisKeyframeChannel::activeKeyframeAt(int time) const
+KisKeyframeSP KisKeyframeChannel::activeKeyframeAt(int time) const
{
- return activeKeyIterator(time).value().data();
+ return activeKeyIterator(time).value();
+}
+
+KisKeyframeSP KisKeyframeChannel::nextKeyframe(KisKeyframeSP keyframe)
+{
+ KeyframesMap::iterator i = m_d->keys.find(keyframe->time());
+ if (i == m_d->keys.end()) return KisKeyframeSP(0);
+
+ i++;
+
+ if (i == m_d->keys.end()) return KisKeyframeSP(0);
+ return i.value();
+}
+
+KisKeyframeSP KisKeyframeChannel::previousKeyframe(KisKeyframeSP keyframe)
+{
+ KeyframesMap::iterator i = m_d->keys.find(keyframe->time());
+ if (i == m_d->keys.begin() || i == m_d->keys.end()) return KisKeyframeSP(0);
+ i--;
+
+ if (i == m_d->keys.begin()) return KisKeyframeSP(0);
+ return i.value();
}
KisTimeRange KisKeyframeChannel::affectedFrames(int time) const
diff --git a/krita/image/kis_keyframe_channel.h b/krita/image/kis_keyframe_channel.h
index 479dc7a..d70b766 100644
--- a/krita/image/kis_keyframe_channel.h
+++ b/krita/image/kis_keyframe_channel.h
@@ -54,7 +54,10 @@ public:
KisKeyframe *copyKeyframe(const KisKeyframe *keyframe, int newTime, \
KUndo2Command *parentCommand = 0);
KisKeyframe *keyframeAt(int time);
- KisKeyframe *activeKeyframeAt(int time) const;
+ KisKeyframeSP activeKeyframeAt(int time) const;
+
+ KisKeyframeSP nextKeyframe(KisKeyframeSP keyframe);
+ KisKeyframeSP previousKeyframe(KisKeyframeSP keyframe);
/**
* Get the set of frames affected by any changes to the value
diff --git a/krita/image/kis_onion_skin_compositor.cpp \
b/krita/image/kis_onion_skin_compositor.cpp index 7015a6f..f487a4c 100644
--- a/krita/image/kis_onion_skin_compositor.cpp
+++ b/krita/image/kis_onion_skin_compositor.cpp
@@ -67,17 +67,16 @@ struct KisOnionSkinCompositor::Private
return tintDevice;
}
- void compositeFrame(KisRasterKeyframeChannel *keyframes, int time, int offset, \
KisPainter &gcFrame, KisPainter &gcDest, KisPaintDeviceSP tintSource, const QRect \
&rect) + void compositeFrame(KisRasterKeyframeChannel *keyframes, KisKeyframeSP \
keyframe, KisPainter &gcFrame, KisPainter &gcDest, KisPaintDeviceSP tintSource, int \
opacity, const QRect &rect) {
- bool ok = keyframes->fetchFrame(gcFrame.device(), time, offset);
+ if (keyframe.isNull()) return;
- if (ok) {
- gcFrame.bitBlt(rect.topLeft(), tintSource, rect);
+ keyframes->fetchFrame(keyframe, gcFrame.device());
- int opacity = skinOpacity(offset);
- gcDest.setOpacity(opacity);
- gcDest.bitBlt(rect.topLeft(), gcFrame.device(), rect);
- }
+ gcFrame.bitBlt(rect.topLeft(), tintSource, rect);
+
+ gcDest.setOpacity(opacity);
+ gcDest.bitBlt(rect.topLeft(), gcFrame.device(), rect);
}
void refreshConfig()
@@ -111,7 +110,6 @@ KisOnionSkinCompositor::~KisOnionSkinCompositor()
void KisOnionSkinCompositor::composite(const KisPaintDeviceSP sourceDevice, \
KisPaintDeviceSP targetDevice, const QRect& rect) {
- int time = sourceDevice->defaultBounds()->currentTime();
KisRasterKeyframeChannel *keyframes = sourceDevice->keyframeChannel();
KisPaintDeviceSP frameDevice = new KisPaintDevice(sourceDevice->colorSpace());
@@ -126,10 +124,22 @@ void KisOnionSkinCompositor::composite(const KisPaintDeviceSP \
sourceDevice, KisP KisPainter gcDest(targetDevice);
gcDest.setCompositeOp(sourceDevice->colorSpace()->compositeOp(COMPOSITE_BEHIND));
+ KisKeyframeSP keyframeBck;
+ KisKeyframeSP keyframeFwd;
+
+ int time = sourceDevice->defaultBounds()->currentTime();
+ keyframeBck = keyframeFwd = keyframes->activeKeyframeAt(time);
for (int offset = 1; offset <= m_d->numberOfSkins; offset++) {
- m_d->compositeFrame(keyframes, time, -offset, gcFrame, gcDest, \
backwardTintDevice, rect);
- m_d->compositeFrame(keyframes, time, offset, gcFrame, gcDest, \
forwardTintDevice, rect); + if (!keyframeBck.isNull()) {
+ keyframeBck = keyframes->previousKeyframe(keyframeBck);
+ m_d->compositeFrame(keyframes, keyframeBck, gcFrame, gcDest, \
backwardTintDevice, m_d->skinOpacity(-offset), rect); + }
+
+ if (!keyframeFwd.isNull()) {
+ keyframeFwd = keyframes->nextKeyframe(keyframeFwd);
+ m_d->compositeFrame(keyframes, keyframeFwd, gcFrame, gcDest, \
forwardTintDevice, m_d->skinOpacity(offset), rect); + }
}
}
diff --git a/krita/image/kis_raster_keyframe_channel.cpp \
b/krita/image/kis_raster_keyframe_channel.cpp index 69375c9..9bd0dc0 100644
--- a/krita/image/kis_raster_keyframe_channel.cpp
+++ b/krita/image/kis_raster_keyframe_channel.cpp
@@ -47,28 +47,13 @@ KisRasterKeyframeChannel::~KisRasterKeyframeChannel()
int KisRasterKeyframeChannel::frameIdAt(int time) const
{
- KisKeyframe *key = activeKeyframeAt(time);
+ KisKeyframeSP key = activeKeyframeAt(time);
return key->value();
}
-bool KisRasterKeyframeChannel::fetchFrame(KisPaintDeviceSP targetDevice, int time, \
int offset) +void KisRasterKeyframeChannel::fetchFrame(KisKeyframeSP keyframe, \
KisPaintDeviceSP targetDevice) {
- KeyframesMap::const_iterator i = activeKeyIterator(time);
-
- while (offset > 0 && i != constKeys().end()) {
- offset--;
- i++;
- }
- while (offset < 0 && i != constKeys().begin()) {
- offset++;
- i--;
- }
-
- if (offset != 0 || i == constKeys().end()) return false;
-
- m_d->paintDevice->framesInterface()->fetchFrame(i.value()->value(), \
targetDevice);
-
- return true;
+ m_d->paintDevice->framesInterface()->fetchFrame(keyframe->value(), \
targetDevice); }
QString KisRasterKeyframeChannel::frameFilename(int frameId) const
diff --git a/krita/image/kis_raster_keyframe_channel.h \
b/krita/image/kis_raster_keyframe_channel.h index 29ea726..f9d006e 100644
--- a/krita/image/kis_raster_keyframe_channel.h
+++ b/krita/image/kis_raster_keyframe_channel.h
@@ -45,7 +45,7 @@ public:
* @param time time to determine base keyframe
* @param offset number of keyframes to offset from base keyframe
*/
- bool fetchFrame(KisPaintDeviceSP targetDevice, int time, int offset);
+ void fetchFrame(KisKeyframeSP keyframe, KisPaintDeviceSP targetDevice);
QString frameFilename(int frameId) const;
diff --git a/krita/image/tests/kis_keyframing_test.cpp \
b/krita/image/tests/kis_keyframing_test.cpp index 9f03d4e..39dc6bb 100644
--- a/krita/image/tests/kis_keyframing_test.cpp
+++ b/krita/image/tests/kis_keyframing_test.cpp
@@ -304,7 +304,6 @@ void KisKeyframingTest::testRasterFrameFetching()
dev->setDefaultBounds(bounds);
KisRasterKeyframeChannel * channel = dev->createKeyframeChannel(KoID(), 0);
- bool ok;
channel->addKeyframe(0);
channel->addKeyframe(10);
@@ -324,36 +323,21 @@ void KisKeyframingTest::testRasterFrameFetching()
bounds->testingSetTime(10);
- ok = channel->fetchFrame(devTarget, 50, 0);
- QCOMPARE(ok, true);
- QImage fetched3 = devTarget->createThumbnail(50, 50);
+ KisKeyframeSP keyframe = channel->activeKeyframeAt(0);
+ channel->fetchFrame(keyframe, devTarget);
+ QImage fetched1 = devTarget->createThumbnail(50, 50);
- ok = channel->fetchFrame(devTarget, 50, -1);
- QCOMPARE(ok, true);
+ keyframe = channel->activeKeyframeAt(10);
+ channel->fetchFrame(keyframe, devTarget);
QImage fetched2 = devTarget->createThumbnail(50, 50);
- ok = channel->fetchFrame(devTarget, 50, -2);
- QCOMPARE(ok, true);
- QImage fetched1 = devTarget->createThumbnail(50, 50);
+ keyframe = channel->activeKeyframeAt(50);
+ channel->fetchFrame(keyframe, devTarget);
+ QImage fetched3 = devTarget->createThumbnail(50, 50);
QVERIFY(fetched1 == frame1);
QVERIFY(fetched2 == frame2);
QVERIFY(fetched3 == frame3);
-
- // Fetching frames before or after one exists
-
- devTarget->clear();
- QImage blank = devTarget->createThumbnail(50, 50);
-
- ok = channel->fetchFrame(devTarget, 50, -3);
- QCOMPARE(ok, false);
- QImage fetched4 = devTarget->createThumbnail(50, 50);
- QVERIFY(fetched4 == blank);
-
- ok = channel->fetchFrame(devTarget, 50, 1);
- QCOMPARE(ok, false);
- QImage fetched5 = devTarget->createThumbnail(50, 50);
- QVERIFY(fetched5 == blank);
}
void KisKeyframingTest::testAffectedFrames()
diff --git a/krita/image/tests/kis_paint_device_test.cpp \
b/krita/image/tests/kis_paint_device_test.cpp index 70788ca..81666eb 100644
--- a/krita/image/tests/kis_paint_device_test.cpp
+++ b/krita/image/tests/kis_paint_device_test.cpp
@@ -1606,7 +1606,7 @@ void KisPaintDeviceTest::testFramesLeaking()
QVERIFY(o.m_currentData == o.m_frames[1]);
QCOMPARE(o.m_frames.size(), 3);
- KisKeyframe *key;
+ KisKeyframe* key;
// deletion of frame 0 is forbidden
key = channel->keyframeAt(0);
@@ -1614,7 +1614,7 @@ void KisPaintDeviceTest::testFramesLeaking()
QVERIFY(!channel->deleteKeyframe(key));
// delete keyframe at position 11
- key = channel->activeKeyframeAt(11);
+ key = channel->activeKeyframeAt(11).data();
QVERIFY(key);
QCOMPARE(key->time(), 10);
QVERIFY(channel->deleteKeyframe(key));
@@ -1628,7 +1628,7 @@ void KisPaintDeviceTest::testFramesLeaking()
QCOMPARE(o.m_frames.size(), 2);
// deletion of frame 0 is forbidden
- key = channel->activeKeyframeAt(11);
+ key = channel->activeKeyframeAt(11).data();
QVERIFY(key);
QCOMPARE(key->time(), 0);
QVERIFY(!channel->deleteKeyframe(key));
@@ -1642,7 +1642,7 @@ void KisPaintDeviceTest::testFramesLeaking()
QCOMPARE(o.m_frames.size(), 2);
// delete keyframe at position 20
- key = channel->activeKeyframeAt(20);
+ key = channel->activeKeyframeAt(20).data();
QVERIFY(key);
QCOMPARE(key->time(), 20);
QVERIFY(channel->deleteKeyframe(key));
diff --git a/krita/plugins/extensions/dockers/animation/animation_docker.cpp \
b/krita/plugins/extensions/dockers/animation/animation_docker.cpp index \
89f3caa..cfa2795 100644
--- a/krita/plugins/extensions/dockers/animation/animation_docker.cpp
+++ b/krita/plugins/extensions/dockers/animation/animation_docker.cpp
@@ -164,8 +164,8 @@ void AnimationDocker::slotAddDuplicateFrame()
KUndo2Command *cmd = new KUndo2Command(kundo2_i18n("Add Keyframe"));
int time = m_canvas->image()->animationInterface()->currentTime();
- KisKeyframe *keyframe = rasterChannel->activeKeyframeAt(time);
- rasterChannel->copyKeyframe(keyframe, time, cmd);
+ KisKeyframeSP keyframe = rasterChannel->activeKeyframeAt(time);
+ rasterChannel->copyKeyframe(keyframe.data(), time, cmd);
m_canvas->image()->postExecutionUndoAdapter()->addCommand(toQShared(cmd));
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic