Add document frame render automation

This commit is contained in:
2026-06-05 17:30:44 +02:00
parent d4dad133ea
commit 7c6c5f3e36
9 changed files with 354 additions and 12 deletions

View File

@@ -288,6 +288,45 @@ pp::foundation::Result<DocumentFaceCompositeResult> composite_document_face(
return pp::foundation::Result<DocumentFaceCompositeResult>::success(std::move(result));
}
pp::foundation::Result<DocumentFrameCompositeResult> composite_document_frame(
DocumentFrameCompositeRequest request)
{
if (request.document == nullptr) {
return pp::foundation::Result<DocumentFrameCompositeResult>::failure(
pp::foundation::Status::invalid_argument("document frame composite request requires a document"));
}
if (request.frame_index >= request.document->frames().size()) {
return pp::foundation::Result<DocumentFrameCompositeResult>::failure(
pp::foundation::Status::out_of_range("document frame composite index is outside the document"));
}
DocumentFrameCompositeResult result;
result.extent = pp::renderer::Extent2D {
.width = request.document->width(),
.height = request.document->height(),
};
result.visited_layer_count = request.document->layers().size();
for (std::uint32_t face_index = 0; face_index < pp::document::cube_face_count; ++face_index) {
auto face = composite_document_face(DocumentFaceCompositeRequest {
.document = request.document,
.frame_index = request.frame_index,
.face_index = face_index,
.clear_color = request.clear_color,
});
if (!face) {
return pp::foundation::Result<DocumentFrameCompositeResult>::failure(face.status());
}
result.composited_layer_face_count += face.value().composited_layer_count;
result.face_payload_count += face.value().face_payload_count;
result.faces[face_index] = std::move(face.value());
}
return pp::foundation::Result<DocumentFrameCompositeResult>::success(std::move(result));
}
bool stroke_composite_requires_feedback(
pp::paint::BlendMode layer_blend_mode,
pp::paint::StrokeBlendMode stroke_blend_mode,

View File

@@ -5,6 +5,7 @@
#include "paint/blend.h"
#include "renderer_api/renderer_api.h"
#include <array>
#include <cstddef>
#include <cstdint>
#include <span>
@@ -101,6 +102,20 @@ struct DocumentFaceCompositeResult {
std::size_t face_payload_count = 0;
};
struct DocumentFrameCompositeRequest {
const pp::document::CanvasDocument* document = nullptr;
std::size_t frame_index = 0;
pp::paint::Rgba clear_color {};
};
struct DocumentFrameCompositeResult {
pp::renderer::Extent2D extent {};
std::array<DocumentFaceCompositeResult, pp::document::cube_face_count> faces {};
std::size_t visited_layer_count = 0;
std::size_t composited_layer_face_count = 0;
std::size_t face_payload_count = 0;
};
[[nodiscard]] pp::foundation::Status composite_layer(
std::span<pp::paint::Rgba> destination,
pp::renderer::Extent2D extent,
@@ -109,6 +124,9 @@ struct DocumentFaceCompositeResult {
[[nodiscard]] pp::foundation::Result<DocumentFaceCompositeResult> composite_document_face(
DocumentFaceCompositeRequest request);
[[nodiscard]] pp::foundation::Result<DocumentFrameCompositeResult> composite_document_frame(
DocumentFrameCompositeRequest request);
[[nodiscard]] bool stroke_composite_requires_feedback(
pp::paint::BlendMode layer_blend_mode,
pp::paint::StrokeBlendMode stroke_blend_mode,