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

@@ -36,6 +36,7 @@ struct SaveProjectArgs {
std::uint32_t width = 0;
std::uint32_t height = 0;
std::string layer_name = "Ink";
std::uint32_t frames = 1;
std::uint32_t frame_duration_ms = 100;
bool include_test_face_payload = false;
};
@@ -177,7 +178,7 @@ void print_help()
<< " load-project --path FILE\n"
<< " parse-layout --path FILE\n"
<< " record-render [--width N] [--height N]\n"
<< " save-project --path FILE --width N --height N [--layer-name NAME] [--frame-duration-ms N] [--include-test-face-payload]\n"
<< " save-project --path FILE --width N --height N [--layer-name NAME] [--frames N] [--frame-duration-ms N] [--include-test-face-payload]\n"
<< " simulate-document-edits [--width N] [--height N]\n"
<< " simulate-document-history [--width N] [--height N] [--history N]\n"
<< " simulate-image-import [--width N] [--height N]\n"
@@ -297,7 +298,7 @@ pp::foundation::Status parse_save_project_args(int argc, char** argv, SaveProjec
} else {
args.layer_name = argv[++i];
}
} else if (key == "--width" || key == "--height" || key == "--frame-duration-ms") {
} else if (key == "--width" || key == "--height" || key == "--frames" || key == "--frame-duration-ms") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
@@ -311,6 +312,8 @@ pp::foundation::Status parse_save_project_args(int argc, char** argv, SaveProjec
args.width = value.value();
} else if (key == "--height") {
args.height = value.value();
} else if (key == "--frames") {
args.frames = value.value();
} else {
args.frame_duration_ms = value.value();
}
@@ -333,6 +336,10 @@ pp::foundation::Status parse_save_project_args(int argc, char** argv, SaveProjec
return pp::foundation::Status::invalid_argument("layer name must not be empty");
}
if (args.frames == 0) {
return pp::foundation::Status::invalid_argument("frame count must be greater than zero");
}
if (args.frame_duration_ms == 0) {
return pp::foundation::Status::invalid_argument("frame duration must be greater than zero");
}
@@ -364,6 +371,7 @@ int save_project(int argc, char** argv)
.width = args.width,
.height = args.height,
.layer_name = args.layer_name,
.frame_count = args.frames,
.frame_duration_ms = args.frame_duration_ms,
.dirty_faces = args.include_test_face_payload
? std::span<const pp::assets::PpiDirtyFacePayloadConfig>(dirty_faces, 1)
@@ -394,7 +402,7 @@ int save_project(int argc, char** argv)
<< ",\"document\":{\"width\":" << args.width
<< ",\"height\":" << args.height
<< ",\"layers\":1"
<< ",\"frames\":1"
<< ",\"frames\":" << args.frames
<< ",\"layerName\":\"" << json_escape(args.layer_name) << "\""
<< ",\"frameDurationMs\":" << args.frame_duration_ms
<< ",\"facePayloads\":" << (args.include_test_face_payload ? 1 : 0)