From 8defd2c676f4425c3c828f8a3eea38ca3e578890 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Tue, 15 Sep 2026 13:25:43 +0300 Subject: [PATCH] fix(renderer): rasterize settled scenes at viewport origin Skia analytic coverage depends on framebuffer dimensions as well as raster origin. Replay existing retained subtree pictures into the live viewport at settlement, while preserving overscan images for navigation. Keep settlement pending until the viewport pass and report the presentation path accurately. No additional viewport cache is allocated. Preserve exact held/released assertions and cover odd/even/fractional pans at DPR 1, 1.25, 1.5 and 2. Verify native picture and backing identity reuse; update one pixel in the existing baseline only after proving equality with direct rendering. Validation: full check, 735 scoped unit tests, and 58 targeted browser tests pass. The targeted set still excludes the previously classified paint-field-width baseline. An additional tiled large-blur test fails identically on parent d16400b3e, with byte-identical actual PNGs. Broader release acceptance remains separate. --- AGENTS.md | 1 + CHANGELOG.md | 2 +- packages/core/src/canvas/renderer/pipeline.ts | 14 ++- .../src/canvas/renderer/retained-backing.ts | 90 +++++++++++++----- tests/e2e/canvas/frame-overlays.spec.ts | 13 +++ ...ame-selection-labels-openpencil-darwin.png | Bin 63600 -> 63609 bytes tests/e2e/canvas/retained-parity.spec.ts | 71 ++++++++++++++ .../canvas/retained-backing-pixels.test.ts | 40 +++++++- .../render/canvas/retained-backing.test.ts | 20 +++- 9 files changed, 212 insertions(+), 39 deletions(-) create mode 100644 tests/e2e/canvas/retained-parity.spec.ts diff --git a/AGENTS.md b/AGENTS.md index 1b56f9141..006a634ec 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -191,6 +191,7 @@ Keep responsibilities distinct: engine tests cover state contracts, Playwright b - `requestRender()` bumps `renderVersion` and `sceneVersion`; `requestRepaint()` bumps only `renderVersion` - `renderNow()` is only for surface recreation and font loading (need immediate draw) - Resize observer uses rAF throttle, not debounce — debounce causes canvas skew +- Overscan images accelerate navigation; settled scenes rasterize existing retained pictures at the live viewport size/origin. Pixel-grid alignment alone does not guarantee Skia AA parity. Keep settlement pending until the viewport pass completes; do not add a second viewport image cache. - Viewport culling skips off-screen nodes; unclipped parents are NOT culled (children may extend beyond bounds) - Selection border width must be constant regardless of zoom — divide by scale - Section/frame title text never scales — render at fixed font size, ellipsize to fit diff --git a/CHANGELOG.md b/CHANGELOG.md index 166ff9d1c..423b2305d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,7 +59,7 @@ ### Fixed -- Keep property fields and paint previews live during editing, and keep selection labels attached and aligned during rotation. +- Keep property fields and paint previews live during editing, and keep rotated selection labels aligned and object edges stable when previews settle. - Keep Undo and Redo commands available as edit history changes, without requiring another scene edit. - Avoid recursive desktop HTTP proxy requests when font downloads intercept Tauri IPC traffic. - Keep FIT image fills proportional, centered, and fully visible without stretching or cropped edges. diff --git a/packages/core/src/canvas/renderer/pipeline.ts b/packages/core/src/canvas/renderer/pipeline.ts index d5183d67e..af32c1523 100644 --- a/packages/core/src/canvas/renderer/pipeline.ts +++ b/packages/core/src/canvas/renderer/pipeline.ts @@ -240,14 +240,12 @@ export function render( renderedScene = true p.setScenePictureMode('hit', tiled.covered ? 'tiled' : 'tiled-fallback') } - if ( - !renderedScene && - layer === 'scene' && - !requiresUncachedSceneRender && - renderSceneBacking(r, canvas, graph, sceneVersion) - ) { - renderedScene = true - p.setScenePictureMode('hit', 'backing') + if (!renderedScene && layer === 'scene' && !requiresUncachedSceneRender) { + const presentation = renderSceneBacking(r, canvas, graph, sceneVersion) + if (presentation) { + renderedScene = true + p.setScenePictureMode('hit', presentation) + } } if (!renderedScene) { canvas.translate(r.panX, r.panY) diff --git a/packages/core/src/canvas/renderer/retained-backing.ts b/packages/core/src/canvas/renderer/retained-backing.ts index 8e762a84e..46e8d9379 100644 --- a/packages/core/src/canvas/renderer/retained-backing.ts +++ b/packages/core/src/canvas/renderer/retained-backing.ts @@ -288,6 +288,55 @@ function cachedSubtreePicture( } } +function drawRetainedChild( + r: SkiaRenderer, + graph: SceneGraph, + canvas: Canvas, + childId: string, + sceneVersion: number, + renderingSceneBacking: boolean +): void { + const child = graph.getNode(childId) + const hasCacheableEffects = child?.effects.some( + (effect) => effect.visible && (effect.type === 'DROP_SHADOW' || effect.type === 'INNER_SHADOW') + ) + if (hasCacheableEffects) { + const previous = r.renderingSceneBacking + r.renderingSceneBacking = renderingSceneBacking + try { + r.renderNode(canvas, graph, childId, {}) + } finally { + r.renderingSceneBacking = previous + } + } else { + const picture = cachedSubtreePicture(r, graph, childId, sceneVersion) + if (picture) canvas.drawPicture(picture) + else r.renderNode(canvas, graph, childId, {}) + } +} + +function drawSettledScene( + r: SkiaRenderer, + canvas: Canvas, + graph: SceneGraph, + sceneVersion: number +): void { + // Analytic AA depends on framebuffer dimensions as well as pixel/quad phase. + // Reuse existing pictures at the live viewport origin and size. Overscan + // remains available for navigation; this creates no additional cache. + canvas.save() + try { + canvas.translate(r.panX, r.panY) + canvas.scale(r.zoom, r.zoom) + const page = graph.getNode(r.pageId ?? graph.rootId) + for (const childId of page?.childIds ?? []) { + drawRetainedChild(r, graph, canvas, childId, sceneVersion, false) + } + } finally { + canvas.restore() + } +} + function renderBackingChild( r: SkiaRenderer, graph: SceneGraph, @@ -309,24 +358,7 @@ function renderBackingChild( canvas.scale(r.dpr, r.dpr) canvas.translate(backing.panX, backing.panY) canvas.scale(r.zoom, r.zoom) - const previousRenderingSceneBacking = r.renderingSceneBacking - const child = graph.getNode(childId) - const hasCacheableEffects = child?.effects.some( - (effect) => - effect.visible && (effect.type === 'DROP_SHADOW' || effect.type === 'INNER_SHADOW') - ) - if (hasCacheableEffects) { - r.renderingSceneBacking = true - try { - r.renderNode(canvas, graph, childId, {}) - } finally { - r.renderingSceneBacking = previousRenderingSceneBacking - } - } else { - const picture = cachedSubtreePicture(r, graph, childId, sceneVersion) - if (picture) canvas.drawPicture(picture) - else r.renderNode(canvas, graph, childId, {}) - } + drawRetainedChild(r, graph, canvas, childId, sceneVersion, true) } finally { canvas.restore() r.worldViewport = prevViewport @@ -504,18 +536,16 @@ export function renderSceneBacking( canvas: Canvas, graph: SceneGraph, sceneVersion: number -): boolean { +): false | 'backing' | 'retained-pictures' { if (r.sceneBackingAllocationFailed) return false - const navigationActive = - r.navigationPhase === 'pan' || - r.navigationPhase === 'zoom' || - r.navigationPhase === 'momentum' || - r.navigationPhase === 'settling' + const navigationActive = r.navigationPhase !== 'idle' if (navigationActive && r.sceneBacking) { r.sceneBackingBuild?.surface.delete() r.sceneBackingBuild = null r.sceneBackingNeedsCrispRender = true return drawSceneBacking(r, canvas, sceneVersion, true, graph.positionPreviewVersion) + ? 'backing' + : false } const positionPreviewVersion = graph.positionPreviewVersion const allowStaleZoom = now() < r.sceneBackingPreviewUntil @@ -542,7 +572,15 @@ export function renderSceneBacking( } const crisp = backingPixelGridMatchesLiveViewport(r) - r.sceneBackingNeedsCrispRender = !crisp || !!r.sceneBackingBuild + r.sceneBackingNeedsCrispRender = allowStaleZoom || !crisp || !!r.sceneBackingBuild + if ( + !allowStaleZoom && + !r.sceneBackingBuild && + backingMetadataMatches(r, sceneVersion, positionPreviewVersion) + ) { + drawSettledScene(r, canvas, graph, sceneVersion) + return 'retained-pictures' + } return drawSceneBacking( r, canvas, @@ -550,4 +588,6 @@ export function renderSceneBacking( allowStaleZoom || !!r.sceneBackingBuild, positionPreviewVersion ) + ? 'backing' + : false } diff --git a/tests/e2e/canvas/frame-overlays.spec.ts b/tests/e2e/canvas/frame-overlays.spec.ts index 6ba077bff..bf6f7ed3d 100644 --- a/tests/e2e/canvas/frame-overlays.spec.ts +++ b/tests/e2e/canvas/frame-overlays.spec.ts @@ -81,6 +81,19 @@ async function createOverlayDemo(rotation: number) { test('rotated frame selection labels render with hovered child', async () => { await createOverlayDemo(18) + const settled = await editor.canvas.screenshotCanvasRegion() + const release = await editor.page.evaluateHandle(() => { + const store = window.openPencil?.getStore?.() + if (!store) throw new Error('Editor unavailable') + return store.beginInteractiveEdit() + }) + try { + await editor.canvas.waitForRender() + expect((await editor.canvas.screenshotCanvasRegion()).equals(settled)).toBe(true) + } finally { + await release.evaluate((stop) => stop()) + await release.dispose() + } await expectCanvas('rotated-frame-selection-labels') }) diff --git a/tests/e2e/canvas/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-openpencil-darwin.png b/tests/e2e/canvas/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-openpencil-darwin.png index 6809354fa9c6c061222d953272c7eb7233382814..a806f23a04c9e34bdbb9dcae4b33c3dea78094e1 100644 GIT binary patch delta 52303 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 delta 52441 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�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 diff --git a/tests/e2e/canvas/retained-parity.spec.ts b/tests/e2e/canvas/retained-parity.spec.ts new file mode 100644 index 000000000..f40d818c1 --- /dev/null +++ b/tests/e2e/canvas/retained-parity.spec.ts @@ -0,0 +1,71 @@ +import { writeFile } from 'node:fs/promises' + +import { expect, test } from '#tests/e2e/fixtures' +import { CanvasHelper } from '#tests/helpers/canvas' + +for (const dpr of [1, 1.25, 1.5, 2]) { + test.describe(`retained raster parity at DPR ${dpr}`, () => { + test.use({ viewport: { width: 1111, height: 999 }, deviceScaleFactor: dpr }) + test('rounded geometry matches direct rendering after odd and even device pans', async ({ + page + }) => { + await page.goto('/?test&no-chrome&no-rulers&navigation-benchmark') + const canvas = new CanvasHelper(page) + await canvas.waitForInit() + await page.evaluate(() => { + const store = window.openPencil?.getStore?.() + if (!store) throw new Error('Editor unavailable') + const id = store.createShape('SECTION', 140, 140, 500, 350) + store.updateNode(id, { rotation: 25 }) + store.clearSelection() + }) + for (const devicePan of [0, 1, 2, -1, -2, 0.3]) { + await page.evaluate( + ({ devicePan, dpr }) => { + const store = window.openPencil?.getStore?.() + if (!store) throw new Error('Editor unavailable') + store.pan(devicePan / dpr - store.state.panX, -devicePan / dpr - store.state.panY) + }, + { devicePan, dpr } + ) + await page.evaluate(() => window.openPencil?.test?.navigation?.waitForSettlement()) + await canvas.waitForRender() + const retained = await canvas.screenshotCanvasRegion() + const metadata = await page.evaluate(() => { + const r = window.openPencil + ?.getStore?.() + .canvasRenderers.find((r) => r.tracksSceneSettlement) + return { + targetHeight: r?.surface.height(), + backingHeight: r?.sceneBacking?.image.height(), + marginY: r?.sceneBacking?.marginDeviceY, + anchorX: r?.sceneBacking?.anchorPanX, + anchorY: r?.sceneBacking?.anchorPanY, + panX: r?.panX, + panY: r?.panY + } + }) + const release = await page.evaluateHandle(() => { + const store = window.openPencil?.getStore?.() + if (!store) throw new Error('Editor unavailable') + return store.beginInteractiveEdit() + }) + try { + await canvas.waitForRender() + const direct = await canvas.screenshotCanvasRegion() + if (!direct.equals(retained)) { + await writeFile(test.info().outputPath('retained.png'), retained) + await writeFile(test.info().outputPath('direct.png'), direct) + } + expect(direct.equals(retained), JSON.stringify({ dpr, devicePan, ...metadata })).toBe( + true + ) + } finally { + await release.evaluate((stop) => stop()) + await release.dispose() + } + } + canvas.assertNoErrors() + }) + }) +} diff --git a/tests/engine/render/canvas/retained-backing-pixels.test.ts b/tests/engine/render/canvas/retained-backing-pixels.test.ts index 72fb42d05..e3432435b 100644 --- a/tests/engine/render/canvas/retained-backing-pixels.test.ts +++ b/tests/engine/render/canvas/retained-backing-pixels.test.ts @@ -1,4 +1,4 @@ -import { beforeAll, expect, test } from 'bun:test' +import { beforeAll, expect, spyOn, test } from 'bun:test' import { SceneGraph } from '@open-pencil/scene-graph' @@ -124,6 +124,44 @@ test('capped backing preserves the pixel grid after fractional pan and pixel-den } }) +test('settlement reuses pictures and the navigation image without another cache', () => { + const { graph, pageId } = createFixture() + const renderer = createRenderer(pageId) + try { + renderer.render(graph, new Set(), {}, 1, 'scene') + const backing = expectDefined(renderer.sceneBacking, 'backing') + const pictures = new Map( + [...renderer.subtreePictureCache].map(([id, entry]) => [id, entry.picture]) + ) + expect(pictures.size).toBeGreaterThan(0) + const nodeDraws = spyOn(renderer, 'renderNode') + const allocations = spyOn(renderer.surface, 'makeSurface') + try { + renderer.sceneBackingPreviewUntil = 0 + renderer.render(graph, new Set(), {}, 1, 'scene') + expect(renderer.profiler.stats.scenePictureMissReason).toBe('retained-pictures') + expect(renderer.sceneBacking).toBe(backing) + expect(renderer.scenePicture).toBeNull() + expect(renderer.subtreePictureCache.size).toBe(pictures.size) + for (const [id, picture] of pictures) + expect(renderer.subtreePictureCache.get(id)?.picture).toBe(picture) + expect(nodeDraws).not.toHaveBeenCalled() + expect(allocations).not.toHaveBeenCalled() + renderer.navigationPhase = 'pan' + renderer.render(graph, new Set(), {}, 1, 'scene') + expect(renderer.profiler.stats.scenePictureMissReason).toBe('backing') + expect(renderer.sceneBacking).toBe(backing) + expect(nodeDraws).not.toHaveBeenCalled() + expect(allocations).not.toHaveBeenCalled() + } finally { + nodeDraws.mockRestore() + allocations.mockRestore() + } + } finally { + renderer.destroy() + } +}) + test('active edits draw directly without replacing the overscan backing', () => { const { graph, pageId } = createFixture() const renderer = createRenderer(pageId) diff --git a/tests/engine/render/canvas/retained-backing.test.ts b/tests/engine/render/canvas/retained-backing.test.ts index 742e4122e..71b77e4cd 100644 --- a/tests/engine/render/canvas/retained-backing.test.ts +++ b/tests/engine/render/canvas/retained-backing.test.ts @@ -40,6 +40,7 @@ function createRenderer(surfaceFactory: (info: ImageInfo) => Surface | null) { viewportHeight: 100, pageColor: { r: 1, g: 1, b: 1 }, pageId: 'page', + navigationPhase: 'idle', sceneBacking: null, sceneBackingBuild: null, sceneBackingAllocationFailed: false, @@ -63,7 +64,11 @@ function createRenderer(surfaceFactory: (info: ImageInfo) => Surface | null) { function createCanvas() { const canvas: Partial = { drawImageRect: mock(), - drawImageRectOptions: mock() + drawImageRectOptions: mock(), + save: mock(), + restore: mock(), + translate: mock(), + scale: mock() } return canvas as Canvas } @@ -235,7 +240,7 @@ test('retained scene backing filters cross-zoom previews instead of falling back const canvas = createCanvas() const graph = createGraph() - expect(renderSceneBacking(r, canvas, graph, 1)).toBe(true) + expect(renderSceneBacking(r, canvas, graph, 1)).toBe('backing') expect(canvas.drawImageRectOptions).toHaveBeenCalledWith( r.sceneBacking.image, expect.anything(), @@ -273,8 +278,15 @@ test('retained scene backing allows same-zoom previews while panning', () => { const canvas = createCanvas() const graph = createGraph() - expect(renderSceneBacking(r, canvas, graph, 1)).toBe(true) - expect(canvas.drawImageRectOptions).toHaveBeenCalled() + expect(renderSceneBacking(r, canvas, graph, 1)).toBe('backing') + expect(canvas.drawImageRectOptions).toHaveBeenCalledTimes(1) + expect(r.sceneBackingNeedsCrispRender).toBe(true) + + r.sceneBackingPreviewUntil = 0 + expect(renderSceneBacking(r, canvas, graph, 1)).toBe('retained-pictures') + expect(r.sceneBackingNeedsCrispRender).toBe(false) + expect(canvas.drawImageRectOptions).toHaveBeenCalledTimes(1) + expect(r.surface.makeSurface).not.toHaveBeenCalled() }) test('retained scene backing invalidates stale position-preview metadata', () => {