packages/core/src/canvas/picture.ts (50 lines of code) (raw):

import type { Canvas } from '../canvas' import { Log } from '../foundation' import { NonConstructiable } from '../foundation/non-constructible' import { Rect } from '../math' export type PictureVersion = '1.0.0' export type DrawOpName = keyof Canvas export type DrawOp = { name: DrawOpName args?: any[] } export interface Picture { readonly id: number readonly version: PictureVersion readonly drawOps: DrawOp[] readonly cullRect: Rect readonly hasDrawText: boolean } export class Picture extends NonConstructiable { private static nextId = 0 static from( drawOps: DrawOp[], cullRect: Rect, hasDrawText: boolean, ): Picture { return { id: Picture.nextId++, version: '1.0.0', drawOps, cullRect, hasDrawText, } } static playback(picture: Picture, canvas: Canvas): void { Picture.draw( picture.drawOps, canvas, ) } @Log({ disabled: true }) private static draw(ops: DrawOp[], canvas: Canvas) { for (const { name, args } of ops) { const fn = canvas[name] as (...args: any[]) => void if (args) { fn.apply(canvas, args) } else { fn.apply(canvas) } } } }