Changelog
1.1.0
The refining release. Driving 1.0.0 from a real-time app turned up defects a static capture never would, and the capability that app needed most.
Fixed
- COLR v0 glyphs rendered nothing at all. Both entry points resolved color through the v1 paint graph, so a v0 font came back empty on the CPU and GPU paths alike.
- Two fonts in one
GpuBatchreturned each other’s outlines. The slot key carried no font identity. - COLR layers that defer to the caller’s text color rendered as nothing.
- Degenerate gradients flooded their shape with the last stop color instead of painting nothing.
- A draw with no instances was a validation error rather than a no-op.
- A borrowed Vulkan target leaked its image view and framebuffer.
- Metal was the one backend with no C entry point for adopting a device or borrowing a surface.
DAEGUN_SURFACE_RGBA8andDAEGUN_SURFACE_BGRA8sat inside the__APPLE__guard, so no caller on Windows or Linux had the constants their own calls take.- The C wrapper had never been compiled for Windows. It now type-checks and builds there.
Added
- Render into a surface you own, on Metal, Vulkan, D3D11 and D3D12.
from_deviceadopts the device you already made, and a target can wrap your swapchain image directly. No readback, no copy. See the GPU path. - The four backends are a documented module,
daegun::gpu, each one gated to the platform that has it. They were reachable before but hidden from the reference, so a Rust caller had no documentation for calls the C header described in full. - On Metal, daegun presents the drawable on the command buffer carrying the draw, so the queue orders the two and neither waits on the other.
- A caller-supplied text color for COLR layers that defer to it:
render_colr_glyph_with,gpu_color_glyph_withanddraw_glyph_with. See color. - A target’s byte order is yours to choose, RGBA8 or BGRA8, which is what it takes to match a swapchain without swizzling every frame.
- A target’s clear color is yours to choose, and
Nonekeeps what the target already holds, so several geometries layer into one surface rather than erasing each other. - One
GpuBatchnow holds any number of fonts, so a mixed-font page uploads once and draws once. Rgbais public at the crate root. It is in the signature of every_withcolor call, so it had to be documented beside them rather than reachable only through a hidden module.
Changed
GpuGlyphKeygains afontfield and#[non_exhaustive]. It is internal and#[doc(hidden)], constructed only inside daegun, and absent from the C API. This is why the release is 1.1.0 rather than 1.0.1.
No documented signature changed and nothing was removed, so 1.0.0 code compiles against 1.1.0 untouched.
1.0.0
2026-08-20
First release. A text engine in one crate: parsing, shaping, layout, rasterizing, subsetting and a
GPU path, with no dependencies and no std required.