feat: vector zoom for SVG in image viewer app

This commit is contained in:
daniel committed 2026-05-18 20:15:22 +02:00
1 parent 72b9bd681b
commit 43c3c7e59b
4 files changed
+189 -36

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
/*
* svg_doc.hpp
* Lazily-rasterized SVG document for the Image Viewer.
* Keeps the source bytes around so the rasterizer can be re-run whenever the
* user changes zoom, giving true vector quality at every scale.
* Copyright (c) 2026 Daniel Hammer
*/
#pragma once
#include <cstdint>
namespace imageviewer {
struct SvgDoc {
uint8_t* source; // SVG bytes (owned, freed in svgdoc_free)
int source_len;
int natural_w; // intrinsic SVG dimensions
int natural_h;
uint32_t* pixels; // current rasterization (owned ARGB)
int render_w; // pixel dimensions of `pixels`
int render_h;
float render_scale; // pixels = natural * render_scale (may differ from
// requested when capped by max_edge)
};
// Initialize from owned SVG source bytes. The doc takes ownership of `source`
// and will free it via montauk::mfree on svgdoc_free. Returns false on
// failure; on failure the caller still owns `source`.
bool svgdoc_init(SvgDoc* doc, uint8_t* source, int source_len);
// Ensure the rasterization matches `target_scale`. The longest rendered edge
// is capped at `max_edge` pixels; if `target_scale` would exceed that, the
// scale is clamped (render_scale will reflect the actual scale used).
// Returns false if rasterization fails; the existing cache is left intact.
bool svgdoc_render(SvgDoc* doc, float target_scale, int max_edge);
// Free all owned memory (source bytes + raster cache).
void svgdoc_free(SvgDoc* doc);
} // namespace imageviewer