Releases: ClarkWain/WhatsCanvas
Release list
WhatsCanvas 0.3.0
Adds the first-party Android OpenGL ES host under platforms/android with GLSurfaceView, JNI lifecycle handling, system-font matching, and three ABI builds. Fixes missing Android glyph output caused by GLES texture swizzles and removes round-cap/dashed-stroke AA seams. Includes updated Android integration and cross-platform documentation. Release packages are provided for Windows x64, Linux x64, and macOS universal; the Android host remains a source integration sample rather than a signed distributable APK.
WhatsCanvas 0.2.0
WhatsCanvas 0.2.0 introduces the native Metal backend on Apple platforms and strengthens cross-platform text and packaging support.
Highlights:
- Native Metal rendering on macOS/iOS, including CAMetalLayer presentation, filters, clipping, mipmaps, GPU timing, and external MTLTexture interop.
- Metal is included in automatic backend selection on Apple platforms and covered by 21 dedicated tests.
- Cached native system-font discovery through CoreText, DirectWrite, and fontconfig, with explicit refresh APIs.
- Stronger Unicode/font fallback behavior and macOS font-collection face discovery.
- Updated version metadata, vcpkg overlay, documentation, CI gates, and semantic-version release-tag handling.
Validation:
- 58/58 unit tests and 21/21 Metal tests passed locally.
- PR and merged-master cross-platform CI passed on Windows, Linux, and macOS.
- Merged-master release packaging passed for Windows x64, Linux x64, and macOS universal.
See CHANGELOG.md for the full release notes.
v0.1.20
WhatsCanvas v0.1.19
WhatsCanvas v0.1.19 improves developer onboarding, package integration, text rendering defaults, and rendering reliability.
Highlights
- Added a tested vcpkg overlay port with selectable OpenGL, Software, and FreeType/HarfBuzz text features.
- Added package-manager dependency support for glm, stb, FreeType, and HarfBuzz, including both common HarfBuzz CMake target variants.
- Enabled the bundled FreeType rasterizer and HarfBuzz OpenType shaping by default for OpenGL-family builds and release packages.
- Isolated installed renderer exports so Software-only consumers do not import OpenGL or text-stack targets.
- Added a visual API integration gallery for Software, OpenGL, OpenGL ES, and Vulkan.
- Fixed stale OpenGL VAO state after off-screen shadow and filter passes.
- Restored auditable performance evidence validation: 26 leads, 0 losses, 1 tie, with 27/27 pixel quality checks in the archived NanoVG matrix.
Validation
- Windows, Linux, and macOS builds and unit tests passed.
- OpenGL, OpenGL ES, Vulkan, default text stack, package consumer, API reference, version, and performance gates passed.
- Windows x64, Linux x64, and macOS universal packages are built by the release workflow and will appear below as assets.
Full changelog: v0.1.18...v0.1.19
WhatsCanvas 0.1.18
What's Changed
- Release 0.1.18: filter chains, diagnostics, and path batching by @ClarkWain in #64
Full Changelog: v0.1.17...v0.1.18
WhatsCanvas 0.1.17
Highlights
- Added a reproducible 1080p performance suite covering stable, dynamic-data, and dynamic-structure workloads for geometry, images, and multilingual text.
- Added a quality-gated cross-library benchmark matrix with ABBA scheduling, bootstrap confidence intervals, and a checked-in NanoVG comparison baseline.
- Improved OpenGL path and sprite batching, Vulkan geometry/texture submission, and Software raster/filter fast paths.
- Added bounded cache and retained-memory diagnostics for glyph atlases, tessellation, bitmap text, and render targets.
- Added cross-backend image-filter pixel parity gates for OpenGL, OpenGLES, and Vulkan, including strict Mesa software-driver validation.
Packages
- Windows x64 Release
- Linux x64 Release
- macOS universal Release (x86_64 + arm64)
See CHANGELOG.md for the complete list of changes.
v0.1.16 — Cross-backend image filters and frosted glass
What's Changed
- Add full shared package backends and consumer example by @ClarkWain in #48
- Improve curve tessellation, analytic AA, and Fluent fonts by @ClarkWain in #49
- feat(filters): add GPU image and backdrop filters by @ClarkWain in #51
- feat(filters): add cross-backend inner shadows by @ClarkWain in #52
- docs: align documentation with current implementation by @ClarkWain in #50
- chore(release): prepare 0.1.16 by @ClarkWain in #53
Full Changelog: v0.1.15...v0.1.16
v0.1.15 — DirectWrite text backend + three-layer cache + ADR-006 progress
WhatsCanvas v0.1.15
Version bump 0.1.14 → 0.1.15 documenting the 17 PRs (#27–#46) merged since 0.1.14.
Highlights
Text rendering
- DirectWrite text backend (Windows): first-class native adapter selectable via
TextBackendKind::DirectWrite. Covers measurement, real line breaking viaIDWriteTextLayout, weight / slant / spacing / locale styling, custom in-memory font registration and fallback chains, underline / strikethrough decorations, and grayscale + ClearType raster modes.resolveFontFamiliesnow matches the portable backend. - Per-
PaintTextRenderMode(Auto/Grayscale/ClearType): explicit per-draw opt-in for ClearType when the surface is known to be opaque and axis-aligned. - Cross-backend text decoration parity: underline and strikethrough now render consistently on the portable, DirectWrite, and software backends; a regression test pixel-compares all three.
- Text sharpness / HiDPI: text rasterizes at effective device pixel size under a scaled transform or
Canvas::setDevicePixelRatio, and glyph quads snap to the pixel grid on axis-aligned draws.
Performance
- DirectWrite three-layer cache: repeat UI text draws pay only the
scissor + quad-submitcost per frame.- COM apartment + WIC/D2D factories cached process-wide.
- Rasterized bitmap + intrinsic metrics cached in an LRU (4 MB byte budget by default) keyed by
(text, paint, dpr, render-mode). Canvaskeeps a 256-entry LRU of GPU textures keyed by the backend-provided content id, so identical text skips the CPU→GPU upload entirely.
Rendering
- Default anti-aliasing:
Paintnow defaults to AA strokes and fills; opt out withPaint::setAntiAlias(false). - OpenGL
ClipFillprimitive support inexecuteDrawList: a newDrawClipFillProgrammirrors Vulkan's clip pipeline (mask.r × tint color) — closes an ADR-006 parity gap. - Shared encoder resilience:
CommandDrawListEncoderno longer aborts the whole encode on a clipped point/line/vector-text command; it warns and continues so the rest of the offscreen replay still produces output.
Fixes
- MSVC on non-English Windows:
CMakeLists.txtnow passes/utf-8to MSVC so UTF-8 source files decode consistently under the active ANSI code page.
Compatibility
- Public API: fully backwards compatible with 0.1.14.
TextRenderModeis a new opt-in enum withAutodefault. - CMake:
find_package(WhatsCanvas 0.1.15 CONFIG REQUIRED).
Validation
- Full ctest suite (39/39) green on Windows Debug throughout the release.
- Cross-Platform Validation matrix all SUCCESS: Windows / Linux / macOS unit, OpenGLES smoke, package-consumer, cmake-release, optional-font-stack, api-reference, Vulkan.
- Release preflight (
WhatsCanvasVersionConsistencyCheck,WhatsCanvasApiReferenceCheck,WhatsCanvasPackageConsumerSmoke): 3/3 PASS.
Documentation
- Refreshed
doc/DIRECTWRITE_DESIGN_REVIEW.mdwith a status table mapping each of the five original review issues to the PR(s) that closed it. doc/DIRECTWRITE_TEXT_BACKEND.mdknown-limitations section rewritten around the three-layer cache.- ADR-006 gained a Progress Log section (PR #42 / PR #44).
doc/DIRECT3D_DESIGN_REVIEW.mdadded under version control.
See CHANGELOG.md for the full entry.
WhatsCanvas 0.1.14
Symmetric frame API and a documentation clarification that prevents a common "black screen" pitfall.
Breaking (pre-1.0)
-
Removed
Canvas::flush(). Drawing is now a symmetricbeginFrame()/endFrame()pair.Migration — replace every flush with endFrame:
canvas->beginFrame(); canvas->drawRect(/* ... */, paint); canvas->endFrame(); // was: canvas->flush(); canvas->readPixelsRGBA(pixels); // or savePixelsPPM("out.ppm")
endFrame()renders the recorded commands onto a freshly-cleared framebuffer, makes them readable, and consumes them. Call it exactly once per frame, right beforereadPixelsRGBA/present.
Changed
- Documented the offscreen frame lifecycle so the "black readback" pitfall is obvious: calling the frame-ender twice (or
beginFrame()after drawing) re-clears the buffer and yields an empty image. Added a Get Started "frame lifecycle" section and a Troubleshooting entry, and clarified thebeginFrame/endFrameAPI doc comments.
No other API changes. The internal renderer-level flush() (implementation detail) is unrelated and unchanged.
See the CHANGELOG.
WhatsCanvas 0.1.13
Patch release focused on Windows prebuilt-binary link portability.
Fixed
-
The published Windows libraries no longer reference toolset-version-specific MSVC STL vectorized helpers (
__std_min_element_f_/__std_max_element_f_). Previously, a package built on a newer CI toolchain failed to link on a consumer's older Visual Studio with:error LNK2019: unresolved external symbol __std_min_element_f_ ... error LNK2019: unresolved external symbol __std_max_element_f_ ... fatal error LNK1120: 2 unresolved externalsWhatsCanvas is now compiled with
_USE_STD_VECTOR_ALGORITHMS=0on MSVC (scalar path), so the shipped.libfiles link against any VS 2022 STL, not just the exact toolset that produced them.
Also
- The Windows packaging job is pinned to
windows-2022for reproducibility. doc/TROUBLESHOOTING.mddocuments theLNK2019 __std_*_element_*symptom and its fixes.
No API changes. If you hit the link error with the 0.1.12 package, upgrade to this release (or update Visual Studio / build from source).
See the CHANGELOG.