feat: GPUView widget, vector icons, enterprise icon quality, deps cascade v0.50.11 - #200
Merged
Conversation
- Renamed viewport3d → gpuview (enterprise naming, 38 frameworks researched) - ExternalTextureLayer wired into Layer Tree build/update - SetOnCreateGPUTexture wired in desktop.initCanvas - GPUTextureProvider interface on widget.Context - FontSmoothing mock for gpucontext v0.23.0 - Examples: gpuview, filedrop - DnD bridge: KindFile, FilePayload, Manager.DropExternal - 7 ExternalTextureLayer tests, 14 GPUView tests, 7 DnD tests
Replace bitmap pre-rasterization in SceneCanvas.RenderSVG with direct vector scene emission via svg.Document.RenderToSceneWithColor. Icons are resolution-independent scene geometry, rendered at display resolution. Matches Skia/Jewel architecture.
…ins colors - Native @20x20 JetBrains SVGs for stripe tool window icons (1:1 scale) - Pixel-snap icon positions via math.Round (BUG-ICON-002) - Stroke-width 1.5→1 for crisp rendering (documented tradeoff vs JetBrains) - DevTools stripe foreground #9DA0A8→#CED0D6 (JetBrains dark variant) - ToolTerminal converted from PathOps 24x24 to SVGXML 16x16 - Tests: pixel-snap, containment, JetBrains reference size
- PushClip/PopClip around label DrawText prevents overflow into panels - Window controls: procedural DrawLine/StrokeRect → JetBrains SVG icons - Both default and DevTools titlebar painters updated - Tests: label containment, SVG renderer assertions
CHANGELOG [Unreleased], README, ROADMAP, ARCHITECTURE updated.
…v0.18.0 Major ecosystem cascade: - gg: vector icons (RenderToSceneWithColor), stroke hinting, text quality - gogpu: PollInputEvent, FontSmoothing, OS DnD, CommandEncoder - wgpu: ADR-056 resource lifecycle, @samyfodil queue pin fix - naga: shader compiler improvements - CHANGELOG and ARCHITECTURE deps updated
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
samyfodil
added a commit
to samyfodil/ui
that referenced
this pull request
Aug 3, 2026
RenderSVG on the scene canvas positions a document with a transform built from the bounds it is handed, but never constrains it to them. Anything the document draws past its own viewBox therefore lands on whatever surrounds the icon. That is not an unusual document. An SVG may draw anywhere, and every renderer that follows the spec clips to the viewport; icon sets rely on it, since a stroke centred on the viewBox edge puts half its width outside. So the common case is a bleed of a pixel or two, invisible wherever another widget paints afterwards and covers it. It becomes visible on the last icon in a row, or one against the edge of a window, where nothing paints over the spill: in a terminal emulator on this toolkit a 16x16 gear in the tab bar's trailing cluster painted a block from its own origin to the corner of the window, over the tab bar. This arrived with the switch to vector re-emission (gogpu#200). The previous path rasterised the document into a bitmap sized from those same bounds, so the bounds were enforced by construction — nothing could escape a raster that size. Emitting geometry into the scene removed that, and nothing took its place. Two changes, both making RenderSVG behave like its neighbours: - Push a clip of the given bounds around the emission, so the document is bounded the way the raster used to bound it. - Honour the current clip. Every other draw method on this canvas returns early when isVisible is false; RenderSVG was the one that did not, so an icon with no pixels on screen still emitted its whole document. Tests cover both, using a document that deliberately draws four times its viewBox — the visible version of the stroke case. Scene.Bounds() is the union of the shapes and does not narrow for a clip, so the test checks the emitted commands instead.
kolkov
pushed a commit
that referenced
this pull request
Aug 3, 2026
RenderSVG on the scene canvas positions a document with a transform built from the bounds it is handed, but never constrains it to them. Anything the document draws past its own viewBox therefore lands on whatever surrounds the icon. That is not an unusual document. An SVG may draw anywhere, and every renderer that follows the spec clips to the viewport; icon sets rely on it, since a stroke centred on the viewBox edge puts half its width outside. So the common case is a bleed of a pixel or two, invisible wherever another widget paints afterwards and covers it. It becomes visible on the last icon in a row, or one against the edge of a window, where nothing paints over the spill: in a terminal emulator on this toolkit a 16x16 gear in the tab bar's trailing cluster painted a block from its own origin to the corner of the window, over the tab bar. This arrived with the switch to vector re-emission (#200). The previous path rasterised the document into a bitmap sized from those same bounds, so the bounds were enforced by construction — nothing could escape a raster that size. Emitting geometry into the scene removed that, and nothing took its place. Two changes, both making RenderSVG behave like its neighbours: - Push a clip of the given bounds around the emission, so the document is bounded the way the raster used to bound it. - Honour the current clip. Every other draw method on this canvas returns early when isVisible is false; RenderSVG was the one that did not, so an icon with no pixels on screen still emitted its whole document. Tests cover both, using a document that deliberately draws four times its viewBox — the visible version of the stroke case. Scene.Bounds() is the union of the shapes and does not narrow for a clip, so the test checks the emitted commands instead.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
GPUView widget (Flutter Texture pattern), vector icon rendering, enterprise icon quality improvements, and full ecosystem deps cascade.
Added
Fixed
Changed
Test plan
go build ./...— passgo test ./... -count=1— 0 failuresgolangci-lint run --timeout=5m— 0 issues