Files
ttstd-infinite-canvas/web/src/lib/canvas/canvas-leafer-viewport.ts

25 lines
1023 B
TypeScript

import type { ViewportTransform } from "@/types/canvas";
const MIN_VIEWPORT_SCALE = 0.05;
const MIN_PREVIEW_RATIO = 0.85;
const MAX_PREVIEW_RATIO = 1.25;
export function calculateCanvasPreviewTransform(viewport: ViewportTransform, rasterViewport: ViewportTransform) {
const ratio = viewport.k / Math.max(rasterViewport.k, MIN_VIEWPORT_SCALE);
// 将旧 backing store 的屏幕坐标映射到实时视口,避免缩放手势逐帧触发矢量重绘。
return {
ratio,
x: viewport.x - rasterViewport.x * ratio,
y: viewport.y - rasterViewport.y * ratio,
};
}
export function shouldRebaseCanvasRaster(viewport: ViewportTransform, rasterViewport: ViewportTransform) {
const { ratio } = calculateCanvasPreviewTransform(viewport, rasterViewport);
return ratio < MIN_PREVIEW_RATIO || ratio > MAX_PREVIEW_RATIO;
}
export function sameCanvasViewport(left: ViewportTransform, right: ViewportTransform) {
return left.x === right.x && left.y === right.y && left.k === right.k;
}