245{
246 QRect rect;
247
248 std::vector<int> skinsBefore;
249 std::vector<int> skinsAfter;
250
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) {
260 do {
262 } while (keyframe && startTime == ignoredFrame);
263
265 skins.push_back(startTime);
266 }
267 };
268
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
291
292
293
294 for (auto it = changedSkins.begin(); it != changedSkins.end(); ++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)
int skinOpacity(int offset)
KisRasterKeyframeSP getNextFrameToComposite(KisKeyframeChannel *channel, int &outFrame, bool backwards)