Revert "Remove per-draw canvas clones; title nav cap + right-page-number labels"

This reverts commit 0f66dae4eb.
This commit is contained in:
2026-06-20 07:37:12 +02:00
parent 0f66dae4eb
commit 7f60ce0d63
3 changed files with 29 additions and 43 deletions
+19 -7
View File
@@ -53,6 +53,7 @@ class BookTextureRendererModule extends BaseModule {
'drawSpreadSerial',
'rasterizeSpread',
'getDrawSignature',
'cloneCanvas',
'buildRevealRegions',
'shouldFlipAfterSideReveal',
'collectRevealRegionCandidates',
@@ -372,6 +373,15 @@ class BookTextureRendererModule extends BaseModule {
}).join('|');
}
cloneCanvas(canvas) {
if (!canvas) return null;
const clone = document.createElement('canvas');
clone.width = canvas.width;
clone.height = canvas.height;
const context = clone.getContext('2d');
if (context) context.drawImage(canvas, 0, 0);
return clone;
}
getPageContent(side = 'left') {
return this.metrics?.contentBySide?.[side] || this.metrics?.content || {
@@ -943,17 +953,19 @@ class BookTextureRendererModule extends BaseModule {
pageMeta: this.buildPublishPageMeta(sidesToPublish),
phase
};
// The page-texture-records event is dispatched synchronously below, and its handler
// uploads the canvas to a GPU texture synchronously (renderer.initTexture). So the live
// page canvas (and the static cached base) are consumed before the next draw can touch
// them — no per-draw clones needed (those large canvas copies drove the GC stalls).
if (sidesToPublish.includes('left')) detail.left = this.canvases.left;
if (sidesToPublish.includes('right')) detail.right = this.canvases.right;
if (sidesToPublish.includes('left')) {
detail.left = phase === 'prepare' ? this.cloneCanvas(this.canvases.left) : this.canvases.left;
}
if (sidesToPublish.includes('right')) {
detail.right = phase === 'prepare' ? this.cloneCanvas(this.canvases.right) : this.canvases.right;
}
const reveal = {};
sidesToPublish.forEach((side) => {
const sideReveal = this.buildRevealRegions(side);
if (!sideReveal) return;
sideReveal.baseCanvas = this.revealBaseCanvases?.[side] || null;
sideReveal.baseCanvas = phase === 'prepare'
? this.cloneCanvas(this.revealBaseCanvases?.[side])
: this.revealBaseCanvases?.[side] || null;
regionCounts[side] = sideReveal.lineRects.length;
reveal[side] = sideReveal;
});