Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
headless_surface.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <cstdint>
7#include <functional>
8#include <memory>
9#include <string>
10#include <vector>
11
12namespace pulp::canvas { class Canvas; }
13
14namespace pulp::render {
15
41public:
42 struct Config {
43 uint32_t width = 800;
44 uint32_t height = 600;
46 float scale_factor = 1.0f;
51 uint8_t clear_r = 0;
52 uint8_t clear_g = 0;
53 uint8_t clear_b = 0;
54 uint8_t clear_a = 255;
57 };
58
59 struct Rgba {
60 std::vector<uint8_t> pixels;
61 uint32_t width = 0;
62 uint32_t height = 0;
63
64 bool empty() const { return pixels.empty() || width == 0 || height == 0; }
65 size_t pixel_count() const { return static_cast<size_t>(width) * height; }
66 };
67
71 using PaintFn = std::function<void(canvas::Canvas&)>;
72
77 static std::unique_ptr<HeadlessSurface> create(
78 const Config& config,
79 std::string* last_error_out = nullptr);
80
81 virtual ~HeadlessSurface() = default;
82
86 virtual bool is_ready() const = 0;
87
92 virtual Rgba render_rgba(const PaintFn& paint) = 0;
93
96 virtual std::vector<uint8_t> render_png(const PaintFn& paint) = 0;
97
99 virtual std::string last_error() const = 0;
100
106 static std::vector<uint8_t> encode_png(const Rgba& rgba,
107 std::string* error_out = nullptr);
108
113 static uint64_t rgba_fingerprint(const Rgba& rgba);
114};
115
116} // namespace pulp::render
Definition canvas.hpp:240
One-call wrapper for the existing offscreen Dawn + Skia path (GpuSurface::create_dawn() + native_surf...
Definition headless_surface.hpp:40
virtual ~HeadlessSurface()=default
std::function< void(canvas::Canvas &)> PaintFn
Caller-supplied paint callback.
Definition headless_surface.hpp:71
virtual bool is_ready() const =0
True when the underlying GpuSurface + SkiaSurface are live and ready to accept paint callbacks.
virtual Rgba render_rgba(const PaintFn &paint)=0
Run one offscreen frame: begin_frame → fill → user paint → read pixels → end_frame.
static uint64_t rgba_fingerprint(const Rgba &rgba)
Cheap deterministic fingerprint of an RGBA buffer — FNV-1a 64.
virtual std::vector< uint8_t > render_png(const PaintFn &paint)=0
Convenience: render and PNG-encode in one call.
virtual std::string last_error() const =0
Last error message recorded by the wrapper. Empty when no error.
static std::vector< uint8_t > encode_png(const Rgba &rgba, std::string *error_out=nullptr)
PNG-encode an already-captured RGBA buffer.
static std::unique_ptr< HeadlessSurface > create(const Config &config, std::string *last_error_out=nullptr)
Create a headless offscreen surface, or nullptr if Skia/Dawn aren't available or the underlying GpuSu...
Definition affine_transform.hpp:24
TextRasterPolicy
Glyph preblend a surface is created with.
Definition text_raster_policy.hpp:33
@ legacy
Definition text_raster_policy.hpp:34
Definition gpu_fwd.hpp:31
Definition headless_surface.hpp:42
uint32_t width
Definition headless_surface.hpp:43
uint8_t clear_g
Definition headless_surface.hpp:52
canvas::TextRasterPolicy text_raster_policy
Glyph preblend handed to SkiaSurface::Config.
Definition headless_surface.hpp:56
uint8_t clear_r
Background fill applied before the user paint callback runs.
Definition headless_surface.hpp:51
uint32_t height
Definition headless_surface.hpp:44
uint8_t clear_a
Definition headless_surface.hpp:54
float scale_factor
HiDPI scale factor handed to SkiaSurface::Config.
Definition headless_surface.hpp:46
uint8_t clear_b
Definition headless_surface.hpp:53
Definition headless_surface.hpp:59
bool empty() const
Definition headless_surface.hpp:64
std::vector< uint8_t > pixels
RGBA, 4 bytes/pixel, row-major top→bottom.
Definition headless_surface.hpp:60
uint32_t height
Definition headless_surface.hpp:62
uint32_t width
Definition headless_surface.hpp:61
size_t pixel_count() const
Definition headless_surface.hpp:65