Add document selection mask automation

This commit is contained in:
2026-06-02 10:55:12 +02:00
parent 1ab2a9b846
commit ddca24779e
9 changed files with 304 additions and 20 deletions

View File

@@ -20,6 +20,7 @@ constexpr std::size_t max_document_history_entries = 10000;
constexpr std::size_t max_layer_name_length = 128;
constexpr std::uint32_t cube_face_count = 6;
constexpr std::uint32_t rgba8_components = 4;
constexpr std::uint32_t alpha8_components = 1;
constexpr std::uint64_t max_face_pixel_payload_bytes = 1024ULL * 1024ULL * 1024ULL;
struct DocumentConfig {
@@ -37,6 +38,15 @@ struct LayerFacePixels {
std::vector<std::uint8_t> rgba8;
};
struct SelectionMask {
std::uint32_t face_index = 0;
std::uint32_t x = 0;
std::uint32_t y = 0;
std::uint32_t width = 0;
std::uint32_t height = 0;
std::vector<std::uint8_t> alpha8;
};
struct AnimationFrame {
std::uint32_t duration_ms = 100;
std::vector<LayerFacePixels> face_pixels;
@@ -65,6 +75,7 @@ struct DocumentSnapshotConfig {
std::uint32_t height = 0;
std::span<const DocumentLayerConfig> layers;
std::span<const AnimationFrame> frames;
std::span<const SelectionMask> selection_masks;
};
class CanvasDocument {
@@ -79,8 +90,10 @@ public:
[[nodiscard]] std::uint64_t animation_duration_ms() const noexcept;
[[nodiscard]] pp::foundation::Result<std::uint64_t> layer_animation_duration_ms(std::size_t index) const noexcept;
[[nodiscard]] std::size_t face_pixel_payload_count() const noexcept;
[[nodiscard]] std::size_t selection_mask_payload_count() const noexcept;
[[nodiscard]] std::span<const Layer> layers() const noexcept;
[[nodiscard]] std::span<const AnimationFrame> frames() const noexcept;
[[nodiscard]] std::span<const SelectionMask> selection_masks() const noexcept;
[[nodiscard]] pp::foundation::Result<std::size_t> add_layer(std::string_view name);
[[nodiscard]] pp::foundation::Status remove_layer(std::size_t index);
@@ -102,6 +115,8 @@ public:
std::size_t layer_index,
std::size_t frame_index,
LayerFacePixels pixels);
[[nodiscard]] pp::foundation::Status set_selection_mask(SelectionMask mask);
[[nodiscard]] pp::foundation::Status clear_selection_mask(std::uint32_t face_index) noexcept;
private:
std::uint32_t width_ = 0;
@@ -110,6 +125,7 @@ private:
std::size_t active_frame_index_ = 0;
std::vector<Layer> layers_;
std::vector<AnimationFrame> frames_;
std::vector<SelectionMask> selection_masks_;
};
class DocumentHistory {