Add multi-frame PPI save automation

This commit is contained in:
2026-06-02 10:25:30 +02:00
parent a8faa82b70
commit 4e70c90ca8
9 changed files with 112 additions and 39 deletions

View File

@@ -659,6 +659,11 @@ pp::foundation::Result<std::vector<std::byte>> create_minimal_ppi_project(PpiMin
pp::foundation::Status::invalid_argument("PPI frame duration must be greater than zero"));
}
if (config.frame_count == 0 || config.frame_count > max_ppi_frame_count) {
return pp::foundation::Result<std::vector<std::byte>>::failure(
pp::foundation::Status::out_of_range("PPI frame count is outside the configured range"));
}
bool seen_faces[6] {};
std::uint64_t total_payload_bytes = 0;
for (const auto& face : config.dirty_faces) {
@@ -729,7 +734,7 @@ pp::foundation::Result<std::vector<std::byte>> create_minimal_ppi_project(PpiMin
append_u32(bytes, config.width);
append_u32(bytes, config.height);
append_u32(bytes, 1);
append_u32(bytes, 1);
append_u32(bytes, config.frame_count);
append_u32(bytes, 0);
append_f32(bytes, 1.0F);
append_u32(bytes, static_cast<std::uint32_t>(config.layer_name.size()));
@@ -737,29 +742,33 @@ pp::foundation::Result<std::vector<std::byte>> create_minimal_ppi_project(PpiMin
append_u32(bytes, 0);
bytes.push_back(std::byte { 0 });
bytes.push_back(std::byte { 1 });
append_u32(bytes, 1);
append_u32(bytes, config.frame_duration_ms);
for (std::uint32_t face = 0; face < 6U; ++face) {
const PpiDirtyFacePayloadConfig* dirty_face = nullptr;
for (const auto& candidate : config.dirty_faces) {
if (candidate.face_index == face) {
dirty_face = &candidate;
break;
append_u32(bytes, config.frame_count);
for (std::uint32_t frame = 0; frame < config.frame_count; ++frame) {
append_u32(bytes, config.frame_duration_ms);
for (std::uint32_t face = 0; face < 6U; ++face) {
const PpiDirtyFacePayloadConfig* dirty_face = nullptr;
if (frame == 0U) {
for (const auto& candidate : config.dirty_faces) {
if (candidate.face_index == face) {
dirty_face = &candidate;
break;
}
}
}
}
if (dirty_face == nullptr) {
append_u32(bytes, 0);
continue;
}
if (dirty_face == nullptr) {
append_u32(bytes, 0);
continue;
}
append_u32(bytes, 1);
append_u32(bytes, dirty_face->x);
append_u32(bytes, dirty_face->y);
append_u32(bytes, dirty_face->x + dirty_face->width);
append_u32(bytes, dirty_face->y + dirty_face->height);
append_u32(bytes, static_cast<std::uint32_t>(dirty_face->png_rgba8.size()));
bytes.insert(bytes.end(), dirty_face->png_rgba8.begin(), dirty_face->png_rgba8.end());
append_u32(bytes, 1);
append_u32(bytes, dirty_face->x);
append_u32(bytes, dirty_face->y);
append_u32(bytes, dirty_face->x + dirty_face->width);
append_u32(bytes, dirty_face->y + dirty_face->height);
append_u32(bytes, static_cast<std::uint32_t>(dirty_face->png_rgba8.size()));
bytes.insert(bytes.end(), dirty_face->png_rgba8.begin(), dirty_face->png_rgba8.end());
}
}
append_u32(bytes, 0);