统一画布视口缩放兜底逻辑

提取 getSafeViewportScale 供 world transform 与逆缩放变量复用

导出共享缩放辅助函数并保持现有渲染行为
This commit is contained in:
2026-09-09 11:23:10 +08:00
parent 3acfaa3795
commit b4595d3125
3 changed files with 14 additions and 5 deletions
@@ -7,6 +7,7 @@ import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';
import {
CANVAS_RENDER_SUPERSAMPLE,
canvasViewportToWorldTransform,
getSafeViewportScale,
} from './canvasWorldRendering';
export function CanvasWorld({
@@ -21,8 +22,7 @@ export function CanvasWorld({
viewport: CanvasViewport;
worldSize?: number;
}) {
const viewportScale =
Number.isFinite(viewport.scale) && viewport.scale > 0 ? viewport.scale : 1;
const viewportScale = getSafeViewportScale(viewport);
return (
<div
@@ -2,9 +2,15 @@ import type { CanvasViewport } from '@genarrative/image-canvas-core';
export const CANVAS_RENDER_SUPERSAMPLE = 2;
/** 将 viewport scale 规范化为可用于渲染和反向缩放的正有限值。 */
export function getSafeViewportScale(viewport: CanvasViewport) {
return Number.isFinite(viewport.scale) && viewport.scale > 0
? viewport.scale
: 1;
}
/** 将逻辑 viewport 转换为 world 的渲染 transform。 */
export function canvasViewportToWorldTransform(viewport: CanvasViewport) {
const scale =
Number.isFinite(viewport.scale) && viewport.scale > 0 ? viewport.scale : 1;
const scale = getSafeViewportScale(viewport);
return `translate(${viewport.x}px, ${viewport.y}px) scale(${scale / CANVAS_RENDER_SUPERSAMPLE})`;
}
+4 -1
View File
@@ -2,7 +2,10 @@ export * from './CanvasChrome';
export * from './CanvasPortal';
export * from './CanvasViewport';
export * from './CanvasWorld';
export { canvasViewportToWorldTransform } from './canvasWorldRendering';
export {
canvasViewportToWorldTransform,
getSafeViewportScale,
} from './canvasWorldRendering';
export * from './LayerRenderer';
export * from './Minimap';
export * from './SelectionOverlay';