| 376 | } |
| 377 | |
| 378 | Frame 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 |
nothing calls this directly
no test coverage detected