Tags: gogpu/gg
Tags
fix: update stroke tests + docs for v0.48.12 (#374, #376) (#377) - Tests: split Vello stroke tests into Smooth/Sharp variants matching dynamic fill rule from PR #376 (smooth→NonZero, sharp→EvenOdd) - CHANGELOG: v0.48.12 AMD stencil invert workaround (@lkmavi) - ROADMAP: v0.48.12 current, release table updated
fix: set EvenOdd fill rule in VelloAccelerator.StrokePath (#369) (#372) VelloAccelerator.StrokePath passed the original paint (NonZero) to FillPath after stroke expansion. The expanded outline has two contours (outer + inner, opposite winding) — NonZero fills both as solid, EvenOdd correctly cancels the inner to produce a hollow ring. Verified against Skia, tiny-skia, our expander — all produce two contours with opposite winding. 2 regression tests added. ADR-043. Closes #369 (@TimLai666).
fix: backdrop prefix sum boundary + wgpu v0.30.1 opaque handles (v0.4… …8.10) (#370) * feat!: migrate to wgpu v0.30.1 opaque handle pattern BREAKING: gpucontext.Device/Queue/Adapter changed from interfaces to opaque structs with Pointer()/IsNil() methods (wgpu#218 sentinel design). Migration in gg: - gpu_shared.go: type assertions replaced with wgpu.DeviceFromHandle() and wgpu.AdapterFromHandle() helpers - vello_accelerator.go: same pattern - render/device.go: NullDeviceHandle returns zero-value structs - render/device_test.go: nil checks → .IsNil() checks - render/example_test.go: output format updated - canvas_test.go: mock Device/Queue/Adapter removed (structs not mockable) - accelerator.go: godoc updated for new handle pattern Zero unsafe.Pointer usage in gg — all conversions via wgpu helpers. * chore: update gogpu v0.41.14 → v0.42.0 in examples * fix: bound CalculateBackdrop prefix sum to per-row entry extents BUG-BACKDROP-001 (ADR-042): the three-pass prefix sum in CalculateBackdrop propagated winding across ALL tile columns in each row. When rotated text glyphs had unclosed contours in the coarse grid, winding leaked to the right edge of the viewport — emitBackdropOnlyTiles filled those tiles as solid black, creating a 30x20 pixel artifact 93px past the text boundary. Fix: track per-row [minX, maxX) from actual entries and limit the prefix sum to that range. Tiles outside the bounds keep backdrop=0. This matches Vello's backdrop_dyn.wgsl which bounds the prefix sum to per-path bbox, and our own tilecompute/rasterizer.go:87-99 which already does this correctly. Regression introduced in v0.48.6 (PR #357). Discovered during enterprise audit session. Root cause chain: filler_comparison_test.go registers AdaptiveFiller via init() → SparseStrips active for all tests → curved glyph outlines exceed 64-element threshold → SparseStrips used for per-glyph Fill() → CalculateBackdrop prefix sum leaks. Verified: all 4 enterprise references (Vello backdrop_dyn.wgsl, Vello strip.rs, tiny-skia path.rs, Skia SkScan_AAAPath.cpp) bound winding to path extents, never to full viewport. * docs: update CHANGELOG and ROADMAP for v0.48.10 - CHANGELOG: BUG-BACKDROP-001 fix, wgpu v0.30.1 migration, deps update - ROADMAP: v0.48.10 current, v0.49.0 gradients+clipping, release table
fix: glyph mask quadOffset + deps update + ROADMAP v1.0 (#366) * chore(deps): wgpu v0.29.14, naga v0.17.14 * chore: update wgpu v0.29.14 → v0.29.15, naga v0.17.14 → v0.17.15, gogpu v0.41.4 → v0.41.13 Update ecosystem dependencies in main go.mod and all examples. wgpu v0.29.15: GLES GLSL version propagation, Wayland fixes. naga v0.17.15: GLSL uniform reflection for runtime binding fallback. gogpu v0.41.13: hidden-then-show window pattern, Wayland SIGSEGV fix. * fix: advance quadOffset on nil bind group skip in glyph mask draw calls BUG-GLYPHMASK-001: buildGlyphMaskDrawCalls skipped batches with nil bind groups via continue without advancing quadOffset. Subsequent batches received wrong indexOffset into the shared vertex/index buffer, causing text to render from wrong quads (invisible or garbled). Affects all GPU backends when a glyph mask bind group fails to initialize. Also: removed unused uniformSize parameter from ensureGlyphMaskBatchPools (unparam lint fix — always glyphMaskLCDUniformSize). Added 3 regression tests covering nil bind group, all valid, and empty batch. Discovered during enterprise audit (#365). * chore: update gogpu v0.41.13 → v0.41.14 in examples * docs: update CHANGELOG and ROADMAP for v0.48.9 - CHANGELOG: BUG-GLYPHMASK-001 fix, deps v0.29.15/v0.17.15/v0.41.14 - ROADMAP: enterprise roadmap to v1.0.0 (Nov 2027) with quarterly milestones, API freeze blockers, post-1.0 vision. Updated from feature changelog to strategic planning document.
fix: SDF thin stroke fallback + winding propagation (#346, BUG-SPARSE… …-STRIPS-001) (#357) * fix: SDF thin stroke fallback to geometric expansion (#346, ADR-040) SDF stroke with lineWidth < 2.0 returns ErrFallbackToCPU — annular ring thinner than smoothstep AA zone produces near-zero coverage. Geometric stroke expansion (CPU scanline) handles thin strokes correctly. Threshold 2.0px: at half_stroke=1.0 > smoothstep_zone=0.5, ring extends beyond AA zone with full center coverage. Applied to both CPU SDF accelerator and GPU render context. * fix: SparseStripsFiller winding propagation (BUG-SPARSE-STRIPS-001) Backdrop calculation uses Vello backdrop.wgsl prefix-sum pattern. FineRasterizer propagates windingDelta between non-adjacent tiles on same row (Rust Vello strip.rs:259-263). Interior tiles with non-zero backdrop but no segments now emitted as solid fills. Removes the last known correctness gap between SparseStripsFiller and AnalyticFiller for multi-contour NonZero fills.
feat: TextModeAliased CPU + fractional glyph advances (#353) (#356) * feat: TextModeAliased CPU fallback via NoAAFiller (#353) CPU-only contexts (gg.NewContext + SavePNG) now render aliased text using GlyphMaskRasterizer.RasterizeAliased per glyph — same NoAAFiller binary coverage as GPU Tier 6 path. Matches Skia/Cairo/tiny-skia enterprise pattern (dedicated non-AA scan converter, not threshold). Rotation/skew routes through drawStringAsOutlines with Antialias=false. text.DrawAliased() parallels text.Draw() with binary-only output. * feat: fractional glyph advances + per-glyph rendering (ADR-039) GlyphAdvance uses HintingNone for fractional layout advances (Skia linearHoriAdvance pattern). text.Draw replaced font.Drawer with per-glyph RasterizeHinted — hinted outlines + fractional positioning. Shared drawGlyphs helper for Draw and DrawAliased. Fixes letter merging at 10-12px ('Te' gap preserved via ~7.33 advance instead of integer-rounded 7.0).
fix: stroke inner join teeth on thick strokes (#354, #353) (#355) * chore(examples): update gg v0.47.0 → v0.48.2, gogpu v0.39.0, wgpu v0.28.7 * chore(examples): update gogpu v0.39.0 → v0.39.1 * fix: stroke inner join teeth on thick strokes (#354, #353) handleInnerJoin now emits two lineTo calls matching tiny-skia stroker.rs:1370-1379: route through pivot, then place at correct normal offset. Missing second lineTo caused diagonal 'tent' artifacts visible as sawtooth teeth on circles and twisted corners on rectangles at lineWidth >= 5. Added StrokeString godoc recommending LineJoinRound for thick text. Added 9 regression tests (circle/rect/offset at multiple lineWidths).
PreviousNext