MCPcopy Create free account
hub / github.com/Tencent/libpag / ScaleTimeRemap

Method ScaleTimeRemap

src/rendering/layers/PAGImageLayer.cpp:378–434  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

376}
377
378Frame PAGImageLayer::ScaleTimeRemap(AnimatableProperty<float>* property,
379 const TimeRange& visibleRange, double frameScale,
380 Frame fileEndFrame) {
381 float minValue = FLT_MAX;
382 float maxValue = 0;
383 auto& keyframes = property->keyframes;
384 for (int i = static_cast<int>(keyframes.size() - 1); i >= 0; i--) {
385 auto& keyframe = keyframes[i];
386 keyframe->startTime =
387 visibleRange.start + static_cast<Frame>(round(keyframe->startTime * frameScale));
388 auto duration = keyframe->endTime - keyframe->startTime + 1;
389 // 由于是闭区间,计算完后需要-1
390 keyframe->endTime = visibleRange.start +
391 static_cast<Frame>(round((keyframe->startTime + duration) * frameScale)) -
392 1;
393 keyframe->startValue = static_cast<Frame>(round(keyframe->startValue * frameScale));
394 auto valueLength = keyframe->endValue - keyframe->startValue + 1;
395 // 由于是闭区间,计算完后需要-1
396 keyframe->endValue =
397 static_cast<Frame>(round((keyframe->startValue + valueLength) * frameScale)) - 1;
398 // 由于startTime和endTime都是帧号,因此当startTime == fileEndFrame 和 endTime == 0都有意义
399 if (keyframe->startTime > fileEndFrame) {
400 delete keyframe;
401 keyframes.erase(keyframes.begin() + i);
402 continue;
403 }
404 if (keyframe->endTime < 0) {
405 delete keyframe;
406 keyframes.erase(keyframes.begin() + i);
407 continue;
408 }
409 if (keyframe->endTime > fileEndFrame) {
410 CutKeyframe(keyframe, fileEndFrame, false);
411 }
412 if (keyframe->startTime < 0) {
413 CutKeyframe(keyframe, 0, true);
414 }
415 minValue = std::round(std::min(keyframe->startValue, minValue));
416 minValue = std::round(std::min(keyframe->endValue, minValue));
417 maxValue = std::round(std::max(keyframe->startValue, maxValue));
418 maxValue = std::round(std::max(keyframe->endValue, maxValue));
419 }
420 for (auto& keyframe : keyframes) {
421 keyframe->startValue -= minValue;
422 keyframe->endValue -= minValue;
423 }
424 // 当keyframes所有的区间都在File的显示区间之外时,补一个keyFrame,防止后续计算错误。
425 if (keyframes.size() == 0) {
426 auto newKeyframe = CreateKeyframe(visibleRange.start, visibleRange.end, 0,
427 visibleRange.end - visibleRange.start);
428 keyframes.push_back(newKeyframe);
429 newKeyframe->initialize();
430 maxValue = visibleRange.end - visibleRange.start;
431 minValue = 0;
432 }
433 return (maxValue - minValue + 1);
434}
435

Callers

nothing calls this directly

Calls 5

CutKeyframeFunction · 0.85
CreateKeyframeFunction · 0.85
sizeMethod · 0.80
push_backMethod · 0.80
initializeMethod · 0.45

Tested by

no test coverage detected