kei-lisp-plugin-graphics 3.0.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -13
- package/dist/index.cjs +303 -640
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -28
- package/dist/index.d.ts +28 -28
- package/dist/index.js +304 -641
- package/dist/index.js.map +1 -1
- package/lisp/animation.lisp +17 -0
- package/lisp/grid.lisp +26 -0
- package/lisp/palette.lisp +28 -0
- package/package.json +11 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#builtInFunctions","#setup","#imageCache","#print","#applyGradientStops","#execute","#listValues","#withImage","#enumString","#downloadCanvas","#writeCanvasToFile","#numbers","#toList","#installGradient"],"sources":["../src/GraphicsPlugin/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-math-min-max,\n sonarjs/no-nested-conditional,\n sonarjs/no-duplicate-string */\n\n// These lint rules are disabled file-wide so the ported handlers can preserve\n// the legacy Graphist patterns (clamp ternaries, mode-flag ternaries,\n// repeated diagnostic strings) without per-line escape hatches.\n\nimport type { KeiLispPlugin, LispValue, PluginContext } from 'kei-lisp';\nimport { Cons, InterpretedSymbol } from 'kei-lisp';\n\n// Allowed values for the enum-string setters, mirroring the Canvas 2D API\n// types. Invalid values are rejected with a diagnostic instead of being\n// silently ignored by the canvas.\nconst LINE_CAPS = new Set<string>(['butt', 'round', 'square']);\nconst LINE_JOINS = new Set<string>(['miter', 'round', 'bevel']);\nconst TEXT_ALIGNS = new Set<string>(['left', 'right', 'center', 'start', 'end']);\nconst TEXT_BASELINES = new Set<string>([\n 'top',\n 'hanging',\n 'middle',\n 'alphabetic',\n 'ideographic',\n 'bottom',\n]);\nconst TEXT_DIRECTIONS = new Set<string>(['ltr', 'rtl', 'inherit']);\nconst FONT_KERNINGS = new Set<string>(['auto', 'normal', 'none']);\nconst FONT_STRETCHES = new Set<string>([\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n]);\nconst FONT_VARIANTS = new Set<string>([\n 'normal',\n 'small-caps',\n 'all-small-caps',\n 'petite-caps',\n 'all-petite-caps',\n 'unicase',\n 'titling-caps',\n]);\nconst TEXT_RENDERINGS = new Set<string>([\n 'auto',\n 'optimizeSpeed',\n 'optimizeLegibility',\n 'geometricPrecision',\n]);\nconst PATTERN_REPETITIONS = new Set<string>(['repeat', 'repeat-x', 'repeat-y', 'no-repeat']);\nconst COMPOSITE_OPERATIONS = new Set<string>([\n 'source-over',\n 'source-in',\n 'source-out',\n 'source-atop',\n 'destination-over',\n 'destination-in',\n 'destination-out',\n 'destination-atop',\n 'lighter',\n 'copy',\n 'xor',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n]);\n\n/**\n * @class\n * @classdesc Canvas2D drawing plugin for the kei-lisp interpreter. Implements\n * the `KeiLispPlugin` contract (`name` / `has` / `apply`) and\n * exposes 75 `g…` Lisp functions (plus two deprecated aliases)\n * that proxy to a 2D rendering context.\n * @author Keisuke Ikeda\n */\nexport class GraphicsPlugin implements KeiLispPlugin {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of\n * the GraphicsPlugin method that implements it. Private so hosts cannot\n * mutate the registered function set.\n */\n static readonly #builtInFunctions: Map<InterpretedSymbol, string> = GraphicsPlugin.#setup();\n\n /**\n * Lists every Lisp function name this plugin registers.\n * @return the sorted `g…` function names\n */\n static functionNames(): string[] {\n // Iterator helpers and Array#toSorted are not typed under the ES2022 lib\n // this project compiles against, so spread the iterator and sort a copy.\n return (\n // eslint-disable-next-line unicorn/prefer-iterator-to-array\n [...GraphicsPlugin.#builtInFunctions.keys()]\n .map(String)\n // Array#toSorted is not typed under the ES2022 lib this project\n // compiles against, so sort a fresh copy in place.\n // eslint-disable-next-line unicorn/no-array-sort\n .sort((a, b) => a.localeCompare(b))\n );\n }\n\n /**\n * Builds the dispatch table.\n * @return the dispatch table\n */\n static #setup(): Map<InterpretedSymbol, string> {\n const aTable = new Map<InterpretedSymbol, string>();\n aTable.set(InterpretedSymbol.of('galpha'), 'gAlpha');\n aTable.set(InterpretedSymbol.of('garc'), 'gArc');\n aTable.set(InterpretedSymbol.of('garc-to'), 'gArcTo');\n aTable.set(InterpretedSymbol.of('gbezcurve-to'), 'gBezCurveTo');\n aTable.set(InterpretedSymbol.of('gclear'), 'gClear');\n aTable.set(InterpretedSymbol.of('gclose'), 'gClose');\n aTable.set(InterpretedSymbol.of('gcolor'), 'gColor');\n aTable.set(InterpretedSymbol.of('gfill'), 'gFill');\n aTable.set(InterpretedSymbol.of('gfill-color'), 'gFillColor');\n aTable.set(InterpretedSymbol.of('gfill-rect'), 'gFillRect');\n aTable.set(InterpretedSymbol.of('gfill-text'), 'gFillText');\n aTable.set(InterpretedSymbol.of('gfill-tri'), 'gFillTri');\n aTable.set(InterpretedSymbol.of('gfinish-path'), 'gFinishPath');\n aTable.set(InterpretedSymbol.of('gimage'), 'gImage');\n aTable.set(InterpretedSymbol.of('gmove-to'), 'gMoveTo');\n aTable.set(InterpretedSymbol.of('gline-to'), 'gLineTo');\n aTable.set(InterpretedSymbol.of('gline-cap'), 'gLineCap');\n aTable.set(InterpretedSymbol.of('gline-join'), 'gLineJoin');\n aTable.set(InterpretedSymbol.of('gline-width'), 'gLineWidth');\n aTable.set(InterpretedSymbol.of('gopen'), 'gOpen');\n aTable.set(InterpretedSymbol.of('gpattern'), 'gPattern');\n aTable.set(InterpretedSymbol.of('gquadcurve-to'), 'gQuadCurveTo');\n aTable.set(InterpretedSymbol.of('gsave-jpeg'), 'gSaveJpeg');\n aTable.set(InterpretedSymbol.of('gsave-png'), 'gSavePng');\n aTable.set(InterpretedSymbol.of('gscale'), 'gScale');\n aTable.set(InterpretedSymbol.of('gshadow-blur'), 'gShadowBlur');\n aTable.set(InterpretedSymbol.of('gshadow-color'), 'gShadowColor');\n aTable.set(InterpretedSymbol.of('gshadow-offsetx'), 'gShadowOffsetX');\n aTable.set(InterpretedSymbol.of('gshadow-offsety'), 'gShadowOffsetY');\n aTable.set(InterpretedSymbol.of('gsleep'), 'gSleep');\n aTable.set(InterpretedSymbol.of('gstart-path'), 'gStartPath');\n aTable.set(InterpretedSymbol.of('gstroke'), 'gStroke');\n aTable.set(InterpretedSymbol.of('gstroke-color'), 'gStrokeColor');\n aTable.set(InterpretedSymbol.of('gstroke-rect'), 'gStrokeRect');\n aTable.set(InterpretedSymbol.of('gstroke-text'), 'gStrokeText');\n aTable.set(InterpretedSymbol.of('gstroke-tri'), 'gStrokeTri');\n aTable.set(InterpretedSymbol.of('gtext-align'), 'gTextAlign');\n aTable.set(InterpretedSymbol.of('gtext-direction'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-font'), 'gTextFont');\n aTable.set(InterpretedSymbol.of('gtext-baseline'), 'gTextBaseline');\n // Deprecated aliases kept for backward compatibility with the legacy\n // Graphist names; prefer gtext-direction / gtext-baseline.\n aTable.set(InterpretedSymbol.of('gtext-dire'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-line'), 'gTextBaseline');\n aTable.set(InterpretedSymbol.of('gtranslate'), 'gTranslate');\n aTable.set(InterpretedSymbol.of('grect'), 'gRect');\n aTable.set(InterpretedSymbol.of('grotate'), 'gRotate');\n aTable.set(InterpretedSymbol.of('gsave'), 'gSave');\n aTable.set(InterpretedSymbol.of('grestore'), 'gRestore');\n aTable.set(InterpretedSymbol.of('gellipse'), 'gEllipse');\n aTable.set(InterpretedSymbol.of('ground-rect'), 'gRoundRect');\n aTable.set(InterpretedSymbol.of('gline-dash'), 'gLineDash');\n aTable.set(InterpretedSymbol.of('gline-dash-offset'), 'gLineDashOffset');\n aTable.set(InterpretedSymbol.of('gmiter-limit'), 'gMiterLimit');\n aTable.set(InterpretedSymbol.of('gclip'), 'gClip');\n aTable.set(InterpretedSymbol.of('gis-point-in-path'), 'gIsPointInPath');\n aTable.set(InterpretedSymbol.of('gis-point-in-stroke'), 'gIsPointInStroke');\n aTable.set(InterpretedSymbol.of('gtransform'), 'gTransform');\n aTable.set(InterpretedSymbol.of('gset-transform'), 'gSetTransform');\n aTable.set(InterpretedSymbol.of('greset-transform'), 'gResetTransform');\n aTable.set(InterpretedSymbol.of('gcomposite'), 'gComposite');\n aTable.set(InterpretedSymbol.of('gfilter'), 'gFilter');\n aTable.set(InterpretedSymbol.of('gimage-smoothing'), 'gImageSmoothing');\n aTable.set(InterpretedSymbol.of('gmeasure-text'), 'gMeasureText');\n aTable.set(InterpretedSymbol.of('gletter-spacing'), 'gLetterSpacing');\n aTable.set(InterpretedSymbol.of('gword-spacing'), 'gWordSpacing');\n aTable.set(InterpretedSymbol.of('gfont-kerning'), 'gFontKerning');\n aTable.set(InterpretedSymbol.of('gfont-stretch'), 'gFontStretch');\n aTable.set(InterpretedSymbol.of('gfont-variant'), 'gFontVariant');\n aTable.set(InterpretedSymbol.of('gtext-rendering'), 'gTextRendering');\n aTable.set(InterpretedSymbol.of('gclear-rect'), 'gClearRect');\n aTable.set(InterpretedSymbol.of('greset'), 'gReset');\n aTable.set(InterpretedSymbol.of('gwidth'), 'gWidth');\n aTable.set(InterpretedSymbol.of('gheight'), 'gHeight');\n aTable.set(InterpretedSymbol.of('gpixel'), 'gPixel');\n aTable.set(InterpretedSymbol.of('gset-pixel'), 'gSetPixel');\n aTable.set(InterpretedSymbol.of('glinear-gradient'), 'gLinearGradient');\n aTable.set(InterpretedSymbol.of('gradial-gradient'), 'gRadialGradient');\n aTable.set(InterpretedSymbol.of('gconic-gradient'), 'gConicGradient');\n return aTable;\n }\n\n /**\n * Loaded-image cache shared by `gimage` and `gpattern`. Repeated draws of\n * the same `src` reuse the loaded element and run synchronously, so they\n * keep their place in the drawing order instead of racing the load.\n */\n readonly #imageCache = new Map<string, HTMLImageElement>();\n\n /**\n * Plugin identifier, used for diagnostics.\n */\n readonly name: string = 'graphics';\n\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n isOpen: boolean;\n\n /**\n * Constructor.\n * @constructor\n * @param canvas - the canvas to draw to\n */\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas) {\n this.canvas = canvas;\n this.ctx = canvas.getContext('2d');\n this.isOpen = false;\n }\n\n /**\n * Writes a diagnostic line to `process.stderr`, matching the convention\n * used by kei-lisp itself (`Applier.format` writes to `process.stdout`).\n * In a Node runtime this hits the real stderr; in a browser kei-lisp host\n * (e.g. kei-lisp-web) the host typically swaps `process.stderr.write` for\n * a sink that routes to the REPL output panel. In a plain browser with no\n * `process` shim at all, the line falls back to `console.error` instead of\n * throwing.\n * @param line - the line to write\n */\n #print(line: string): void {\n const stderr = (globalThis as { process?: { stderr?: { write?: (chunk: string) => boolean } } })\n .process?.stderr;\n if (typeof stderr?.write === 'function') {\n stderr.write(line + '\\n');\n return;\n }\n console.error(line);\n }\n\n /**\n * Resolves an image for the given source and runs `draw` with it —\n * synchronously when the image is already loaded, on its `load` event\n * otherwise. A load failure prints a diagnostic once.\n * @param source - the image URL / data URI\n * @param draw - the drawing action to run once the image is available\n */\n #withImage(source: string, draw: (image: HTMLImageElement) => void): void {\n const cached = this.#imageCache.get(source);\n const image = cached ?? new Image();\n if (cached === undefined) {\n image.src = source;\n this.#imageCache.set(source, image);\n image.addEventListener('error', () => {\n this.#print(`Can not load image: ${source}`);\n });\n }\n if (image.complete) {\n draw(image);\n return;\n }\n image.addEventListener('load', () => {\n draw(image);\n });\n }\n\n /**\n * Shared guard-and-dispatch skeleton for the newer `g…` methods: checks the\n * context and the open flag, runs `body`, and converts both a `null` return\n * and a thrown exception into `failureMessage` + `Cons.nil`.\n * @param failureMessage - the diagnostic printed when `body` fails\n * @param body - the drawing action; returns the Lisp result, or `null` on\n * bad arguments\n * @return the body's result, or `Cons.nil` on failure\n */\n #execute(\n failureMessage: string,\n body: (\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n ) => LispValue | null,\n ): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (!this.isOpen) {\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n try {\n const result = body(this.ctx);\n if (result !== null) return result;\n } catch {\n // fall through to the failure message\n }\n this.#print(failureMessage);\n return Cons.nil;\n }\n\n /**\n * Reads a single string argument and validates it against an allowlist.\n * @param arguments_ - the evaluated argument list\n * @param allowed - the accepted values\n * @return the validated string, or `null` on wrong arity, a non-string\n * argument, or a value outside the allowlist\n */\n #enumString(arguments_: Cons, allowed: ReadonlySet<string>): string | null {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n return allowed.has(arguments_.car) ? arguments_.car : null;\n }\n\n /**\n * Reads exactly `count` numbers from the argument list.\n * @param arguments_ - the evaluated argument list\n * @param count - the expected argument count\n * @return the numbers, or `null` on wrong arity or a non-number argument\n */\n #numbers(arguments_: Cons, count: number): number[] | null {\n if (arguments_.length() !== count) return null;\n const values: number[] = [];\n let rest = arguments_;\n for (let index = 0; index < count; index++) {\n if (!Cons.isNumber(rest.car)) return null;\n values.push(rest.car);\n rest = rest.cdr as Cons;\n }\n return values;\n }\n\n /**\n * Flattens the argument list into a JS array.\n * @param arguments_ - the evaluated argument list\n * @return the argument values in order\n */\n #listValues(arguments_: Cons): LispValue[] {\n const values: LispValue[] = [];\n let rest = arguments_;\n for (let index = arguments_.length(); index > 0; index--) {\n values.push(rest.car);\n rest = rest.cdr as Cons;\n }\n return values;\n }\n\n /**\n * Builds a Lisp list (Cons chain) from JS values.\n * @param values - the values, at least one\n * @return the list head\n */\n #toList(values: LispValue[]): Cons {\n const head = new Cons(values[0]);\n let tail = head;\n for (let index = 1; index < values.length; index++) {\n tail.cdr = new Cons(values[index]);\n tail = tail.cdr;\n }\n return head;\n }\n\n /**\n * Applies `(offset color)` pairs to a gradient.\n * @param gradient - the gradient to add stops to\n * @param stops - alternating numeric offsets (0–1) and CSS color strings\n * @return true when every pair was valid and at least one was applied\n */\n #applyGradientStops(gradient: CanvasGradient, stops: LispValue[]): boolean {\n if (stops.length === 0 || stops.length % 2 !== 0) return false;\n for (let index = 0; index < stops.length; index += 2) {\n const offset = stops[index];\n const color = stops[index + 1];\n if (!Cons.isNumber(offset) || !Cons.isString(color)) return false;\n gradient.addColorStop(offset, color);\n }\n return true;\n }\n\n /**\n * Sets both `fillStyle` and `strokeStyle` to the given gradient after\n * applying its stops, mirroring how `gcolor` sets both styles at once.\n * @param context - the 2D context\n * @param gradient - the gradient to install\n * @param stops - alternating offsets and colors (see #applyGradientStops)\n * @return `t` on success, `null` on invalid stops\n */\n #installGradient(\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n gradient: CanvasGradient,\n stops: LispValue[],\n ): LispValue | null {\n if (!this.#applyGradientStops(gradient, stops)) return null;\n context.fillStyle = gradient;\n context.strokeStyle = gradient;\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Encodes the canvas via `toDataURL` and triggers a browser download through\n * a temporary `<a download>` element. Requires a DOM (`document`) and an\n * `HTMLCanvasElement`; `OffscreenCanvas` has no `toDataURL`, and Node.js has\n * no `document` — those callers must pass a file path instead.\n * @param mimeType - the image MIME type to encode\n * @param label - the format name used in diagnostics (\"jpeg\" / \"png\")\n * @return `t` on success, `Cons.nil` otherwise\n */\n #downloadCanvas(mimeType: string, label: string): LispValue {\n if (typeof document === 'undefined' || !('toDataURL' in this.canvas)) {\n this.#print(\n `Can not save ${label}. Browser download needs a DOM and an HTMLCanvasElement; pass a file path to save on Node.js.`,\n );\n return Cons.nil;\n }\n try {\n const link = document.createElement('a');\n link.href = this.canvas.toDataURL(mimeType);\n link.download = 'canvas';\n document.body.append(link);\n link.click();\n link.remove();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print(\n `Can not save ${label}. If you are using an image in the canvas, you can't save ${label}.`,\n );\n return Cons.nil;\n }\n }\n\n /**\n * Writes the encoded canvas image to a file path on Node.js, using\n * `process.getBuiltinModule('node:fs')` so browser bundles never see a\n * `node:fs` import. `HTMLCanvasElement` (and node-canvas) encode\n * synchronously via `toDataURL`; `OffscreenCanvas` only offers the async\n * `convertToBlob`, so its file is written after this returns — the same\n * fire-and-forget contract as `gImage`.\n * @param path - the destination file path\n * @param mimeType - the image MIME type to encode\n * @param label - the format name used in diagnostics (\"jpeg\" / \"png\")\n * @return `t` on success, `Cons.nil` otherwise\n */\n #writeCanvasToFile(path: string, mimeType: string, label: string): LispValue {\n const fs =\n typeof process.getBuiltinModule === 'function'\n ? process.getBuiltinModule('node:fs')\n : undefined;\n if (fs === undefined) {\n this.#print(`Can not save ${label}. Saving to a file path requires Node.js.`);\n return Cons.nil;\n }\n try {\n if ('toDataURL' in this.canvas) {\n const dataUrl = this.canvas.toDataURL(mimeType);\n const base64 = dataUrl.slice(dataUrl.indexOf(',') + 1);\n // Uint8Array.fromBase64 is unavailable on Node 24 (the minimum supported\n // engine), so decode with Buffer instead.\n // eslint-disable-next-line unicorn/prefer-uint8array-base64\n fs.writeFileSync(path, Buffer.from(base64, 'base64'));\n return InterpretedSymbol.of('t');\n }\n void this.canvas.convertToBlob({ type: mimeType }).then(async (blob) => {\n fs.writeFileSync(path, new Uint8Array(await blob.arrayBuffer()));\n });\n return InterpretedSymbol.of('t');\n } catch {\n this.#print(`Can not save ${label}.`);\n return Cons.nil;\n }\n }\n\n /**\n * Returns true if this plugin handles the given symbol.\n * @param aSymbol - the call symbol\n * @return true if `apply` should be called\n */\n has(aSymbol: InterpretedSymbol): boolean {\n return GraphicsPlugin.#builtInFunctions.has(aSymbol);\n }\n\n /**\n * Dispatches the given symbol to the matching `g…` method.\n * @param aSymbol - the call symbol\n * @param arguments_ - the evaluated argument list\n * @param _context - the interpreter context (unused by this plugin)\n * @return the method's result, or `Cons.nil` if dispatch fails\n */\n apply(aSymbol: InterpretedSymbol, arguments_: Cons, _context: PluginContext): LispValue {\n const methodName = GraphicsPlugin.#builtInFunctions.get(aSymbol);\n if (methodName === undefined) {\n this.#print(`I could find no procedure description for ${String(aSymbol)}`);\n return Cons.nil;\n }\n const target = this as unknown as Record<string, (arguments__: Cons) => LispValue>;\n return target[methodName].call(this, arguments_);\n }\n\n /**\n * Checks whether the canvas exposes a usable 2D context, and narrows\n * `this.ctx` to non-null for the caller when it returns true.\n * @return type predicate — true when context is non-null\n */\n checkSupport(): this is GraphicsPlugin & {\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n } {\n if (this.ctx === null) {\n this.#print('Unable to initialize canvas. The browser or machine may not support it.');\n return false;\n }\n return true;\n }\n\n gAlpha(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n const aNumber = arguments_.car <= 0 ? 0 : arguments_.car >= 1 ? 1 : arguments_.car;\n this.ctx.globalAlpha = aNumber;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set alpha.');\n return Cons.nil;\n } catch {\n this.#print('Can not set alpha.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gArc(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 6) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n const cdr4 = cdr3.cdr as Cons;\n const a4 = cdr4.car;\n const cdr5 = cdr4.cdr as Cons;\n const a5 = cdr5.car;\n if (\n Cons.isNumber(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4) &&\n Cons.isNumber(a5)\n ) {\n const isAFlag = a5 >= 0;\n this.ctx.arc(a0, a1, a2, (Math.PI / 180) * a3, (Math.PI / 180) * a4, isAFlag);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw arc.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw arc.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gArcTo(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 5) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n const cdr4 = cdr3.cdr as Cons;\n const a4 = cdr4.car;\n if (\n Cons.isNumber(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4)\n ) {\n this.ctx.arcTo(a0, a1, a2, a3, a4);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw arc to.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw arc to.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gBezCurveTo(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 6) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n const cdr4 = cdr3.cdr as Cons;\n const a4 = cdr4.car;\n const cdr5 = cdr4.cdr as Cons;\n const a5 = cdr5.car;\n if (\n Cons.isNumber(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4) &&\n Cons.isNumber(a5)\n ) {\n this.ctx.bezierCurveTo(a0, a1, a2, a3, a4, a5);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw bezier curve.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw bezier curve.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gClear(arguments_: Cons): LispValue {\n return this.#execute('Can not clear.', (context) => {\n const aColor = arguments_.length() === 0 ? '#ffffff' : this.selectColor(arguments_);\n const previous = context.fillStyle;\n context.fillStyle = aColor;\n context.fillRect(0, 0, this.canvas.width, this.canvas.height);\n context.fillStyle = previous;\n return InterpretedSymbol.of('t');\n });\n }\n\n gClose(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.isOpen = false;\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not close.');\n return Cons.nil;\n }\n }\n this.#print('The canvas has already been closed.');\n return Cons.nil;\n }\n\n gColor(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() >= 1) {\n const aColor = this.selectColor(arguments_);\n this.ctx.fillStyle = aColor;\n this.ctx.strokeStyle = aColor;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set color.');\n return Cons.nil;\n } catch {\n this.#print('Can not set color.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gFill(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.fill();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not fill.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gFillColor(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() >= 1) {\n const aColor = this.selectColor(arguments_);\n this.ctx.fillStyle = aColor;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set fill color.');\n return Cons.nil;\n } catch {\n this.#print('Can not set fill color.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gFillRect(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 4) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2) && Cons.isNumber(a3)) {\n this.ctx.fillRect(a0, a1, a2, a3);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw fill rectangle.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw fill rectangle.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gFillText(arguments_: Cons): LispValue {\n return this.#execute('Can not draw fill text.', (context) => {\n const length_ = arguments_.length();\n if (length_ !== 3 && length_ !== 4) return null;\n const [a0, a1, a2, a3] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isNumber(a1) || !Cons.isNumber(a2)) return null;\n if (length_ === 4) {\n if (!Cons.isNumber(a3)) return null;\n context.fillText(a0, a1, a2, a3);\n } else {\n context.fillText(a0, a1, a2);\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gFillTri(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 6) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n const cdr4 = cdr3.cdr as Cons;\n const a4 = cdr4.car;\n const cdr5 = cdr4.cdr as Cons;\n const a5 = cdr5.car;\n if (\n Cons.isNumber(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4) &&\n Cons.isNumber(a5)\n ) {\n this.ctx.beginPath();\n this.ctx.moveTo(a0, a1);\n this.ctx.lineTo(a2, a3);\n this.ctx.lineTo(a4, a5);\n this.ctx.fill();\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw fill triangle.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw fill triangle.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gFinishPath(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.closePath();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not finish path.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gImage(arguments_: Cons): LispValue {\n return this.#execute('Can not draw Image.', (context) => {\n const length_ = arguments_.length();\n if (length_ !== 3 && length_ !== 5) return null;\n const [a0, a1, a2, a3, a4] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isNumber(a1) || !Cons.isNumber(a2)) return null;\n if (length_ === 5) {\n if (!Cons.isNumber(a3) || !Cons.isNumber(a4)) return null;\n this.#withImage(a0, (image) => {\n context.drawImage(image, a1, a2, a3, a4);\n });\n } else {\n this.#withImage(a0, (image) => {\n context.drawImage(image, a1, a2);\n });\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineTo(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 2) {\n const a0 = arguments_.car;\n const a1 = (arguments_.cdr as Cons).car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1)) {\n this.ctx.lineTo(a0, a1);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw line to');\n return Cons.nil;\n } catch {\n this.#print('Can not draw line to');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gLineCap(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set line cap. Expected \"butt\" / \"round\" / \"square\".',\n (context) => {\n const value = this.#enumString(arguments_, LINE_CAPS);\n if (value === null) return null;\n context.lineCap = value as CanvasLineCap;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gLineJoin(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set line join. Expected \"miter\" / \"round\" / \"bevel\".',\n (context) => {\n const value = this.#enumString(arguments_, LINE_JOINS);\n if (value === null) return null;\n context.lineJoin = value as CanvasLineJoin;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gLineWidth(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n const aNumber = arguments_.car <= 0 ? 1 : arguments_.car;\n this.ctx.lineWidth = aNumber;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line width.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line width.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gMoveTo(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 2) {\n const a0 = arguments_.car;\n const a1 = (arguments_.cdr as Cons).car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1)) {\n this.ctx.moveTo(a0, a1);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not move');\n return Cons.nil;\n } catch {\n this.#print('Can not move');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gOpen(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (!this.isOpen) {\n try {\n this.isOpen = true;\n this.ctx.fillStyle = '#ffffff';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n this.ctx.fillStyle = '#000000';\n this.#print(`canvas size, width : ${this.canvas.width} height : ${this.canvas.height}`);\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not open.');\n return Cons.nil;\n }\n }\n this.#print('The canvas has already been opened.');\n return Cons.nil;\n }\n\n gPattern(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set pattern. Expected an image source and a repetition (\"repeat\" / \"repeat-x\" / \"repeat-y\" / \"no-repeat\").',\n (context) => {\n if (arguments_.length() !== 2) return null;\n const [a0, a1] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isString(a1) || !PATTERN_REPETITIONS.has(a1)) return null;\n this.#withImage(a0, (image) => {\n const pattern = context.createPattern(image, a1);\n if (pattern === null) {\n this.#print('Can not set pattern. The image could not be used as a pattern.');\n return;\n }\n context.fillStyle = pattern;\n });\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gQuadCurveTo(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 4) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2) && Cons.isNumber(a3)) {\n this.ctx.quadraticCurveTo(a0, a1, a2, a3);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw quadratic curve.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw quadratic curve.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gSaveJpeg(arguments_: Cons): LispValue {\n return this.saveCanvas(arguments_, 'image/jpeg', 'jpeg');\n }\n\n gSavePng(arguments_: Cons): LispValue {\n return this.saveCanvas(arguments_, 'image/png', 'png');\n }\n\n /**\n * Shared implementation of `gsave-jpeg` / `gsave-png`. With no argument it\n * triggers a browser download; with a single string argument it writes the\n * encoded image to that file path on Node.js.\n * @param arguments_ - the evaluated argument list (empty, or one path string)\n * @param mimeType - the image MIME type to encode\n * @param label - the format name used in diagnostics (\"jpeg\" / \"png\")\n * @return `t` on success, `Cons.nil` otherwise\n */\n saveCanvas(arguments_: Cons, mimeType: string, label: string): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n const length_ = arguments_.length();\n if (length_ === 0) {\n return this.#downloadCanvas(mimeType, label);\n }\n if (length_ === 1 && Cons.isString(arguments_.car)) {\n return this.#writeCanvasToFile(arguments_.car, mimeType, label);\n }\n this.#print(`Can not save ${label}.`);\n return Cons.nil;\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gScale(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 2) {\n const a0 = arguments_.car;\n const a1 = (arguments_.cdr as Cons).car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1)) {\n this.ctx.scale(a0, a1);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not scale.');\n return Cons.nil;\n } catch {\n this.#print('Can not scale.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gShadowBlur(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n this.ctx.shadowBlur = arguments_.car;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set shadow blur.');\n return Cons.nil;\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gShadowColor(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1) {\n const aColor = this.selectColor(arguments_);\n this.ctx.shadowColor = aColor;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set shadow color.');\n return Cons.nil;\n } catch {\n this.#print('Can not set shadow color.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n // NOTE: gShadowOffsetX, gShadowOffsetY, and gShadowBlur intentionally omit try/catch.\n // The original Graphist.js had the same structure for all three shadow-property setters.\n gShadowOffsetX(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n this.ctx.shadowOffsetX = arguments_.car;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set shadow offsetX.');\n return Cons.nil;\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gShadowOffsetY(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n this.ctx.shadowOffsetY = arguments_.car;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set shadow offsetY.');\n return Cons.nil;\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gSleep(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n const sleep = (ms: number): void => {\n const time = Date.now() + ms;\n while (Date.now() < time) {\n // busy wait\n }\n };\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n sleep(arguments_.car);\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not sleep');\n return Cons.nil;\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gStartPath(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.beginPath();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not start path.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gStroke(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.stroke();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not stroke.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gStrokeColor(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() >= 1) {\n const aColor = this.selectColor(arguments_);\n this.ctx.strokeStyle = aColor;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set stroke color');\n return Cons.nil;\n } catch {\n this.#print('Can not set stroke color');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gStrokeRect(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 4) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2) && Cons.isNumber(a3)) {\n this.ctx.strokeRect(a0, a1, a2, a3);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw stroke rectangle.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw stroke rectangle.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gStrokeText(arguments_: Cons): LispValue {\n return this.#execute('Can not draw stroke text.', (context) => {\n const length_ = arguments_.length();\n if (length_ !== 3 && length_ !== 4) return null;\n const [a0, a1, a2, a3] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isNumber(a1) || !Cons.isNumber(a2)) return null;\n if (length_ === 4) {\n if (!Cons.isNumber(a3)) return null;\n context.strokeText(a0, a1, a2, a3);\n } else {\n context.strokeText(a0, a1, a2);\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gStrokeTri(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 6) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n const cdr4 = cdr3.cdr as Cons;\n const a4 = cdr4.car;\n const cdr5 = cdr4.cdr as Cons;\n const a5 = cdr5.car;\n if (\n Cons.isNumber(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4) &&\n Cons.isNumber(a5)\n ) {\n this.ctx.beginPath();\n this.ctx.moveTo(a0, a1);\n this.ctx.lineTo(a2, a3);\n this.ctx.lineTo(a4, a5);\n this.ctx.closePath();\n this.ctx.stroke();\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw stroke triangle.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw stroke triangle.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextAlign(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text align. Expected \"left\" / \"right\" / \"center\" / \"start\" / \"end\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_ALIGNS);\n if (value === null) return null;\n context.textAlign = value as CanvasTextAlign;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextBaseline(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text baseline. Expected \"top\" / \"hanging\" / \"middle\" / \"alphabetic\" / \"ideographic\" / \"bottom\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_BASELINES);\n if (value === null) return null;\n context.textBaseline = value as CanvasTextBaseline;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextDirection(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text direction. Expected \"ltr\" / \"rtl\" / \"inherit\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_DIRECTIONS);\n if (value === null) return null;\n context.direction = value as CanvasDirection;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextFont(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.font = arguments_.car;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text font.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text font.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTranslate(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 2) {\n const a0 = arguments_.car;\n const a1 = (arguments_.cdr as Cons).car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1)) {\n this.ctx.translate(a0, a1);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not translate.');\n return Cons.nil;\n } catch {\n this.#print('Can not translate.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gRect(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 4) {\n const a0 = arguments_.car;\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2) && Cons.isNumber(a3)) {\n this.ctx.rect(a0, a1, a2, a3);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw rectangle.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw rectangle.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gRotate(arguments_: Cons): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n this.ctx.rotate((Math.PI / 180) * arguments_.car);\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not rotate.');\n return Cons.nil;\n } catch {\n this.#print('Can not rotate.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n /**\n * Pushes the current drawing state (styles, transform, clip) onto the\n * context's state stack. Pairs with `gRestore` to let Lisp callers manage\n * state explicitly. Replaces the legacy per-method `context.save()` calls, which\n * pushed state on every draw with no matching `restore()` and grew the stack\n * unbounded.\n * @return `t` on success, `Cons.nil` otherwise\n */\n gSave(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.save();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not save.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n /**\n * Pops the most recently saved drawing state off the context's state stack.\n * Pairs with `gSave`. Popping an empty stack is a no-op per the Canvas spec.\n * @return `t` on success, `Cons.nil` otherwise\n */\n gRestore(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n this.ctx.restore();\n return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not restore.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gEllipse(arguments_: Cons): LispValue {\n return this.#execute('Can not draw ellipse.', (context) => {\n const a = this.#numbers(arguments_, 8);\n if (a === null) return null;\n context.ellipse(\n a[0],\n a[1],\n a[2],\n a[3],\n (Math.PI / 180) * a[4],\n (Math.PI / 180) * a[5],\n (Math.PI / 180) * a[6],\n a[7] >= 0,\n );\n return InterpretedSymbol.of('t');\n });\n }\n\n gRoundRect(arguments_: Cons): LispValue {\n return this.#execute('Can not draw round rectangle.', (context) => {\n const a = this.#numbers(arguments_, 5);\n if (a === null) return null;\n context.roundRect(a[0], a[1], a[2], a[3], a[4]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineDash(arguments_: Cons): LispValue {\n return this.#execute('Can not set line dash.', (context) => {\n const segments = this.#numbers(arguments_, arguments_.length());\n if (segments === null) return null;\n context.setLineDash(segments);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineDashOffset(arguments_: Cons): LispValue {\n return this.#execute('Can not set line dash offset.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.lineDashOffset = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gMiterLimit(arguments_: Cons): LispValue {\n return this.#execute('Can not set miter limit.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.miterLimit = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gClip(): LispValue {\n return this.#execute('Can not clip.', (context) => {\n context.clip();\n return InterpretedSymbol.of('t');\n });\n }\n\n gIsPointInPath(arguments_: Cons): LispValue {\n return this.#execute('Can not test point in path.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n return context.isPointInPath(a[0], a[1]) ? InterpretedSymbol.of('t') : Cons.nil;\n });\n }\n\n gIsPointInStroke(arguments_: Cons): LispValue {\n return this.#execute('Can not test point in stroke.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n return context.isPointInStroke(a[0], a[1]) ? InterpretedSymbol.of('t') : Cons.nil;\n });\n }\n\n gTransform(arguments_: Cons): LispValue {\n return this.#execute('Can not transform.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.transform(a[0], a[1], a[2], a[3], a[4], a[5]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gSetTransform(arguments_: Cons): LispValue {\n return this.#execute('Can not set transform.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gResetTransform(): LispValue {\n return this.#execute('Can not reset transform.', (context) => {\n context.resetTransform();\n return InterpretedSymbol.of('t');\n });\n }\n\n gComposite(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set composite operation. Expected a globalCompositeOperation keyword such as \"source-over\" / \"multiply\" / \"screen\".',\n (context) => {\n const value = this.#enumString(arguments_, COMPOSITE_OPERATIONS);\n if (value === null) return null;\n context.globalCompositeOperation = value as GlobalCompositeOperation;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gFilter(arguments_: Cons): LispValue {\n return this.#execute('Can not set filter.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.filter = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gImageSmoothing(arguments_: Cons): LispValue {\n return this.#execute('Can not set image smoothing.', (context) => {\n const quality = arguments_.length() === 1 ? arguments_.car : null;\n if (quality !== 'off' && quality !== 'low' && quality !== 'medium' && quality !== 'high') {\n return null;\n }\n if (quality === 'off') {\n context.imageSmoothingEnabled = false;\n } else {\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = quality;\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gMeasureText(arguments_: Cons): LispValue {\n return this.#execute('Can not measure text.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n return context.measureText(arguments_.car).width;\n });\n }\n\n gLetterSpacing(arguments_: Cons): LispValue {\n return this.#execute('Can not set letter spacing.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.letterSpacing = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gWordSpacing(arguments_: Cons): LispValue {\n return this.#execute('Can not set word spacing.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.wordSpacing = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gFontKerning(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set font kerning. Expected \"auto\" / \"normal\" / \"none\".',\n (context) => {\n const value = this.#enumString(arguments_, FONT_KERNINGS);\n if (value === null) return null;\n context.fontKerning = value as CanvasFontKerning;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gFontStretch(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set font stretch. Expected a font-stretch keyword such as \"condensed\" / \"normal\" / \"expanded\".',\n (context) => {\n const value = this.#enumString(arguments_, FONT_STRETCHES);\n if (value === null) return null;\n context.fontStretch = value as CanvasFontStretch;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gFontVariant(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set font variant. Expected a font-variant-caps keyword such as \"normal\" / \"small-caps\".',\n (context) => {\n const value = this.#enumString(arguments_, FONT_VARIANTS);\n if (value === null) return null;\n context.fontVariantCaps = value as CanvasFontVariantCaps;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextRendering(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text rendering. Expected \"auto\" / \"optimizeSpeed\" / \"optimizeLegibility\" / \"geometricPrecision\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_RENDERINGS);\n if (value === null) return null;\n context.textRendering = value as CanvasTextRendering;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gClearRect(arguments_: Cons): LispValue {\n return this.#execute('Can not clear rectangle.', (context) => {\n const a = this.#numbers(arguments_, 4);\n if (a === null) return null;\n context.clearRect(a[0], a[1], a[2], a[3]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gReset(): LispValue {\n return this.#execute('Can not reset.', (context) => {\n context.reset();\n return InterpretedSymbol.of('t');\n });\n }\n\n gWidth(): LispValue {\n return this.#execute('Can not get width.', () => this.canvas.width);\n }\n\n gHeight(): LispValue {\n return this.#execute('Can not get height.', () => this.canvas.height);\n }\n\n gPixel(arguments_: Cons): LispValue {\n return this.#execute('Can not read pixel.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n const data = context.getImageData(a[0], a[1], 1, 1).data;\n return this.#toList([data[0], data[1], data[2], data[3]]);\n });\n }\n\n gSetPixel(arguments_: Cons): LispValue {\n return this.#execute('Can not write pixel.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n const imageData = context.createImageData(1, 1);\n imageData.data[0] = a[2];\n imageData.data[1] = a[3];\n imageData.data[2] = a[4];\n imageData.data[3] = a[5];\n context.putImageData(imageData, a[0], a[1]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLinearGradient(arguments_: Cons): LispValue {\n return this.#execute('Can not set linear gradient.', (context) => {\n const [x0, y0, x1, y1, ...stops] = this.#listValues(arguments_);\n if (\n stops.length < 2 ||\n !Cons.isNumber(x0) ||\n !Cons.isNumber(y0) ||\n !Cons.isNumber(x1) ||\n !Cons.isNumber(y1)\n ) {\n return null;\n }\n return this.#installGradient(context, context.createLinearGradient(x0, y0, x1, y1), stops);\n });\n }\n\n gRadialGradient(arguments_: Cons): LispValue {\n return this.#execute('Can not set radial gradient.', (context) => {\n const [x0, y0, r0, x1, y1, r1, ...stops] = this.#listValues(arguments_);\n if (\n stops.length < 2 ||\n !Cons.isNumber(x0) ||\n !Cons.isNumber(y0) ||\n !Cons.isNumber(r0) ||\n !Cons.isNumber(x1) ||\n !Cons.isNumber(y1) ||\n !Cons.isNumber(r1)\n ) {\n return null;\n }\n return this.#installGradient(\n context,\n context.createRadialGradient(x0, y0, r0, x1, y1, r1),\n stops,\n );\n });\n }\n\n gConicGradient(arguments_: Cons): LispValue {\n return this.#execute('Can not set conic gradient.', (context) => {\n const [angle, x, y, ...stops] = this.#listValues(arguments_);\n if (stops.length < 2 || !Cons.isNumber(angle) || !Cons.isNumber(x) || !Cons.isNumber(y)) {\n return null;\n }\n return this.#installGradient(\n context,\n context.createConicGradient((Math.PI / 180) * angle, x, y),\n stops,\n );\n });\n }\n\n /**\n * Parses a color spec from the head of the argument Cons. Accepts\n * (1 string), (3 numbers — rgb), or (4 numbers — rgba); falls back to\n * `'black'` on anything else (legacy behavior).\n * @param arguments_ - the argument Cons to parse\n * @return CSS color string\n */\n selectColor(arguments_: Cons): string {\n let aColor = 'black';\n const length_ = arguments_.length();\n const a0 = arguments_.car;\n if (length_ === 1 && Cons.isString(a0)) {\n aColor = a0;\n } else if (length_ === 3) {\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n aColor = `rgb(${a0}, ${a1}, ${a2})`;\n } else {\n this.#print('Can not set color. set color \"black\".');\n }\n } else if (length_ === 4) {\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2) && Cons.isNumber(a3)) {\n aColor = `rgba(${a0}, ${a1}, ${a2}, ${a3})`;\n } else {\n this.#print('Can not set color. set color \"black\".');\n }\n } else {\n this.#print('Can not set color. set color \"black\".');\n }\n return aColor;\n }\n}\n","import { GraphicsPlugin } from './GraphicsPlugin/index.js';\n\n/**\n * Creates a Canvas2D drawing plugin bound to the given canvas. Register it on\n * a `LispInterpreter` via `interpreter.use(plugin)` to make the `g…` drawing\n * primitives callable from Lisp source.\n * @param options - the canvas to draw to\n * @return a KeiLispPlugin that handles the `g…` symbols\n */\nexport function createGraphicsPlugin(options: {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n}): GraphicsPlugin {\n return new GraphicsPlugin(options.canvas);\n}\n\nexport { GraphicsPlugin } from './GraphicsPlugin/index.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#builtInFunctions","#setup","#imageCache","#print","#requireOpenContext","#applyGradientStops","#execute","#numbers","#listValues","#withImage","#enumString","#downloadCanvas","#writeCanvasToFile","#toList","#installGradient"],"sources":["../src/GraphicsPlugin/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-math-min-max,\n sonarjs/no-nested-conditional,\n sonarjs/no-duplicate-string */\n\n// These lint rules are disabled file-wide so the ported handlers can preserve\n// the legacy Graphist patterns (clamp ternaries, mode-flag ternaries,\n// repeated diagnostic strings) without per-line escape hatches.\n\nimport type { KeiLispPlugin, LispValue, PluginContext } from 'kei-lisp';\nimport { Cons, EvalError, InterpretedSymbol, Numeric } from 'kei-lisp';\n\n// Allowed values for the enum-string setters, mirroring the Canvas 2D API\n// types. Invalid values are rejected with a diagnostic instead of being\n// silently ignored by the canvas.\nconst LINE_CAPS = new Set<string>(['butt', 'round', 'square']);\nconst LINE_JOINS = new Set<string>(['miter', 'round', 'bevel']);\nconst TEXT_ALIGNS = new Set<string>(['left', 'right', 'center', 'start', 'end']);\nconst TEXT_BASELINES = new Set<string>([\n 'top',\n 'hanging',\n 'middle',\n 'alphabetic',\n 'ideographic',\n 'bottom',\n]);\nconst TEXT_DIRECTIONS = new Set<string>(['ltr', 'rtl', 'inherit']);\nconst FONT_KERNINGS = new Set<string>(['auto', 'normal', 'none']);\nconst FONT_STRETCHES = new Set<string>([\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n]);\nconst FONT_VARIANTS = new Set<string>([\n 'normal',\n 'small-caps',\n 'all-small-caps',\n 'petite-caps',\n 'all-petite-caps',\n 'unicase',\n 'titling-caps',\n]);\nconst TEXT_RENDERINGS = new Set<string>([\n 'auto',\n 'optimizeSpeed',\n 'optimizeLegibility',\n 'geometricPrecision',\n]);\nconst PATTERN_REPETITIONS = new Set<string>(['repeat', 'repeat-x', 'repeat-y', 'no-repeat']);\nconst COMPOSITE_OPERATIONS = new Set<string>([\n 'source-over',\n 'source-in',\n 'source-out',\n 'source-atop',\n 'destination-over',\n 'destination-in',\n 'destination-out',\n 'destination-atop',\n 'lighter',\n 'copy',\n 'xor',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n]);\n\n/**\n * @class\n * @classdesc Canvas2D drawing plugin for the kei-lisp interpreter. Implements\n * the `KeiLispPlugin` contract (`name` / `has` / `apply`) and\n * exposes 75 `g…` Lisp functions that proxy to a 2D rendering\n * context. Failures (wrong arity,\n * type mismatch, closed canvas, canvas-level errors) signal an\n * `EvalError` that Lisp callers can intercept with\n * `(handler-case … (eval-error (e) …))`. Two exceptions still go\n * to `process.stderr` as diagnostics: asynchronous work (image\n * loading, OffscreenCanvas file writes), which fails after the\n * call has returned, and `selectColor`'s best-effort color\n * parsing, which falls back to black instead of failing.\n * @author Keisuke Ikeda\n */\nexport class GraphicsPlugin implements KeiLispPlugin {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of\n * the GraphicsPlugin method that implements it. Private so hosts cannot\n * mutate the registered function set.\n */\n static readonly #builtInFunctions: Map<InterpretedSymbol, string> = GraphicsPlugin.#setup();\n\n /**\n * Lists every Lisp function name this plugin registers.\n * @return the sorted `g…` function names\n */\n static functionNames(): string[] {\n // Iterator helpers and Array#toSorted are not typed under the ES2022 lib\n // this project compiles against, so spread the iterator and sort a copy.\n return (\n // eslint-disable-next-line unicorn/prefer-iterator-to-array\n [...GraphicsPlugin.#builtInFunctions.keys()]\n .map(String)\n // Array#toSorted is not typed under the ES2022 lib this project\n // compiles against, so sort a fresh copy in place.\n // eslint-disable-next-line unicorn/no-array-sort\n .sort((a, b) => a.localeCompare(b))\n );\n }\n\n /**\n * Builds the dispatch table.\n * @return the dispatch table\n */\n static #setup(): Map<InterpretedSymbol, string> {\n const aTable = new Map<InterpretedSymbol, string>();\n aTable.set(InterpretedSymbol.of('galpha'), 'gAlpha');\n aTable.set(InterpretedSymbol.of('garc'), 'gArc');\n aTable.set(InterpretedSymbol.of('garc-to'), 'gArcTo');\n aTable.set(InterpretedSymbol.of('gbezcurve-to'), 'gBezCurveTo');\n aTable.set(InterpretedSymbol.of('gclear'), 'gClear');\n aTable.set(InterpretedSymbol.of('gclose'), 'gClose');\n aTable.set(InterpretedSymbol.of('gcolor'), 'gColor');\n aTable.set(InterpretedSymbol.of('gfill'), 'gFill');\n aTable.set(InterpretedSymbol.of('gfill-color'), 'gFillColor');\n aTable.set(InterpretedSymbol.of('gfill-rect'), 'gFillRect');\n aTable.set(InterpretedSymbol.of('gfill-text'), 'gFillText');\n aTable.set(InterpretedSymbol.of('gfill-tri'), 'gFillTri');\n aTable.set(InterpretedSymbol.of('gfinish-path'), 'gFinishPath');\n aTable.set(InterpretedSymbol.of('gimage'), 'gImage');\n aTable.set(InterpretedSymbol.of('gmove-to'), 'gMoveTo');\n aTable.set(InterpretedSymbol.of('gline-to'), 'gLineTo');\n aTable.set(InterpretedSymbol.of('gline-cap'), 'gLineCap');\n aTable.set(InterpretedSymbol.of('gline-join'), 'gLineJoin');\n aTable.set(InterpretedSymbol.of('gline-width'), 'gLineWidth');\n aTable.set(InterpretedSymbol.of('gopen'), 'gOpen');\n aTable.set(InterpretedSymbol.of('gpattern'), 'gPattern');\n aTable.set(InterpretedSymbol.of('gquadcurve-to'), 'gQuadCurveTo');\n aTable.set(InterpretedSymbol.of('gsave-jpeg'), 'gSaveJpeg');\n aTable.set(InterpretedSymbol.of('gsave-png'), 'gSavePng');\n aTable.set(InterpretedSymbol.of('gscale'), 'gScale');\n aTable.set(InterpretedSymbol.of('gshadow-blur'), 'gShadowBlur');\n aTable.set(InterpretedSymbol.of('gshadow-color'), 'gShadowColor');\n aTable.set(InterpretedSymbol.of('gshadow-offsetx'), 'gShadowOffsetX');\n aTable.set(InterpretedSymbol.of('gshadow-offsety'), 'gShadowOffsetY');\n aTable.set(InterpretedSymbol.of('gsleep'), 'gSleep');\n aTable.set(InterpretedSymbol.of('gstart-path'), 'gStartPath');\n aTable.set(InterpretedSymbol.of('gstroke'), 'gStroke');\n aTable.set(InterpretedSymbol.of('gstroke-color'), 'gStrokeColor');\n aTable.set(InterpretedSymbol.of('gstroke-rect'), 'gStrokeRect');\n aTable.set(InterpretedSymbol.of('gstroke-text'), 'gStrokeText');\n aTable.set(InterpretedSymbol.of('gstroke-tri'), 'gStrokeTri');\n aTable.set(InterpretedSymbol.of('gtext-align'), 'gTextAlign');\n aTable.set(InterpretedSymbol.of('gtext-direction'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-font'), 'gTextFont');\n aTable.set(InterpretedSymbol.of('gtext-baseline'), 'gTextBaseline');\n aTable.set(InterpretedSymbol.of('gtranslate'), 'gTranslate');\n aTable.set(InterpretedSymbol.of('grect'), 'gRect');\n aTable.set(InterpretedSymbol.of('grotate'), 'gRotate');\n aTable.set(InterpretedSymbol.of('gsave'), 'gSave');\n aTable.set(InterpretedSymbol.of('grestore'), 'gRestore');\n aTable.set(InterpretedSymbol.of('gellipse'), 'gEllipse');\n aTable.set(InterpretedSymbol.of('ground-rect'), 'gRoundRect');\n aTable.set(InterpretedSymbol.of('gline-dash'), 'gLineDash');\n aTable.set(InterpretedSymbol.of('gline-dash-offset'), 'gLineDashOffset');\n aTable.set(InterpretedSymbol.of('gmiter-limit'), 'gMiterLimit');\n aTable.set(InterpretedSymbol.of('gclip'), 'gClip');\n aTable.set(InterpretedSymbol.of('gis-point-in-path'), 'gIsPointInPath');\n aTable.set(InterpretedSymbol.of('gis-point-in-stroke'), 'gIsPointInStroke');\n aTable.set(InterpretedSymbol.of('gtransform'), 'gTransform');\n aTable.set(InterpretedSymbol.of('gset-transform'), 'gSetTransform');\n aTable.set(InterpretedSymbol.of('greset-transform'), 'gResetTransform');\n aTable.set(InterpretedSymbol.of('gcomposite'), 'gComposite');\n aTable.set(InterpretedSymbol.of('gfilter'), 'gFilter');\n aTable.set(InterpretedSymbol.of('gimage-smoothing'), 'gImageSmoothing');\n aTable.set(InterpretedSymbol.of('gmeasure-text'), 'gMeasureText');\n aTable.set(InterpretedSymbol.of('gletter-spacing'), 'gLetterSpacing');\n aTable.set(InterpretedSymbol.of('gword-spacing'), 'gWordSpacing');\n aTable.set(InterpretedSymbol.of('gfont-kerning'), 'gFontKerning');\n aTable.set(InterpretedSymbol.of('gfont-stretch'), 'gFontStretch');\n aTable.set(InterpretedSymbol.of('gfont-variant'), 'gFontVariant');\n aTable.set(InterpretedSymbol.of('gtext-rendering'), 'gTextRendering');\n aTable.set(InterpretedSymbol.of('gclear-rect'), 'gClearRect');\n aTable.set(InterpretedSymbol.of('greset'), 'gReset');\n aTable.set(InterpretedSymbol.of('gwidth'), 'gWidth');\n aTable.set(InterpretedSymbol.of('gheight'), 'gHeight');\n aTable.set(InterpretedSymbol.of('gpixel'), 'gPixel');\n aTable.set(InterpretedSymbol.of('gset-pixel'), 'gSetPixel');\n aTable.set(InterpretedSymbol.of('glinear-gradient'), 'gLinearGradient');\n aTable.set(InterpretedSymbol.of('gradial-gradient'), 'gRadialGradient');\n aTable.set(InterpretedSymbol.of('gconic-gradient'), 'gConicGradient');\n return aTable;\n }\n\n /**\n * Loaded-image cache shared by `gimage` and `gpattern`. Repeated draws of\n * the same `src` reuse the loaded element and run synchronously, so they\n * keep their place in the drawing order instead of racing the load.\n */\n readonly #imageCache = new Map<string, HTMLImageElement>();\n\n /**\n * Plugin identifier, used for diagnostics.\n */\n readonly name: string = 'graphics';\n\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n isOpen: boolean;\n\n /**\n * Constructor.\n * @constructor\n * @param canvas - the canvas to draw to\n */\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas) {\n this.canvas = canvas;\n this.ctx = canvas.getContext('2d');\n this.isOpen = false;\n }\n\n /**\n * Writes a diagnostic line to `process.stderr`, matching the convention\n * used by kei-lisp itself (`Applier.format` writes to `process.stdout`).\n * Used only where an `EvalError` cannot reach the caller: asynchronous\n * work (image loading), best-effort color parsing, and the informational\n * line printed by `gopen`. In a Node runtime this hits the real stderr; in\n * a browser kei-lisp host (e.g. kei-lisp-web) the host typically swaps\n * `process.stderr.write` for a sink that routes to the REPL output panel.\n * In a plain browser with no `process` shim at all, the line falls back to\n * `console.error` instead of throwing.\n * @param line - the line to write\n */\n #print(line: string): void {\n const stderr = (globalThis as { process?: { stderr?: { write?: (chunk: string) => boolean } } })\n .process?.stderr;\n if (typeof stderr?.write === 'function') {\n stderr.write(line + '\\n');\n return;\n }\n console.error(line);\n }\n\n /**\n * Resolves an image for the given source and runs `draw` with it —\n * synchronously when the image is already loaded, on its `load` event\n * otherwise. A load failure prints a diagnostic once (the failure happens\n * asynchronously, after the calling `g…` function has already returned, so\n * it cannot signal an `EvalError`).\n * @param source - the image URL / data URI\n * @param draw - the drawing action to run once the image is available\n */\n #withImage(source: string, draw: (image: HTMLImageElement) => void): void {\n const cached = this.#imageCache.get(source);\n const image = cached ?? new Image();\n if (cached === undefined) {\n image.src = source;\n this.#imageCache.set(source, image);\n image.addEventListener('error', () => {\n this.#print(`Can not load image: ${source}`);\n });\n }\n if (image.complete) {\n draw(image);\n return;\n }\n image.addEventListener('load', () => {\n draw(image);\n });\n }\n\n /**\n * Returns the 2D context, signaling an `EvalError` when the canvas exposes\n * no usable context or has not been opened with `gopen`.\n * @return the 2D rendering context\n */\n #requireOpenContext(): CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D {\n if (this.ctx === null) {\n throw new EvalError(\n 'Unable to initialize canvas. The browser or machine may not support it.',\n );\n }\n if (!this.isOpen) {\n throw new EvalError('The canvas is closed and cannot be executed.');\n }\n return this.ctx;\n }\n\n /**\n * Shared guard-and-dispatch skeleton for the `g…` methods: requires an\n * open canvas context, runs `body`, and signals an `EvalError` carrying\n * `failureMessage` when `body` returns `null` (bad arguments) or throws a\n * canvas-level error. The error propagates through the evaluator, where\n * Lisp callers can intercept it with\n * `(handler-case … (eval-error (e) …))`.\n * @param failureMessage - the message of the signaled `EvalError`\n * @param body - the drawing action; returns the Lisp result, or `null` on\n * bad arguments\n * @return the body's result\n */\n #execute(\n failureMessage: string,\n body: (\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n ) => LispValue | null,\n ): LispValue {\n const context = this.#requireOpenContext();\n let result: LispValue | null;\n try {\n result = body(context);\n } catch (error) {\n throw error instanceof EvalError ? error : new EvalError(failureMessage);\n }\n if (result === null) {\n throw new EvalError(failureMessage);\n }\n return result;\n }\n\n /**\n * Reads a single string argument and validates it against an allowlist.\n * @param arguments_ - the evaluated argument list\n * @param allowed - the accepted values\n * @return the validated string, or `null` on wrong arity, a non-string\n * argument, or a value outside the allowlist\n */\n #enumString(arguments_: Cons, allowed: ReadonlySet<string>): string | null {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n return allowed.has(arguments_.car) ? arguments_.car : null;\n }\n\n /**\n * Reads exactly `count` numbers from the argument list. kei-lisp v3\n * evaluates integers to `bigint` and exact division to `Rational`, so each\n * value is converted to a JS float for the Canvas 2D API.\n * @param arguments_ - the evaluated argument list\n * @param count - the expected argument count\n * @return the numbers, or `null` on wrong arity or a non-number argument\n */\n #numbers(arguments_: Cons, count: number): number[] | null {\n if (arguments_.length() !== count) return null;\n const values: number[] = [];\n let rest = arguments_;\n for (let index = 0; index < count; index++) {\n if (!Cons.isNumber(rest.car)) return null;\n values.push(Numeric.toFloat(rest.car));\n rest = rest.cdr as Cons;\n }\n return values;\n }\n\n /**\n * Flattens the argument list into a JS array.\n * @param arguments_ - the evaluated argument list\n * @return the argument values in order\n */\n #listValues(arguments_: Cons): LispValue[] {\n const values: LispValue[] = [];\n let rest = arguments_;\n for (let index = arguments_.length(); index > 0; index--) {\n values.push(rest.car);\n rest = rest.cdr as Cons;\n }\n return values;\n }\n\n /**\n * Builds a Lisp list (Cons chain) from JS values.\n * @param values - the values, at least one\n * @return the list head\n */\n #toList(values: LispValue[]): Cons {\n const head = new Cons(values[0]);\n let tail = head;\n for (let index = 1; index < values.length; index++) {\n tail.cdr = new Cons(values[index]);\n tail = tail.cdr;\n }\n return head;\n }\n\n /**\n * Applies `(offset color)` pairs to a gradient.\n * @param gradient - the gradient to add stops to\n * @param stops - alternating numeric offsets (0–1) and CSS color strings\n * @return true when every pair was valid and at least one was applied\n */\n #applyGradientStops(gradient: CanvasGradient, stops: LispValue[]): boolean {\n if (stops.length === 0 || stops.length % 2 !== 0) return false;\n for (let index = 0; index < stops.length; index += 2) {\n const offset = stops[index];\n const color = stops[index + 1];\n if (!Cons.isNumber(offset) || !Cons.isString(color)) return false;\n gradient.addColorStop(Numeric.toFloat(offset), color);\n }\n return true;\n }\n\n /**\n * Sets both `fillStyle` and `strokeStyle` to the given gradient after\n * applying its stops, mirroring how `gcolor` sets both styles at once.\n * @param context - the 2D context\n * @param gradient - the gradient to install\n * @param stops - alternating offsets and colors (see #applyGradientStops)\n * @return `t` on success, `null` on invalid stops\n */\n #installGradient(\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n gradient: CanvasGradient,\n stops: LispValue[],\n ): LispValue | null {\n if (!this.#applyGradientStops(gradient, stops)) return null;\n context.fillStyle = gradient;\n context.strokeStyle = gradient;\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Encodes the canvas via `toDataURL` and triggers a browser download through\n * a temporary `<a download>` element. Requires a DOM (`document`) and an\n * `HTMLCanvasElement`; `OffscreenCanvas` has no `toDataURL`, and Node.js has\n * no `document` — those callers must pass a file path instead.\n * @param mimeType - the image MIME type to encode\n * @param label - the format name used in diagnostics (\"jpeg\" / \"png\")\n * @return `t` on success\n */\n #downloadCanvas(mimeType: string, label: string): LispValue {\n if (typeof document === 'undefined' || !('toDataURL' in this.canvas)) {\n throw new EvalError(\n `Can not save ${label}. Browser download needs a DOM and an HTMLCanvasElement; pass a file path to save on Node.js.`,\n );\n }\n try {\n const link = document.createElement('a');\n link.href = this.canvas.toDataURL(mimeType);\n link.download = 'canvas';\n document.body.append(link);\n link.click();\n link.remove();\n return InterpretedSymbol.of('t');\n } catch {\n throw new EvalError(\n `Can not save ${label}. If you are using an image in the canvas, you can't save ${label}.`,\n );\n }\n }\n\n /**\n * Writes the encoded canvas image to a file path on Node.js, using\n * `process.getBuiltinModule('node:fs')` so browser bundles never see a\n * `node:fs` import. `HTMLCanvasElement` (and node-canvas) encode\n * synchronously via `toDataURL`; `OffscreenCanvas` only offers the async\n * `convertToBlob`, so its file is written after this returns — the same\n * fire-and-forget contract as `gImage`.\n * @param path - the destination file path\n * @param mimeType - the image MIME type to encode\n * @param label - the format name used in diagnostics (\"jpeg\" / \"png\")\n * @return `t` on success\n */\n #writeCanvasToFile(path: string, mimeType: string, label: string): LispValue {\n // Reached through globalThis (like #print) so a plain browser with no\n // `process` shim signals the EvalError below instead of crashing with a\n // ReferenceError; getBuiltinModule keeps `node:fs` out of browser bundles.\n const getBuiltinModule = (\n globalThis as {\n process?: { getBuiltinModule?: (id: 'node:fs') => typeof import('node:fs') };\n }\n ).process?.getBuiltinModule;\n const fs = typeof getBuiltinModule === 'function' ? getBuiltinModule('node:fs') : undefined;\n if (fs === undefined) {\n throw new EvalError(`Can not save ${label}. Saving to a file path requires Node.js.`);\n }\n try {\n if ('toDataURL' in this.canvas) {\n const dataUrl = this.canvas.toDataURL(mimeType);\n const base64 = dataUrl.slice(dataUrl.indexOf(',') + 1);\n // Uint8Array.fromBase64 is unavailable on Node 24 (the minimum supported\n // engine), so decode with Buffer instead.\n // eslint-disable-next-line unicorn/prefer-uint8array-base64\n fs.writeFileSync(path, Buffer.from(base64, 'base64'));\n return InterpretedSymbol.of('t');\n }\n void this.canvas\n .convertToBlob({ type: mimeType })\n .then(async (blob) => {\n fs.writeFileSync(path, new Uint8Array(await blob.arrayBuffer()));\n })\n .catch(() => {\n // The write happens after this call has returned, so the failure\n // can only be reported as a diagnostic (same as image loading).\n this.#print(`Can not save ${label}.`);\n });\n return InterpretedSymbol.of('t');\n } catch {\n throw new EvalError(`Can not save ${label}.`);\n }\n }\n\n /**\n * Returns true if this plugin handles the given symbol.\n * @param aSymbol - the call symbol\n * @return true if `apply` should be called\n */\n has(aSymbol: InterpretedSymbol): boolean {\n return GraphicsPlugin.#builtInFunctions.has(aSymbol);\n }\n\n /**\n * Dispatches the given symbol to the matching `g…` method.\n * @param aSymbol - the call symbol\n * @param arguments_ - the evaluated argument list\n * @param _context - the interpreter context (unused by this plugin)\n * @return the method's result\n */\n apply(aSymbol: InterpretedSymbol, arguments_: Cons, _context: PluginContext): LispValue {\n const methodName = GraphicsPlugin.#builtInFunctions.get(aSymbol);\n if (methodName === undefined) {\n throw new EvalError(`I could find no procedure description for ${String(aSymbol)}`);\n }\n const target = this as unknown as Record<string, (arguments__: Cons) => LispValue>;\n return target[methodName].call(this, arguments_);\n }\n\n gAlpha(arguments_: Cons): LispValue {\n return this.#execute('Can not set alpha.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n const aNumber = a[0] <= 0 ? 0 : a[0] >= 1 ? 1 : a[0];\n context.globalAlpha = aNumber;\n return InterpretedSymbol.of('t');\n });\n }\n\n gArc(arguments_: Cons): LispValue {\n return this.#execute('Can not draw arc.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n const isAFlag = a[5] >= 0;\n context.arc(a[0], a[1], a[2], (Math.PI / 180) * a[3], (Math.PI / 180) * a[4], isAFlag);\n return InterpretedSymbol.of('t');\n });\n }\n\n gArcTo(arguments_: Cons): LispValue {\n return this.#execute('Can not draw arc to.', (context) => {\n const a = this.#numbers(arguments_, 5);\n if (a === null) return null;\n context.arcTo(a[0], a[1], a[2], a[3], a[4]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gBezCurveTo(arguments_: Cons): LispValue {\n return this.#execute('Can not draw bezier curve.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.bezierCurveTo(a[0], a[1], a[2], a[3], a[4], a[5]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gClear(arguments_: Cons): LispValue {\n return this.#execute('Can not clear.', (context) => {\n const aColor = arguments_.length() === 0 ? '#ffffff' : this.selectColor(arguments_);\n const previous = context.fillStyle;\n context.fillStyle = aColor;\n context.fillRect(0, 0, this.canvas.width, this.canvas.height);\n context.fillStyle = previous;\n return InterpretedSymbol.of('t');\n });\n }\n\n gClose(arguments_: Cons = Cons.nil): LispValue {\n if (this.ctx === null) {\n throw new EvalError(\n 'Unable to initialize canvas. The browser or machine may not support it.',\n );\n }\n if (arguments_.length() !== 0) {\n throw new EvalError('Can not close.');\n }\n if (!this.isOpen) {\n throw new EvalError('The canvas has already been closed.');\n }\n try {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n } catch {\n throw new EvalError('Can not close.');\n }\n this.isOpen = false;\n return InterpretedSymbol.of('t');\n }\n\n gColor(arguments_: Cons): LispValue {\n return this.#execute('Can not set color.', (context) => {\n if (arguments_.length() < 1) return null;\n const aColor = this.selectColor(arguments_);\n context.fillStyle = aColor;\n context.strokeStyle = aColor;\n return InterpretedSymbol.of('t');\n });\n }\n\n gFill(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not fill.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.fill();\n return InterpretedSymbol.of('t');\n });\n }\n\n gFillColor(arguments_: Cons): LispValue {\n return this.#execute('Can not set fill color.', (context) => {\n if (arguments_.length() < 1) return null;\n context.fillStyle = this.selectColor(arguments_);\n return InterpretedSymbol.of('t');\n });\n }\n\n gFillRect(arguments_: Cons): LispValue {\n return this.#execute('Can not draw fill rectangle.', (context) => {\n const a = this.#numbers(arguments_, 4);\n if (a === null) return null;\n context.fillRect(a[0], a[1], a[2], a[3]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gFillText(arguments_: Cons): LispValue {\n return this.#execute('Can not draw fill text.', (context) => {\n const length_ = arguments_.length();\n if (length_ !== 3 && length_ !== 4) return null;\n const [a0, a1, a2, a3] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isNumber(a1) || !Cons.isNumber(a2)) return null;\n if (length_ === 4) {\n if (!Cons.isNumber(a3)) return null;\n context.fillText(a0, Numeric.toFloat(a1), Numeric.toFloat(a2), Numeric.toFloat(a3));\n } else {\n context.fillText(a0, Numeric.toFloat(a1), Numeric.toFloat(a2));\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gFillTri(arguments_: Cons): LispValue {\n return this.#execute('Can not draw fill triangle.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.beginPath();\n context.moveTo(a[0], a[1]);\n context.lineTo(a[2], a[3]);\n context.lineTo(a[4], a[5]);\n context.fill();\n return InterpretedSymbol.of('t');\n });\n }\n\n gFinishPath(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not finish path.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.closePath();\n return InterpretedSymbol.of('t');\n });\n }\n\n gImage(arguments_: Cons): LispValue {\n return this.#execute('Can not draw Image.', (context) => {\n const length_ = arguments_.length();\n if (length_ !== 3 && length_ !== 5) return null;\n const [a0, a1, a2, a3, a4] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isNumber(a1) || !Cons.isNumber(a2)) return null;\n if (length_ === 5) {\n if (!Cons.isNumber(a3) || !Cons.isNumber(a4)) return null;\n this.#withImage(a0, (image) => {\n context.drawImage(\n image,\n Numeric.toFloat(a1),\n Numeric.toFloat(a2),\n Numeric.toFloat(a3),\n Numeric.toFloat(a4),\n );\n });\n } else {\n this.#withImage(a0, (image) => {\n context.drawImage(image, Numeric.toFloat(a1), Numeric.toFloat(a2));\n });\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineTo(arguments_: Cons): LispValue {\n return this.#execute('Can not draw line to', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n context.lineTo(a[0], a[1]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineCap(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set line cap. Expected \"butt\" / \"round\" / \"square\".',\n (context) => {\n const value = this.#enumString(arguments_, LINE_CAPS);\n if (value === null) return null;\n context.lineCap = value as CanvasLineCap;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gLineJoin(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set line join. Expected \"miter\" / \"round\" / \"bevel\".',\n (context) => {\n const value = this.#enumString(arguments_, LINE_JOINS);\n if (value === null) return null;\n context.lineJoin = value as CanvasLineJoin;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gLineWidth(arguments_: Cons): LispValue {\n return this.#execute('Can not set line width.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.lineWidth = a[0] <= 0 ? 1 : a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gMoveTo(arguments_: Cons): LispValue {\n return this.#execute('Can not move', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n context.moveTo(a[0], a[1]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gOpen(arguments_: Cons = Cons.nil): LispValue {\n if (this.ctx === null) {\n throw new EvalError(\n 'Unable to initialize canvas. The browser or machine may not support it.',\n );\n }\n if (arguments_.length() !== 0) {\n throw new EvalError('Can not open.');\n }\n if (this.isOpen) {\n throw new EvalError('The canvas has already been opened.');\n }\n try {\n this.ctx.fillStyle = '#ffffff';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n this.ctx.fillStyle = '#000000';\n } catch {\n // The canvas stays closed when the initial clear fails, so a later\n // gopen can retry (the legacy code left it marked open).\n throw new EvalError('Can not open.');\n }\n this.isOpen = true;\n this.#print(`canvas size, width : ${this.canvas.width} height : ${this.canvas.height}`);\n return InterpretedSymbol.of('t');\n }\n\n gPattern(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set pattern. Expected an image source and a repetition (\"repeat\" / \"repeat-x\" / \"repeat-y\" / \"no-repeat\").',\n (context) => {\n if (arguments_.length() !== 2) return null;\n const [a0, a1] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isString(a1) || !PATTERN_REPETITIONS.has(a1)) return null;\n this.#withImage(a0, (image) => {\n const pattern = context.createPattern(image, a1);\n if (pattern === null) {\n this.#print('Can not set pattern. The image could not be used as a pattern.');\n return;\n }\n context.fillStyle = pattern;\n });\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gQuadCurveTo(arguments_: Cons): LispValue {\n return this.#execute('Can not draw quadratic curve.', (context) => {\n const a = this.#numbers(arguments_, 4);\n if (a === null) return null;\n context.quadraticCurveTo(a[0], a[1], a[2], a[3]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gSaveJpeg(arguments_: Cons): LispValue {\n return this.saveCanvas(arguments_, 'image/jpeg', 'jpeg');\n }\n\n gSavePng(arguments_: Cons): LispValue {\n return this.saveCanvas(arguments_, 'image/png', 'png');\n }\n\n /**\n * Shared implementation of `gsave-jpeg` / `gsave-png`. With no argument it\n * triggers a browser download; with a single string argument it writes the\n * encoded image to that file path on Node.js.\n * @param arguments_ - the evaluated argument list (empty, or one path string)\n * @param mimeType - the image MIME type to encode\n * @param label - the format name used in diagnostics (\"jpeg\" / \"png\")\n * @return `t` on success\n */\n saveCanvas(arguments_: Cons, mimeType: string, label: string): LispValue {\n this.#requireOpenContext();\n const length_ = arguments_.length();\n if (length_ === 0) {\n return this.#downloadCanvas(mimeType, label);\n }\n if (length_ === 1 && Cons.isString(arguments_.car)) {\n return this.#writeCanvasToFile(arguments_.car, mimeType, label);\n }\n throw new EvalError(`Can not save ${label}.`);\n }\n\n gScale(arguments_: Cons): LispValue {\n return this.#execute('Can not scale.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n context.scale(a[0], a[1]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gShadowBlur(arguments_: Cons): LispValue {\n return this.#execute('Can not set shadow blur.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.shadowBlur = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gShadowColor(arguments_: Cons): LispValue {\n return this.#execute('Can not set shadow color.', (context) => {\n if (arguments_.length() < 1) return null;\n context.shadowColor = this.selectColor(arguments_);\n return InterpretedSymbol.of('t');\n });\n }\n\n gShadowOffsetX(arguments_: Cons): LispValue {\n return this.#execute('Can not set shadow offsetX.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.shadowOffsetX = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gShadowOffsetY(arguments_: Cons): LispValue {\n return this.#execute('Can not set shadow offsetY.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.shadowOffsetY = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gSleep(arguments_: Cons): LispValue {\n return this.#execute('Can not sleep', () => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n const time = Date.now() + a[0];\n while (Date.now() < time) {\n // busy wait\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gStartPath(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not start path.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.beginPath();\n return InterpretedSymbol.of('t');\n });\n }\n\n gStroke(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not stroke.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.stroke();\n return InterpretedSymbol.of('t');\n });\n }\n\n gStrokeColor(arguments_: Cons): LispValue {\n return this.#execute('Can not set stroke color', (context) => {\n if (arguments_.length() < 1) return null;\n context.strokeStyle = this.selectColor(arguments_);\n return InterpretedSymbol.of('t');\n });\n }\n\n gStrokeRect(arguments_: Cons): LispValue {\n return this.#execute('Can not draw stroke rectangle.', (context) => {\n const a = this.#numbers(arguments_, 4);\n if (a === null) return null;\n context.strokeRect(a[0], a[1], a[2], a[3]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gStrokeText(arguments_: Cons): LispValue {\n return this.#execute('Can not draw stroke text.', (context) => {\n const length_ = arguments_.length();\n if (length_ !== 3 && length_ !== 4) return null;\n const [a0, a1, a2, a3] = this.#listValues(arguments_);\n if (!Cons.isString(a0) || !Cons.isNumber(a1) || !Cons.isNumber(a2)) return null;\n if (length_ === 4) {\n if (!Cons.isNumber(a3)) return null;\n context.strokeText(a0, Numeric.toFloat(a1), Numeric.toFloat(a2), Numeric.toFloat(a3));\n } else {\n context.strokeText(a0, Numeric.toFloat(a1), Numeric.toFloat(a2));\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gStrokeTri(arguments_: Cons): LispValue {\n return this.#execute('Can not draw stroke triangle.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.beginPath();\n context.moveTo(a[0], a[1]);\n context.lineTo(a[2], a[3]);\n context.lineTo(a[4], a[5]);\n context.closePath();\n context.stroke();\n return InterpretedSymbol.of('t');\n });\n }\n\n gTextAlign(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text align. Expected \"left\" / \"right\" / \"center\" / \"start\" / \"end\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_ALIGNS);\n if (value === null) return null;\n context.textAlign = value as CanvasTextAlign;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextBaseline(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text baseline. Expected \"top\" / \"hanging\" / \"middle\" / \"alphabetic\" / \"ideographic\" / \"bottom\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_BASELINES);\n if (value === null) return null;\n context.textBaseline = value as CanvasTextBaseline;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextDirection(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text direction. Expected \"ltr\" / \"rtl\" / \"inherit\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_DIRECTIONS);\n if (value === null) return null;\n context.direction = value as CanvasDirection;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextFont(arguments_: Cons): LispValue {\n return this.#execute('Can not set text font.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.font = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gTranslate(arguments_: Cons): LispValue {\n return this.#execute('Can not translate.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n context.translate(a[0], a[1]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gRect(arguments_: Cons): LispValue {\n return this.#execute('Can not draw rectangle.', (context) => {\n const a = this.#numbers(arguments_, 4);\n if (a === null) return null;\n context.rect(a[0], a[1], a[2], a[3]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gRotate(arguments_: Cons): LispValue {\n return this.#execute('Can not rotate.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.rotate((Math.PI / 180) * a[0]);\n return InterpretedSymbol.of('t');\n });\n }\n\n /**\n * Pushes the current drawing state (styles, transform, clip) onto the\n * context's state stack. Pairs with `gRestore` to let Lisp callers manage\n * state explicitly. Replaces the legacy per-method `context.save()` calls, which\n * pushed state on every draw with no matching `restore()` and grew the stack\n * unbounded.\n * @return `t` on success\n */\n gSave(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not save.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.save();\n return InterpretedSymbol.of('t');\n });\n }\n\n /**\n * Pops the most recently saved drawing state off the context's state stack.\n * Pairs with `gSave`. Popping an empty stack is a no-op per the Canvas spec.\n * @return `t` on success\n */\n gRestore(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not restore.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.restore();\n return InterpretedSymbol.of('t');\n });\n }\n\n gEllipse(arguments_: Cons): LispValue {\n return this.#execute('Can not draw ellipse.', (context) => {\n const a = this.#numbers(arguments_, 8);\n if (a === null) return null;\n context.ellipse(\n a[0],\n a[1],\n a[2],\n a[3],\n (Math.PI / 180) * a[4],\n (Math.PI / 180) * a[5],\n (Math.PI / 180) * a[6],\n a[7] >= 0,\n );\n return InterpretedSymbol.of('t');\n });\n }\n\n gRoundRect(arguments_: Cons): LispValue {\n return this.#execute('Can not draw round rectangle.', (context) => {\n const a = this.#numbers(arguments_, 5);\n if (a === null) return null;\n context.roundRect(a[0], a[1], a[2], a[3], a[4]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineDash(arguments_: Cons): LispValue {\n return this.#execute('Can not set line dash.', (context) => {\n const segments = this.#numbers(arguments_, arguments_.length());\n if (segments === null) return null;\n // The Canvas spec ignores setLineDash when any segment is negative or\n // non-finite; reject those instead of reporting a success that never\n // took effect (or, on some engines, stored an invalid dash).\n if (segments.some((segment) => !Number.isFinite(segment) || segment < 0)) return null;\n context.setLineDash(segments);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLineDashOffset(arguments_: Cons): LispValue {\n return this.#execute('Can not set line dash offset.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.lineDashOffset = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gMiterLimit(arguments_: Cons): LispValue {\n return this.#execute('Can not set miter limit.', (context) => {\n const a = this.#numbers(arguments_, 1);\n if (a === null) return null;\n context.miterLimit = a[0];\n return InterpretedSymbol.of('t');\n });\n }\n\n gClip(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not clip.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.clip();\n return InterpretedSymbol.of('t');\n });\n }\n\n gIsPointInPath(arguments_: Cons): LispValue {\n return this.#execute('Can not test point in path.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n return context.isPointInPath(a[0], a[1]) ? InterpretedSymbol.of('t') : Cons.nil;\n });\n }\n\n gIsPointInStroke(arguments_: Cons): LispValue {\n return this.#execute('Can not test point in stroke.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n return context.isPointInStroke(a[0], a[1]) ? InterpretedSymbol.of('t') : Cons.nil;\n });\n }\n\n gTransform(arguments_: Cons): LispValue {\n return this.#execute('Can not transform.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.transform(a[0], a[1], a[2], a[3], a[4], a[5]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gSetTransform(arguments_: Cons): LispValue {\n return this.#execute('Can not set transform.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n context.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gResetTransform(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not reset transform.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.resetTransform();\n return InterpretedSymbol.of('t');\n });\n }\n\n gComposite(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set composite operation. Expected a globalCompositeOperation keyword such as \"source-over\" / \"multiply\" / \"screen\".',\n (context) => {\n const value = this.#enumString(arguments_, COMPOSITE_OPERATIONS);\n if (value === null) return null;\n context.globalCompositeOperation = value as GlobalCompositeOperation;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gFilter(arguments_: Cons): LispValue {\n return this.#execute('Can not set filter.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.filter = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gImageSmoothing(arguments_: Cons): LispValue {\n return this.#execute('Can not set image smoothing.', (context) => {\n const quality = arguments_.length() === 1 ? arguments_.car : null;\n if (quality !== 'off' && quality !== 'low' && quality !== 'medium' && quality !== 'high') {\n return null;\n }\n if (quality === 'off') {\n context.imageSmoothingEnabled = false;\n } else {\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = quality;\n }\n return InterpretedSymbol.of('t');\n });\n }\n\n gMeasureText(arguments_: Cons): LispValue {\n return this.#execute('Can not measure text.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n return context.measureText(arguments_.car).width;\n });\n }\n\n gLetterSpacing(arguments_: Cons): LispValue {\n return this.#execute('Can not set letter spacing.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.letterSpacing = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gWordSpacing(arguments_: Cons): LispValue {\n return this.#execute('Can not set word spacing.', (context) => {\n if (arguments_.length() !== 1 || !Cons.isString(arguments_.car)) return null;\n context.wordSpacing = arguments_.car;\n return InterpretedSymbol.of('t');\n });\n }\n\n gFontKerning(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set font kerning. Expected \"auto\" / \"normal\" / \"none\".',\n (context) => {\n const value = this.#enumString(arguments_, FONT_KERNINGS);\n if (value === null) return null;\n context.fontKerning = value as CanvasFontKerning;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gFontStretch(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set font stretch. Expected a font-stretch keyword such as \"condensed\" / \"normal\" / \"expanded\".',\n (context) => {\n const value = this.#enumString(arguments_, FONT_STRETCHES);\n if (value === null) return null;\n context.fontStretch = value as CanvasFontStretch;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gFontVariant(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set font variant. Expected a font-variant-caps keyword such as \"normal\" / \"small-caps\".',\n (context) => {\n const value = this.#enumString(arguments_, FONT_VARIANTS);\n if (value === null) return null;\n context.fontVariantCaps = value as CanvasFontVariantCaps;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gTextRendering(arguments_: Cons): LispValue {\n return this.#execute(\n 'Can not set text rendering. Expected \"auto\" / \"optimizeSpeed\" / \"optimizeLegibility\" / \"geometricPrecision\".',\n (context) => {\n const value = this.#enumString(arguments_, TEXT_RENDERINGS);\n if (value === null) return null;\n context.textRendering = value as CanvasTextRendering;\n return InterpretedSymbol.of('t');\n },\n );\n }\n\n gClearRect(arguments_: Cons): LispValue {\n return this.#execute('Can not clear rectangle.', (context) => {\n const a = this.#numbers(arguments_, 4);\n if (a === null) return null;\n context.clearRect(a[0], a[1], a[2], a[3]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gReset(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not reset.', (context) => {\n if (arguments_.length() !== 0) return null;\n context.reset();\n return InterpretedSymbol.of('t');\n });\n }\n\n // gWidth / gHeight / gPixel return bigint so their integer results are\n // kei-lisp v3 integers (exact, `integerp` → t) rather than floats.\n gWidth(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not get width.', () =>\n arguments_.length() === 0 ? BigInt(this.canvas.width) : null,\n );\n }\n\n gHeight(arguments_: Cons = Cons.nil): LispValue {\n return this.#execute('Can not get height.', () =>\n arguments_.length() === 0 ? BigInt(this.canvas.height) : null,\n );\n }\n\n gPixel(arguments_: Cons): LispValue {\n return this.#execute('Can not read pixel.', (context) => {\n const a = this.#numbers(arguments_, 2);\n if (a === null) return null;\n const data = context.getImageData(a[0], a[1], 1, 1).data;\n return this.#toList([BigInt(data[0]), BigInt(data[1]), BigInt(data[2]), BigInt(data[3])]);\n });\n }\n\n gSetPixel(arguments_: Cons): LispValue {\n return this.#execute('Can not write pixel.', (context) => {\n const a = this.#numbers(arguments_, 6);\n if (a === null) return null;\n const imageData = context.createImageData(1, 1);\n imageData.data[0] = a[2];\n imageData.data[1] = a[3];\n imageData.data[2] = a[4];\n imageData.data[3] = a[5];\n context.putImageData(imageData, a[0], a[1]);\n return InterpretedSymbol.of('t');\n });\n }\n\n gLinearGradient(arguments_: Cons): LispValue {\n return this.#execute('Can not set linear gradient.', (context) => {\n const [x0, y0, x1, y1, ...stops] = this.#listValues(arguments_);\n if (\n stops.length < 2 ||\n !Cons.isNumber(x0) ||\n !Cons.isNumber(y0) ||\n !Cons.isNumber(x1) ||\n !Cons.isNumber(y1)\n ) {\n return null;\n }\n return this.#installGradient(\n context,\n context.createLinearGradient(\n Numeric.toFloat(x0),\n Numeric.toFloat(y0),\n Numeric.toFloat(x1),\n Numeric.toFloat(y1),\n ),\n stops,\n );\n });\n }\n\n gRadialGradient(arguments_: Cons): LispValue {\n return this.#execute('Can not set radial gradient.', (context) => {\n const [x0, y0, r0, x1, y1, r1, ...stops] = this.#listValues(arguments_);\n if (\n stops.length < 2 ||\n !Cons.isNumber(x0) ||\n !Cons.isNumber(y0) ||\n !Cons.isNumber(r0) ||\n !Cons.isNumber(x1) ||\n !Cons.isNumber(y1) ||\n !Cons.isNumber(r1)\n ) {\n return null;\n }\n return this.#installGradient(\n context,\n context.createRadialGradient(\n Numeric.toFloat(x0),\n Numeric.toFloat(y0),\n Numeric.toFloat(r0),\n Numeric.toFloat(x1),\n Numeric.toFloat(y1),\n Numeric.toFloat(r1),\n ),\n stops,\n );\n });\n }\n\n gConicGradient(arguments_: Cons): LispValue {\n return this.#execute('Can not set conic gradient.', (context) => {\n const [angle, x, y, ...stops] = this.#listValues(arguments_);\n if (stops.length < 2 || !Cons.isNumber(angle) || !Cons.isNumber(x) || !Cons.isNumber(y)) {\n return null;\n }\n return this.#installGradient(\n context,\n context.createConicGradient(\n (Math.PI / 180) * Numeric.toFloat(angle),\n Numeric.toFloat(x),\n Numeric.toFloat(y),\n ),\n stops,\n );\n });\n }\n\n /**\n * Parses a color spec from the head of the argument Cons. Accepts\n * (1 string), (3 numbers — rgb), or (4 numbers — rgba); falls back to\n * `'black'` on anything else (legacy behavior — a best-effort color parse\n * that prints a diagnostic instead of signaling an error).\n * @param arguments_ - the argument Cons to parse\n * @return CSS color string\n */\n selectColor(arguments_: Cons): string {\n let aColor = 'black';\n const length_ = arguments_.length();\n const a0 = arguments_.car;\n if (length_ === 1 && Cons.isString(a0)) {\n aColor = a0;\n } else if (length_ === 3) {\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n aColor = `rgb(${Numeric.toFloat(a0)}, ${Numeric.toFloat(a1)}, ${Numeric.toFloat(a2)})`;\n } else {\n this.#print('Can not set color. set color \"black\".');\n }\n } else if (length_ === 4) {\n const cdr1 = arguments_.cdr as Cons;\n const a1 = cdr1.car;\n const cdr2 = cdr1.cdr as Cons;\n const a2 = cdr2.car;\n const cdr3 = cdr2.cdr as Cons;\n const a3 = cdr3.car;\n if (Cons.isNumber(a0) && Cons.isNumber(a1) && Cons.isNumber(a2) && Cons.isNumber(a3)) {\n aColor = `rgba(${Numeric.toFloat(a0)}, ${Numeric.toFloat(a1)}, ${Numeric.toFloat(a2)}, ${Numeric.toFloat(a3)})`;\n } else {\n this.#print('Can not set color. set color \"black\".');\n }\n } else {\n this.#print('Can not set color. set color \"black\".');\n }\n return aColor;\n }\n}\n","import { GraphicsPlugin } from './GraphicsPlugin/index.js';\n\n/**\n * Creates a Canvas2D drawing plugin bound to the given canvas. Register it on\n * a `LispInterpreter` via `interpreter.use(plugin)` to make the `g…` drawing\n * primitives callable from Lisp source.\n * @param options - the canvas to draw to\n * @return a KeiLispPlugin that handles the `g…` symbols\n */\nexport function createGraphicsPlugin(options: {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n}): GraphicsPlugin {\n return new GraphicsPlugin(options.canvas);\n}\n\nexport { GraphicsPlugin } from './GraphicsPlugin/index.js';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
;; @file animation.lisp
|
|
2
|
+
;; Frame-loop helper for kei-lisp-plugin-graphics.
|
|
3
|
+
;;
|
|
4
|
+
;; Usage:
|
|
5
|
+
;; (load "node_modules/kei-lisp-plugin-graphics/lisp/animation.lisp")
|
|
6
|
+
;; (ganimate 30 20 (lambda (frame) (gclear) (gfill-rect (* frame 4) 20 30 30)))
|
|
7
|
+
;;
|
|
8
|
+
;; Note: gsleep busy-waits between frames — it blocks the thread and burns
|
|
9
|
+
;; CPU, so keep FRAMES x DELAY small (see docs/graphics.md).
|
|
10
|
+
|
|
11
|
+
;; Calls DRAW with the frame index 0 .. FRAMES-1, sleeping DELAY
|
|
12
|
+
;; milliseconds after each frame.
|
|
13
|
+
(defun ganimate (frames delay draw)
|
|
14
|
+
(do ((frame 0 (+ frame 1)))
|
|
15
|
+
((>= frame frames) t)
|
|
16
|
+
(draw frame)
|
|
17
|
+
(gsleep delay)))
|
package/lisp/grid.lisp
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
;; @file grid.lisp
|
|
2
|
+
;; Grid-drawing pattern for kei-lisp-plugin-graphics.
|
|
3
|
+
;;
|
|
4
|
+
;; Usage:
|
|
5
|
+
;; (load "node_modules/kei-lisp-plugin-graphics/lisp/grid.lisp")
|
|
6
|
+
;; (ggrid 40)
|
|
7
|
+
|
|
8
|
+
;; Draws vertical and horizontal grid lines every STEP pixels across the
|
|
9
|
+
;; whole canvas, using the current stroke color and line width. STEP must
|
|
10
|
+
;; be positive; anything else would loop forever, so it signals an error.
|
|
11
|
+
(defun ggrid (step)
|
|
12
|
+
(when (<= step 0)
|
|
13
|
+
(error "ggrid: step must be positive"))
|
|
14
|
+
(do ((x step (+ x step)))
|
|
15
|
+
((>= x (gwidth)) t)
|
|
16
|
+
(gstart-path)
|
|
17
|
+
(gmove-to x 0)
|
|
18
|
+
(gline-to x (gheight))
|
|
19
|
+
(gstroke))
|
|
20
|
+
(do ((y step (+ y step)))
|
|
21
|
+
((>= y (gheight)) t)
|
|
22
|
+
(gstart-path)
|
|
23
|
+
(gmove-to 0 y)
|
|
24
|
+
(gline-to (gwidth) y)
|
|
25
|
+
(gstroke))
|
|
26
|
+
t)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
;; @file palette.lisp
|
|
2
|
+
;; Color-palette helpers for kei-lisp-plugin-graphics.
|
|
3
|
+
;;
|
|
4
|
+
;; Usage:
|
|
5
|
+
;; (load "node_modules/kei-lisp-plugin-graphics/lisp/palette.lisp")
|
|
6
|
+
;; (gpalette 0) ; => "#4e79a7"
|
|
7
|
+
;; (gpalette-color 3) ; sets fill and stroke color to palette entry 3
|
|
8
|
+
|
|
9
|
+
;; An 8-color categorical palette (Tableau 10 subset). Any integer index is
|
|
10
|
+
;; valid: indexes wrap around the 8 entries.
|
|
11
|
+
(setq *gpalette*
|
|
12
|
+
'("#4e79a7" "#f28e2b" "#e15759" "#76b7b2" "#59a14f" "#edc948" "#b07aa1" "#9c755f"))
|
|
13
|
+
|
|
14
|
+
;; Returns the N-th palette color string, 0-based, wrapping modulo the
|
|
15
|
+
;; palette size. kei-lisp's mod truncates toward zero, so negative indexes
|
|
16
|
+
;; need the double-mod to wrap; nth is 1-based, hence the + 1. A palette
|
|
17
|
+
;; slot is discrete, so a non-integer index has no meaning and signals an
|
|
18
|
+
;; error instead of silently missing (which would return nil, then paint
|
|
19
|
+
;; black through gpalette-color).
|
|
20
|
+
(defun gpalette (n)
|
|
21
|
+
(unless (integerp n)
|
|
22
|
+
(error "gpalette: index must be an integer"))
|
|
23
|
+
(let ((size (length *gpalette*)))
|
|
24
|
+
(nth (+ 1 (mod (+ (mod n size) size) size)) *gpalette*)))
|
|
25
|
+
|
|
26
|
+
;; Sets both fill and stroke color to the N-th palette color.
|
|
27
|
+
(defun gpalette-color (n)
|
|
28
|
+
(gcolor (gpalette n)))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kei-lisp-plugin-graphics",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Canvas2D graphics plugin for the kei-lisp interpreter",
|
|
5
5
|
"author": "Keisuke Ikeda",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,10 +36,11 @@
|
|
|
36
36
|
},
|
|
37
37
|
"types": "./dist/index.d.ts",
|
|
38
38
|
"files": [
|
|
39
|
-
"dist/"
|
|
39
|
+
"dist/",
|
|
40
|
+
"lisp/"
|
|
40
41
|
],
|
|
41
42
|
"peerDependencies": {
|
|
42
|
-
"kei-lisp": "^
|
|
43
|
+
"kei-lisp": "^3.0.1"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@arethetypeswrong/cli": "^0.18.4",
|
|
@@ -60,7 +61,7 @@
|
|
|
60
61
|
"eslint-plugin-unused-imports": "^4.4.1",
|
|
61
62
|
"globals": "^17.6.0",
|
|
62
63
|
"happy-dom": "^20.8.9",
|
|
63
|
-
"kei-lisp": "^
|
|
64
|
+
"kei-lisp": "^3.0.1",
|
|
64
65
|
"knip": "^6.24.0",
|
|
65
66
|
"npm-run-all": "^4.1.5",
|
|
66
67
|
"playwright": "^1.61.1",
|
|
@@ -87,17 +88,17 @@
|
|
|
87
88
|
"typecheck": "tsc --noEmit",
|
|
88
89
|
"check": "run-s check:*",
|
|
89
90
|
"check:format": "prettier \"./src/**/*.ts\" \"./examples/**/*.ts\" --check",
|
|
90
|
-
"check:format-config": "prettier \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" --check",
|
|
91
|
+
"check:format-config": "prettier \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" \"./examples/*.js\" \"./examples/shims/**/*.js\" --check",
|
|
91
92
|
"check:knip": "knip",
|
|
92
93
|
"check:lint": "eslint \"./src/**/*.ts\" \"./examples/**/*.ts\"",
|
|
93
|
-
"check:lint-config": "eslint ./*.{js,mjs} \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\"",
|
|
94
|
+
"check:lint-config": "eslint ./*.{js,mjs} \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" \"./examples/*.js\" \"./examples/shims/**/*.js\"",
|
|
94
95
|
"check:package": "publint && attw --pack .",
|
|
95
|
-
"check:spell": "cspell \"./src/**/*.ts\" \"./examples/**/*.ts\"",
|
|
96
|
-
"check:spell-config": "cspell \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\"",
|
|
96
|
+
"check:spell": "cspell \"./src/**/*.ts\" \"./examples/**/*.ts\" \"./lisp/**/*.lisp\"",
|
|
97
|
+
"check:spell-config": "cspell \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" \"./examples/*.js\" \"./examples/shims/**/*.js\"",
|
|
97
98
|
"fix": "run-s fix:*",
|
|
98
99
|
"fix:format": "prettier \"./src/**/*.ts\" \"./examples/**/*.ts\" --write",
|
|
99
|
-
"fix:format-config": "prettier \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" --write",
|
|
100
|
+
"fix:format-config": "prettier \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" \"./examples/*.js\" \"./examples/shims/**/*.js\" --write",
|
|
100
101
|
"fix:lint": "eslint \"./src/**/*.ts\" \"./examples/**/*.ts\" --fix",
|
|
101
|
-
"fix:lint-config": "eslint ./*.{js,mjs} \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" --fix"
|
|
102
|
+
"fix:lint-config": "eslint ./*.{js,mjs} \"./configs/**/*.mjs\" \"./e2e/**/*.mjs\" \"./examples/*.js\" \"./examples/shims/**/*.js\" --fix"
|
|
102
103
|
}
|
|
103
104
|
}
|