Route onion frame planning through app core

This commit is contained in:
2026-06-05 00:19:12 +02:00
parent 2feeffd6c8
commit 59210c28ea
6 changed files with 132 additions and 16 deletions

View File

@@ -62,6 +62,14 @@ struct DocumentAnimationOperationPlan {
bool resets_playback_timer = false;
};
struct DocumentAnimationOnionFrameRange {
int frame_count = 1;
int current_frame = 0;
int onion_size = 0;
int first_frame = 0;
int last_frame = 0;
};
class DocumentAnimationServices {
public:
virtual ~DocumentAnimationServices() = default;
@@ -122,6 +130,56 @@ public:
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Result<DocumentAnimationOnionFrameRange> plan_animation_onion_frame_range(
int frame_count,
int current_frame,
int onion_size)
{
const auto index_status = validate_animation_frame_index(frame_count, current_frame);
if (!index_status.ok()) {
return pp::foundation::Result<DocumentAnimationOnionFrameRange>::failure(index_status);
}
if (onion_size < 0) {
return pp::foundation::Result<DocumentAnimationOnionFrameRange>::failure(
pp::foundation::Status::invalid_argument("animation onion size must not be negative"));
}
const auto first = std::max<std::int64_t>(
static_cast<std::int64_t>(current_frame) - static_cast<std::int64_t>(onion_size),
0);
const auto last = std::min<std::int64_t>(
static_cast<std::int64_t>(current_frame) + static_cast<std::int64_t>(onion_size),
static_cast<std::int64_t>(frame_count) - 1);
return pp::foundation::Result<DocumentAnimationOnionFrameRange>::success(
DocumentAnimationOnionFrameRange {
.frame_count = frame_count,
.current_frame = current_frame,
.onion_size = onion_size,
.first_frame = static_cast<int>(first),
.last_frame = static_cast<int>(last),
});
}
[[nodiscard]] inline float animation_onion_frame_alpha(
const DocumentAnimationOnionFrameRange& range,
int frame) noexcept
{
if (frame < range.first_frame || frame > range.last_frame) {
return 0.0f;
}
const int distance = frame >= range.current_frame
? frame - range.current_frame
: range.current_frame - frame;
if (distance > range.onion_size) {
return 0.0f;
}
return 1.0f - static_cast<float>(distance) / static_cast<float>(range.onion_size + 1);
}
[[nodiscard]] inline pp::foundation::Result<DocumentAnimationOperationPlan> plan_animation_add_frame(
int frame_count,
int current_frame)