Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
asset_manager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <functional>
6#include <memory>
7#include <mutex>
8#include <string>
9#include <string_view>
10#include <unordered_map>
11#include <vector>
12
13namespace pulp::view {
14
15// ── Asset Types ─────────────────────────────────────────────────────────────
16
18struct ImageData {
19 std::vector<uint8_t> pixels;
20 uint32_t width = 0;
21 uint32_t height = 0;
22
23 bool valid() const { return !pixels.empty() && width > 0 && height > 0; }
24 size_t byte_size() const { return pixels.size(); }
25};
26
28struct FontData {
29 std::vector<uint8_t> data; // Raw font file bytes
30 std::string family_name;
31 bool valid() const { return !data.empty(); }
32 size_t byte_size() const { return data.size(); }
33};
34
36struct ShaderData {
37 std::string source;
38 std::string error; // Non-empty if compilation failed
39 bool valid() const { return error.empty() && !source.empty(); }
40 size_t byte_size() const { return source.size(); }
41};
42
44struct BlobData {
45 std::vector<uint8_t> data;
46 bool valid() const { return !data.empty(); }
47 size_t byte_size() const { return data.size(); }
48};
49
50// ── Asset Manager ───────────────────────────────────────────────────────────
51// Centralized resource loading with LRU caching.
52//
53// Loading sources supported:
54// - File path
55// - Memory buffer
56// - Embedded resource (registered at startup via CMake pulp_add_binary_data)
57// - data: URI (for Three.js bridge compatibility)
58//
59// All load functions are synchronous. For async loading, use load_async()
60// which accepts a completion callback.
61
63public:
66
69
70 // ── Embedded Resource Registration ──────────────────────────────────────
71
73 void register_embedded(const std::string& name, const uint8_t* data, size_t size);
74
76 bool has_embedded(const std::string& name) const;
77
78 // ── Image Loading ───────────────────────────────────────────────────────
79
81 ImageData load_image(const std::string& path);
82
84 ImageData load_image_from_memory(const uint8_t* data, size_t size);
85
87 ImageData load_image_embedded(const std::string& name);
88
90 ImageData load_image_from_data_uri(const std::string& uri);
91
97 static std::vector<uint8_t> decode_data_uri_bytes(std::string_view uri);
98
99 // ── Font Loading ────────────────────────────────────────────────────────
100
102 FontData load_font(const std::string& path);
103
105 FontData load_font_embedded(const std::string& name);
106
108 void register_font_family(const std::string& family, const std::string& path_or_name);
109
111 FontData font_for_family(const std::string& family) const;
112
114 void set_font_fallback(std::vector<std::string> families);
115 const std::vector<std::string>& font_fallback() const { return font_fallback_; }
116
117 // ── Shader Management ───────────────────────────────────────────────────
118
120 ShaderData load_shader(const std::string& path);
121
123 ShaderData load_shader_embedded(const std::string& name);
124
126 void register_shader(const std::string& name, std::string source);
127
129 ShaderData shader(const std::string& name) const;
130
131 // ── Generic Blob Loading ────────────────────────────────────────────────
132
135 BlobData load_blob(const std::string& path);
136
141 static constexpr size_t kDefaultMaxFileBytes = size_t{256} * 1024 * 1024;
142 void set_max_file_bytes(size_t bytes);
143 size_t max_file_bytes() const {
144 return max_file_bytes_;
145 }
146
148 BlobData load_blob_embedded(const std::string& name);
149
150 // ── Async Loading ───────────────────────────────────────────────────────
151
154 void load_image_async(const std::string& path, std::function<void(ImageData)> callback);
155
156 // ── Cache Management ────────────────────────────────────────────────────
157
159 void set_max_cache_size(size_t bytes);
160 size_t max_cache_size() const { return max_cache_bytes_; }
161
163 size_t cache_usage() const { return cache_bytes_; }
164
166 size_t cache_count() const;
167
170
172 void evict_lru();
173
174 // ── Resolution ──────────────────────────────────────────────────────────
175
178 void set_display_scale(float scale) { display_scale_ = scale; }
179 float display_scale() const { return display_scale_; }
180
181private:
182 struct EmbeddedEntry {
183 const uint8_t* data;
184 size_t size;
185 };
186 std::unordered_map<std::string, EmbeddedEntry> embedded_;
187
188 // LRU cache: key → (data, byte_size, access_order)
189 struct CacheEntry {
190 enum class Type { image, font, shader, blob };
191 Type type;
192 ImageData image;
193 FontData font;
194 ShaderData shader_data;
195 BlobData blob;
196 size_t byte_size = 0;
197 uint64_t access_time = 0;
198 };
199 mutable std::unordered_map<std::string, CacheEntry> cache_;
200 mutable uint64_t access_counter_ = 0;
201 size_t cache_bytes_ = 0;
202 size_t max_cache_bytes_ = 64 * 1024 * 1024; // 64 MB
203 size_t max_file_bytes_ = kDefaultMaxFileBytes;
204 float display_scale_ = 1.0f;
205
206 // Font system
207 std::unordered_map<std::string, std::string> font_registry_; // family → path/name
208 std::vector<std::string> font_fallback_;
209
210 mutable std::mutex mutex_;
211
212 void touch(CacheEntry& entry) const;
213 void add_to_cache(const std::string& key, CacheEntry entry);
214 CacheEntry* find_cached(const std::string& key) const;
215 std::string resolve_path(const std::string& path) const;
216
217 // PNG decoding (minimal — uses stb_image or platform API)
218 static ImageData decode_png(const uint8_t* data, size_t size);
219 BlobData read_file_bytes(const std::string& path) const;
220};
221
222} // namespace pulp::view
void set_font_fallback(std::vector< std::string > families)
Set the font fallback chain.
FontData font_for_family(const std::string &family) const
Get font data for a family name (walks fallback chain).
void set_max_file_bytes(size_t bytes)
static constexpr size_t kDefaultMaxFileBytes
Ceiling for one file read through load_blob / load_image / load_font / load_shader.
Definition asset_manager.hpp:141
void register_embedded(const std::string &name, const uint8_t *data, size_t size)
Register an embedded resource (called by generated code from pulp_add_binary_data).
void register_shader(const std::string &name, std::string source)
Register a shader string directly.
BlobData load_blob_embedded(const std::string &name)
Load raw bytes from embedded resource.
ShaderData load_shader(const std::string &path)
Load shader source from file path.
ShaderData shader(const std::string &name) const
Get a registered/loaded shader by name.
size_t max_file_bytes() const
Definition asset_manager.hpp:143
void set_max_cache_size(size_t bytes)
Set maximum cache size in bytes. Default: 64 MB.
FontData load_font(const std::string &path)
Load font from file path.
bool has_embedded(const std::string &name) const
Check if an embedded resource exists.
BlobData load_blob(const std::string &path)
Load raw bytes from file path.
const std::vector< std::string > & font_fallback() const
Definition asset_manager.hpp:115
ImageData load_image_from_data_uri(const std::string &uri)
Load image from data: URI (base64-encoded PNG/JPEG).
float display_scale() const
Definition asset_manager.hpp:179
void register_font_family(const std::string &family, const std::string &path_or_name)
Register a font in the font fallback chain.
FontData load_font_embedded(const std::string &name)
Load font from embedded resource.
size_t cache_usage() const
Current cache usage in bytes.
Definition asset_manager.hpp:163
static std::vector< uint8_t > decode_data_uri_bytes(std::string_view uri)
The payload of a data: URI as encoded bytes, whatever their format; dimensions are left to a decoder.
size_t cache_count() const
Number of cached entries.
static AssetManager & instance()
Get the singleton instance.
void clear_cache()
Clear all cached assets.
void load_image_async(const std::string &path, std::function< void(ImageData)> callback)
Load an image asynchronously.
size_t max_cache_size() const
Definition asset_manager.hpp:160
void evict_lru()
Evict least-recently-used entries until cache fits within max size.
ImageData load_image_embedded(const std::string &name)
Load image from embedded resource by name.
void set_display_scale(float scale)
Set display scale for retina-aware asset resolution.
Definition asset_manager.hpp:178
ImageData load_image_from_memory(const uint8_t *data, size_t size)
Load image from memory buffer (PNG/JPEG bytes).
ImageData load_image(const std::string &path)
Load image from file path. Returns cached if available.
ShaderData load_shader_embedded(const std::string &name)
Load shader from embedded resource.
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
@ path
Definition anchor_strategy.hpp:42
@ scale
Definition css_animation.hpp:126
Raw binary data for any resource.
Definition asset_manager.hpp:44
std::vector< uint8_t > data
Definition asset_manager.hpp:45
bool valid() const
Definition asset_manager.hpp:46
size_t byte_size() const
Definition asset_manager.hpp:47
Font data loaded from TTF/OTF.
Definition asset_manager.hpp:28
std::string family_name
Definition asset_manager.hpp:30
bool valid() const
Definition asset_manager.hpp:31
std::vector< uint8_t > data
Definition asset_manager.hpp:29
size_t byte_size() const
Definition asset_manager.hpp:32
Raw pixel data (RGBA 8-bit per channel).
Definition asset_manager.hpp:18
size_t byte_size() const
Definition asset_manager.hpp:24
uint32_t width
Definition asset_manager.hpp:20
std::vector< uint8_t > pixels
Definition asset_manager.hpp:19
bool valid() const
Definition asset_manager.hpp:23
uint32_t height
Definition asset_manager.hpp:21
Shader source with optional compilation error.
Definition asset_manager.hpp:36
size_t byte_size() const
Definition asset_manager.hpp:40
bool valid() const
Definition asset_manager.hpp:39
std::string error
Definition asset_manager.hpp:38
std::string source
Definition asset_manager.hpp:37