Route live save snapshots through PPI policy

This commit is contained in:
2026-06-06 11:43:50 +02:00
parent 772dc7332b
commit 9d9b93abb1
8 changed files with 148 additions and 23 deletions

View File

@@ -78,6 +78,19 @@ struct DocumentCanvasSaveSnapshotReport {
bool can_export_ppi = false;
};
enum class DocumentCanvasSaveWriterAction {
use_document_ppi_writer,
use_legacy_project_save,
};
struct DocumentCanvasSaveWriterRoutePlan {
DocumentCanvasSaveWriterAction action = DocumentCanvasSaveWriterAction::use_legacy_project_save;
bool payload_complete = false;
bool can_export_ppi = false;
bool uses_document_ppi_writer = false;
std::string_view fallback_reason;
};
struct DocumentCanvasPpiExportResult {
DocumentCanvasSaveSnapshotReport report;
std::vector<std::byte> bytes;
@@ -248,14 +261,31 @@ public:
};
}
[[nodiscard]] constexpr DocumentCanvasSaveWriterRoutePlan plan_document_canvas_save_writer_route(
DocumentCanvasSaveSnapshotReport report) noexcept
{
DocumentCanvasSaveWriterRoutePlan plan;
plan.payload_complete = report.payload_complete;
plan.can_export_ppi = report.can_export_ppi;
if (!report.payload_complete || !report.can_export_ppi) {
plan.fallback_reason = "canvas document snapshot still requires renderer payload readback";
return plan;
}
plan.action = DocumentCanvasSaveWriterAction::use_document_ppi_writer;
plan.uses_document_ppi_writer = true;
return plan;
}
[[nodiscard]] inline pp::foundation::Result<DocumentCanvasPpiExportResult>
export_document_canvas_save_snapshot_to_ppi(const DocumentCanvasSnapshotResult& snapshot)
{
const auto report = make_document_canvas_save_snapshot_report(snapshot);
if (!report.can_export_ppi) {
const auto route = plan_document_canvas_save_writer_route(report);
if (!route.uses_document_ppi_writer) {
return pp::foundation::Result<DocumentCanvasPpiExportResult>::failure(
pp::foundation::Status::invalid_argument(
"canvas document snapshot still requires renderer payload readback"));
pp::foundation::Status::invalid_argument(route.fallback_reason.data()));
}
auto bytes = pp::document::export_ppi_project_document(snapshot.document);