Attach captured canvas payloads to document snapshots

This commit is contained in:
2026-06-05 18:03:33 +02:00
parent d0412e3bf9
commit f4f6eb903e
10 changed files with 298 additions and 23 deletions

View File

@@ -119,6 +119,56 @@ void snapshot_plan_defaults_empty_names_and_frames(pp::tests::Harness& harness)
PP_EXPECT(harness, result.value().document.frames()[0].duration_ms == 100U);
}
void snapshot_plan_attaches_captured_face_payloads(pp::tests::Harness& harness)
{
const std::uint32_t frames[] { 100U };
const std::uint8_t rgba[] {
255U, 0U, 0U, 255U,
0U, 255U, 0U, 255U,
};
const pp::app::DocumentCanvasFacePayloadInput payloads[] {
{
.frame_index = 0U,
.face_index = 2U,
.x = 3U,
.y = 4U,
.width = 2U,
.height = 1U,
.rgba8 = std::span<const std::uint8_t>(rgba),
},
};
const pp::app::DocumentCanvasLayerSnapshotInput layers[] {
{
.name = "Paint",
.frame_durations_ms = std::span<const std::uint32_t>(frames),
.pending_face_payloads = 1U,
.captured_face_payloads = std::span<const pp::app::DocumentCanvasFacePayloadInput>(payloads),
},
};
const auto result = pp::app::plan_document_canvas_snapshot(pp::app::DocumentCanvasSnapshotInput {
.has_canvas = true,
.width = 16U,
.height = 8U,
.layers = std::span<const pp::app::DocumentCanvasLayerSnapshotInput>(layers),
});
PP_EXPECT(harness, result);
if (!result) {
return;
}
PP_EXPECT(harness, result.value().pending_face_payloads == 1U);
PP_EXPECT(harness, result.value().captured_face_payloads == 1U);
PP_EXPECT(harness, !result.value().metadata_only);
PP_EXPECT(harness, !result.value().requires_renderer_payload_readback);
PP_EXPECT(harness, result.value().document.face_pixel_payload_count() == 1U);
PP_EXPECT(harness, result.value().document.layers()[0].frames[0].face_pixels[0].face_index == 2U);
PP_EXPECT(harness, result.value().document.layers()[0].frames[0].face_pixels[0].x == 3U);
PP_EXPECT(harness, result.value().document.layers()[0].frames[0].face_pixels[0].rgba8[4] == 0U);
PP_EXPECT(harness, result.value().document.layers()[0].frames[0].face_pixels[0].rgba8[5] == 255U);
}
void snapshot_plan_rejects_invalid_canvas_state(pp::tests::Harness& harness)
{
const std::uint32_t frames[] { 100U };
@@ -168,11 +218,38 @@ void snapshot_plan_rejects_invalid_canvas_state(pp::tests::Harness& harness)
.height = 8U,
.layers = std::span<const pp::app::DocumentCanvasLayerSnapshotInput>(bad_duration_layers),
});
const std::uint8_t bad_rgba[] { 1U, 2U, 3U };
const pp::app::DocumentCanvasFacePayloadInput bad_payloads[] {
{
.frame_index = 0U,
.face_index = 0U,
.x = 0U,
.y = 0U,
.width = 1U,
.height = 1U,
.rgba8 = std::span<const std::uint8_t>(bad_rgba),
},
};
const pp::app::DocumentCanvasLayerSnapshotInput bad_payload_layers[] {
{
.name = "Layer",
.frame_durations_ms = std::span<const std::uint32_t>(frames),
.pending_face_payloads = 1U,
.captured_face_payloads = std::span<const pp::app::DocumentCanvasFacePayloadInput>(bad_payloads),
},
};
const auto bad_payload = pp::app::plan_document_canvas_snapshot(pp::app::DocumentCanvasSnapshotInput {
.has_canvas = true,
.width = 16U,
.height = 8U,
.layers = std::span<const pp::app::DocumentCanvasLayerSnapshotInput>(bad_payload_layers),
});
PP_EXPECT(harness, !no_canvas);
PP_EXPECT(harness, !bad_layer);
PP_EXPECT(harness, !bad_blend);
PP_EXPECT(harness, !bad_duration);
PP_EXPECT(harness, !bad_payload);
}
void clear_plan_records_legacy_canvas_effects(pp::tests::Harness& harness)
@@ -270,6 +347,7 @@ int main()
pp::tests::Harness harness;
harness.run("snapshot plan projects canvas metadata", snapshot_plan_projects_canvas_metadata);
harness.run("snapshot plan defaults empty names and frames", snapshot_plan_defaults_empty_names_and_frames);
harness.run("snapshot plan attaches captured face payloads", snapshot_plan_attaches_captured_face_payloads);
harness.run("snapshot plan rejects invalid canvas state", snapshot_plan_rejects_invalid_canvas_state);
harness.run("clear plan records legacy canvas effects", clear_plan_records_legacy_canvas_effects);
harness.run("clear plan noops without canvas", clear_plan_noops_without_canvas);