Skip to content

fix(canvas): harden Canvas2D texture, memory, and clipping paths#58

Merged
chiefcll merged 1 commit into
mainfrom
fix/canvas-backend-hardening
Jun 4, 2026
Merged

fix(canvas): harden Canvas2D texture, memory, and clipping paths#58
chiefcll merged 1 commit into
mainfrom
fix/canvas-backend-hardening

Conversation

@chiefcll
Copy link
Copy Markdown
Contributor

@chiefcll chiefcll commented Jun 4, 2026

  • CanvasTexture: capture textureData before the first await and abort the load if the texture is freed in-flight, preventing a state/image desync where state=loaded but image=undefined
  • CanvasTexture.getImage: return null instead of asserting on a missing image; CanvasRenderer skips the draw for that frame
  • Texture: exclude textures in the 'loading' state from cleanup and null out ctxTexture after free() so a reload re-creates it instead of reusing a stale reference
  • ImageTexture/CanvasTexture: fail fast for compressed textures in canvas mode (before any fetch/decode) with a descriptive failed state
  • TextureMemoryManager/Stage: treat criticalThreshold=0 as disabled and apply it automatically for the canvas renderer, since JS-heap textures are GC-managed and threshold-based upload blocking does not apply
  • CanvasRenderer: gate clipping on clippingRect.valid and skip rendering a node clipped to zero area, which previously rendered with no clip at all

Also adds a --renderMode (webgl|canvas|all) flag to the visual-regression runner, storing canvas snapshots in a separate -canvas subdirectory.

- CanvasTexture: capture textureData before the first await and abort
  the load if the texture is freed in-flight, preventing a state/image
  desync where state=loaded but image=undefined
- CanvasTexture.getImage: return null instead of asserting on a missing
  image; CanvasRenderer skips the draw for that frame
- Texture: exclude textures in the 'loading' state from cleanup and null
  out ctxTexture after free() so a reload re-creates it instead of reusing
  a stale reference
- ImageTexture/CanvasTexture: fail fast for compressed textures in canvas
  mode (before any fetch/decode) with a descriptive failed state
- TextureMemoryManager/Stage: treat criticalThreshold=0 as disabled and
  apply it automatically for the canvas renderer, since JS-heap textures
  are GC-managed and threshold-based upload blocking does not apply
- CanvasRenderer: gate clipping on clippingRect.valid and skip rendering a
  node clipped to zero area, which previously rendered with no clip at all

Also adds a --renderMode (webgl|canvas|all) flag to the visual-regression
runner, storing canvas snapshots in a separate -canvas subdirectory.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chiefcll chiefcll merged commit cd778fd into main Jun 4, 2026
1 check passed
@chiefcll chiefcll deleted the fix/canvas-backend-hardening branch June 4, 2026 23:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant