Preserve per-layer document timelines

This commit is contained in:
2026-06-01 13:05:14 +02:00
parent c16cab87bd
commit 10e5d5b5ae
8 changed files with 182 additions and 35 deletions

View File

@@ -444,32 +444,29 @@ pp::foundation::Result<pp::document::CanvasDocument> document_from_ppi_index(
frames.push_back(pp::document::AnimationFrame { .duration_ms = frame.duration_ms });
}
std::vector<std::vector<pp::document::AnimationFrame>> layer_frames;
layer_frames.reserve(project.body.layers.size());
std::vector<pp::document::DocumentLayerConfig> layers;
layers.reserve(project.body.layers.size());
for (const auto& layer : project.body.layers) {
if (layer.frames.size() != reference_frames.size()) {
return pp::foundation::Result<pp::document::CanvasDocument>::failure(
pp::foundation::Status::invalid_argument("PPI per-layer frame counts are not representable yet"));
}
for (std::size_t frame_index = 0; frame_index < layer.frames.size(); ++frame_index) {
if (layer.frames[frame_index].duration_ms != reference_frames[frame_index].duration_ms) {
return pp::foundation::Result<pp::document::CanvasDocument>::failure(
pp::foundation::Status::invalid_argument("PPI per-layer frame durations are not representable yet"));
}
}
const auto blend_mode = ppi_layer_blend_mode(layer.blend_mode);
if (!blend_mode) {
return pp::foundation::Result<pp::document::CanvasDocument>::failure(blend_mode.status());
}
auto& frame_list = layer_frames.emplace_back();
frame_list.reserve(layer.frames.size());
for (const auto& frame : layer.frames) {
frame_list.push_back(pp::document::AnimationFrame { .duration_ms = frame.duration_ms });
}
layers.push_back(pp::document::DocumentLayerConfig {
.name = layer.name,
.visible = layer.visible,
.alpha_locked = layer.alpha_locked,
.opacity = layer.opacity,
.blend_mode = blend_mode.value(),
.frames = std::span<const pp::document::AnimationFrame>(frame_list.data(), frame_list.size()),
});
}
@@ -529,6 +526,21 @@ int load_project(int argc, char** argv)
}
std::cout << "\"" << json_escape(document.layers()[layer_index].name) << "\"";
}
std::cout << "],\"layerFrameCounts\":[";
for (std::size_t layer_index = 0; layer_index < document.layers().size(); ++layer_index) {
if (layer_index != 0U) {
std::cout << ",";
}
std::cout << document.layers()[layer_index].frames.size();
}
std::cout << "],\"layerDurationsMs\":[";
for (std::size_t layer_index = 0; layer_index < document.layers().size(); ++layer_index) {
if (layer_index != 0U) {
std::cout << ",";
}
const auto duration = document.layer_animation_duration_ms(layer_index);
std::cout << (duration ? duration.value() : 0U);
}
std::cout << "]}}\n";
return 0;
}