Add PPI layer metadata save automation

This commit is contained in:
2026-06-02 10:48:03 +02:00
parent 9c6b52eb8e
commit 1ab2a9b846
8 changed files with 197 additions and 21 deletions

View File

@@ -392,6 +392,7 @@ void creates_minimal_project_for_roundtrip_load(pp::tests::Harness& h)
.width = 256,
.height = 128,
.layer_name = "Roundtrip",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 333,
@@ -419,6 +420,12 @@ void creates_minimal_project_with_multiple_layers(pp::tests::Harness& h)
.width = 256,
.height = 128,
.layer_name = "Layer",
.layer_metadata = pp::assets::PpiLayerMetadataConfig {
.opacity = 0.625F,
.blend_mode = 4,
.alpha_locked = true,
.visible = false,
},
.layer_count = 2,
.frame_count = 2,
.frame_duration_ms = 111,
@@ -436,6 +443,14 @@ void creates_minimal_project_with_multiple_layers(pp::tests::Harness& h)
PP_EXPECT(h, index.value().body.layers[1].stored_order == 1U);
PP_EXPECT(h, index.value().body.layers[0].name == "Layer 1");
PP_EXPECT(h, index.value().body.layers[1].name == "Layer 2");
PP_EXPECT(h, index.value().body.layers[0].opacity == 0.625F);
PP_EXPECT(h, index.value().body.layers[1].opacity == 0.625F);
PP_EXPECT(h, index.value().body.layers[0].blend_mode == 4U);
PP_EXPECT(h, index.value().body.layers[1].blend_mode == 4U);
PP_EXPECT(h, index.value().body.layers[0].alpha_locked);
PP_EXPECT(h, index.value().body.layers[1].alpha_locked);
PP_EXPECT(h, !index.value().body.layers[0].visible);
PP_EXPECT(h, !index.value().body.layers[1].visible);
PP_EXPECT(h, index.value().body.layers[0].frames.size() == 2U);
PP_EXPECT(h, index.value().body.layers[1].frames.size() == 2U);
PP_EXPECT(h, index.value().body.layers[0].frames[1].duration_ms == 111U);
@@ -448,6 +463,7 @@ void creates_minimal_project_with_multiple_frames(pp::tests::Harness& h)
.width = 256,
.height = 128,
.layer_name = "Frames",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 3,
.frame_duration_ms = 111,
@@ -482,6 +498,7 @@ void creates_minimal_project_with_dirty_face_payload(pp::tests::Harness& h)
.width = 256,
.height = 128,
.layer_name = "Payload",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 333,
@@ -528,6 +545,7 @@ void rejects_invalid_minimal_project_writer_inputs(pp::tests::Harness& h)
.width = 0,
.height = 128,
.layer_name = "Ink",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 100,
@@ -537,6 +555,7 @@ void rejects_invalid_minimal_project_writer_inputs(pp::tests::Harness& h)
.width = 128,
.height = 128,
.layer_name = "",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 100,
@@ -546,6 +565,7 @@ void rejects_invalid_minimal_project_writer_inputs(pp::tests::Harness& h)
.width = 128,
.height = 128,
.layer_name = "Ink",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 0,
@@ -555,6 +575,7 @@ void rejects_invalid_minimal_project_writer_inputs(pp::tests::Harness& h)
.width = 128,
.height = 128,
.layer_name = "Ink",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 0,
.frame_duration_ms = 100,
@@ -564,15 +585,41 @@ void rejects_invalid_minimal_project_writer_inputs(pp::tests::Harness& h)
.width = 128,
.height = 128,
.layer_name = "Ink",
.layer_metadata = {},
.layer_count = 0,
.frame_count = 1,
.frame_duration_ms = 100,
.dirty_faces = {},
});
const auto bad_opacity = create_minimal_ppi_project(pp::assets::PpiMinimalProjectConfig {
.width = 128,
.height = 128,
.layer_name = "Ink",
.layer_metadata = pp::assets::PpiLayerMetadataConfig {
.opacity = 1.25F,
},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 100,
.dirty_faces = {},
});
const auto bad_blend_mode = create_minimal_ppi_project(pp::assets::PpiMinimalProjectConfig {
.width = 128,
.height = 128,
.layer_name = "Ink",
.layer_metadata = pp::assets::PpiLayerMetadataConfig {
.blend_mode = 99,
},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 100,
.dirty_faces = {},
});
const auto duplicate_dirty_face = create_minimal_ppi_project(pp::assets::PpiMinimalProjectConfig {
.width = 128,
.height = 128,
.layer_name = "Ink",
.layer_metadata = {},
.layer_count = 1,
.frame_count = 1,
.frame_duration_ms = 100,
@@ -589,6 +636,10 @@ void rejects_invalid_minimal_project_writer_inputs(pp::tests::Harness& h)
PP_EXPECT(h, no_frames.status().code == StatusCode::out_of_range);
PP_EXPECT(h, !no_layers.ok());
PP_EXPECT(h, no_layers.status().code == StatusCode::out_of_range);
PP_EXPECT(h, !bad_opacity.ok());
PP_EXPECT(h, bad_opacity.status().code == StatusCode::out_of_range);
PP_EXPECT(h, !bad_blend_mode.ok());
PP_EXPECT(h, bad_blend_mode.status().code == StatusCode::out_of_range);
PP_EXPECT(h, !duplicate_dirty_face.ok());
PP_EXPECT(h, duplicate_dirty_face.status().code == StatusCode::invalid_argument);
}

View File

@@ -16,6 +16,10 @@ execute_process(
--width 96
--height 48
--layer-name Roundtrip
--layer-opacity 0.625
--blend-mode 4
--alpha-locked
--hidden
--layers 2
--frames 3
--frame-duration-ms 321
@@ -31,7 +35,18 @@ string(FIND "${save_output}" "\"command\":\"save-project\"" save_command_index)
string(FIND "${save_output}" "\"bytes\":65830" save_bytes_index)
string(FIND "${save_output}" "\"layers\":2" save_layers_index)
string(FIND "${save_output}" "\"frames\":3" save_frames_index)
if(save_command_index LESS 0 OR save_bytes_index LESS 0 OR save_layers_index LESS 0 OR save_frames_index LESS 0)
string(FIND "${save_output}" "\"layerOpacity\":0.625" save_opacity_index)
string(FIND "${save_output}" "\"blendMode\":4" save_blend_index)
string(FIND "${save_output}" "\"alphaLocked\":true" save_alpha_index)
string(FIND "${save_output}" "\"visible\":false" save_visible_index)
if(save_command_index LESS 0
OR save_bytes_index LESS 0
OR save_layers_index LESS 0
OR save_frames_index LESS 0
OR save_opacity_index LESS 0
OR save_blend_index LESS 0
OR save_alpha_index LESS 0
OR save_visible_index LESS 0)
message(FATAL_ERROR "save-project output did not contain expected summary: ${save_output}")
endif()
@@ -58,6 +73,10 @@ string(FIND "${load_output}" "\"animationDurationMs\":963" load_duration_index)
string(FIND "${load_output}" "\"layerNames\":[\"Roundtrip 1\",\"Roundtrip 2\"]" load_layer_index)
string(FIND "${load_output}" "\"layerFrameCounts\":[3,3]" load_layer_frames_index)
string(FIND "${load_output}" "\"layerDurationsMs\":[963,963]" load_layer_durations_index)
string(FIND "${load_output}" "\"layerOpacities\":[0.625,0.625]" load_layer_opacity_index)
string(FIND "${load_output}" "\"layerBlendModes\":[\"overlay\",\"overlay\"]" load_layer_blend_index)
string(FIND "${load_output}" "\"layerAlphaLocked\":[true,true]" load_layer_alpha_index)
string(FIND "${load_output}" "\"layerVisible\":[false,false]" load_layer_visible_index)
if(load_command_index LESS 0
OR load_width_index LESS 0
OR load_height_index LESS 0
@@ -66,6 +85,10 @@ if(load_command_index LESS 0
OR load_duration_index LESS 0
OR load_layer_index LESS 0
OR load_layer_frames_index LESS 0
OR load_layer_durations_index LESS 0)
OR load_layer_durations_index LESS 0
OR load_layer_opacity_index LESS 0
OR load_layer_blend_index LESS 0
OR load_layer_alpha_index LESS 0
OR load_layer_visible_index LESS 0)
message(FATAL_ERROR "load-project output did not contain expected round-trip summary: ${load_output}")
endif()