[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