kei-lisp-plugin-graphics 1.1.0 → 2.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 CHANGED
@@ -9,6 +9,16 @@ A Canvas2D drawing plugin for the [kei-lisp](https://github.com/ike-keichan/kei-
9
9
  interpreter. Register it on a `LispInterpreter` and call drawing primitives
10
10
  (`gopen`, `gline-to`, `gfill-rect`, ...) directly from Lisp source.
11
11
 
12
+ > [!WARNING]
13
+ > This is a **toy / hobby project** built for learning and experimentation.
14
+ > **Use in production (or any other serious product) is not recommended.**
15
+ > APIs may change without notice, and maintenance and support are provided
16
+ > on a best-effort basis only.
17
+ >
18
+ > It is also a **personal project**: issue reports (bugs, questions, ideas)
19
+ > are welcome, but external pull requests are generally **not accepted** —
20
+ > see [CONTRIBUTING.md](./CONTRIBUTING.md).
21
+
12
22
  ## Features
13
23
 
14
24
  - 45 Canvas2D drawing primitives (`g…` symbols) callable directly from Lisp source
package/dist/index.cjs CHANGED
@@ -100,6 +100,67 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
100
100
  process.stderr.write(line + "\n");
101
101
  }
102
102
  /**
103
+ * Encodes the canvas via `toDataURL` and triggers a browser download through
104
+ * a temporary `<a download>` element. Requires a DOM (`document`) and an
105
+ * `HTMLCanvasElement`; `OffscreenCanvas` has no `toDataURL`, and Node.js has
106
+ * no `document` — those callers must pass a file path instead.
107
+ * @param mimeType - the image MIME type to encode
108
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
109
+ * @return `t` on success, `Cons.nil` otherwise
110
+ */
111
+ #downloadCanvas(mimeType, label) {
112
+ if (typeof document === "undefined" || !("toDataURL" in this.canvas)) {
113
+ this.#print(`Can not save ${label}. Browser download needs a DOM and an HTMLCanvasElement; pass a file path to save on Node.js.`);
114
+ return kei_lisp.Cons.nil;
115
+ }
116
+ try {
117
+ const link = document.createElement("a");
118
+ link.href = this.canvas.toDataURL(mimeType);
119
+ link.download = "canvas";
120
+ document.body.append(link);
121
+ link.click();
122
+ link.remove();
123
+ return kei_lisp.InterpretedSymbol.of("t");
124
+ } catch {
125
+ this.#print(`Can not save ${label}. If you are using an image in the canvas, you can't save ${label}.`);
126
+ return kei_lisp.Cons.nil;
127
+ }
128
+ }
129
+ /**
130
+ * Writes the encoded canvas image to a file path on Node.js, using
131
+ * `process.getBuiltinModule('node:fs')` so browser bundles never see a
132
+ * `node:fs` import. `HTMLCanvasElement` (and node-canvas) encode
133
+ * synchronously via `toDataURL`; `OffscreenCanvas` only offers the async
134
+ * `convertToBlob`, so its file is written after this returns — the same
135
+ * fire-and-forget contract as `gImage`.
136
+ * @param path - the destination file path
137
+ * @param mimeType - the image MIME type to encode
138
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
139
+ * @return `t` on success, `Cons.nil` otherwise
140
+ */
141
+ #writeCanvasToFile(path, mimeType, label) {
142
+ const fs = typeof process.getBuiltinModule === "function" ? process.getBuiltinModule("node:fs") : void 0;
143
+ if (fs === void 0) {
144
+ this.#print(`Can not save ${label}. Saving to a file path requires Node.js.`);
145
+ return kei_lisp.Cons.nil;
146
+ }
147
+ try {
148
+ if ("toDataURL" in this.canvas) {
149
+ const dataUrl = this.canvas.toDataURL(mimeType);
150
+ const base64 = dataUrl.slice(dataUrl.indexOf(",") + 1);
151
+ fs.writeFileSync(path, Buffer.from(base64, "base64"));
152
+ return kei_lisp.InterpretedSymbol.of("t");
153
+ }
154
+ this.canvas.convertToBlob({ type: mimeType }).then(async (blob) => {
155
+ fs.writeFileSync(path, new Uint8Array(await blob.arrayBuffer()));
156
+ });
157
+ return kei_lisp.InterpretedSymbol.of("t");
158
+ } catch {
159
+ this.#print(`Can not save ${label}.`);
160
+ return kei_lisp.Cons.nil;
161
+ }
162
+ }
163
+ /**
103
164
  * Returns true if this plugin handles the given symbol.
104
165
  * @param aSymbol - the call symbol
105
166
  * @return true if `apply` should be called
@@ -489,9 +550,8 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
489
550
  gLineCap(arguments_) {
490
551
  if (!this.checkSupport()) return kei_lisp.Cons.nil;
491
552
  if (this.isOpen) try {
492
- if (arguments_.length() === 1 && kei_lisp.Cons.isNumber(arguments_.car)) {
493
- const aString = arguments_.car === 0 ? "butt" : arguments_.car > 0 ? "round" : "square";
494
- this.ctx.lineCap = aString;
553
+ if (arguments_.length() === 1 && kei_lisp.Cons.isString(arguments_.car)) {
554
+ this.ctx.lineCap = arguments_.car;
495
555
  return kei_lisp.InterpretedSymbol.of("t");
496
556
  }
497
557
  this.#print("Can not set line cap.");
@@ -506,9 +566,8 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
506
566
  gLineJoin(arguments_) {
507
567
  if (!this.checkSupport()) return kei_lisp.Cons.nil;
508
568
  if (this.isOpen) try {
509
- if (arguments_.length() === 1 && kei_lisp.Cons.isNumber(arguments_.car)) {
510
- const aString = arguments_.car === 0 ? "miter" : arguments_.car > 0 ? "round" : "bevel";
511
- this.ctx.lineJoin = aString;
569
+ if (arguments_.length() === 1 && kei_lisp.Cons.isString(arguments_.car)) {
570
+ this.ctx.lineJoin = arguments_.car;
512
571
  return kei_lisp.InterpretedSymbol.of("t");
513
572
  }
514
573
  this.#print("Can not set line join.");
@@ -623,41 +682,28 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
623
682
  this.#print("The canvas is closed and cannot be executed.");
624
683
  return kei_lisp.Cons.nil;
625
684
  }
626
- gSaveJpeg() {
627
- if (!this.checkSupport()) return kei_lisp.Cons.nil;
628
- if (this.isOpen) try {
629
- const anImage = new Image();
630
- anImage.crossOrigin = "Anonymous";
631
- anImage.src = this.canvas.toDataURL("image/jpeg");
632
- const link = document.createElement("a");
633
- link.href = anImage.src;
634
- link.download = "canvas";
635
- document.body.append(link);
636
- link.click();
637
- link.remove();
638
- return kei_lisp.InterpretedSymbol.of("t");
639
- } catch {
640
- this.#print("Can not save jpeg. If you are using an image in the canvas, you can't save jpeg.");
641
- return kei_lisp.Cons.nil;
642
- }
643
- this.#print("The canvas is closed and cannot be executed.");
644
- return kei_lisp.Cons.nil;
685
+ gSaveJpeg(arguments_) {
686
+ return this.saveCanvas(arguments_, "image/jpeg", "jpeg");
687
+ }
688
+ gSavePng(arguments_) {
689
+ return this.saveCanvas(arguments_, "image/png", "png");
645
690
  }
646
- gSavePng() {
691
+ /**
692
+ * Shared implementation of `gsave-jpeg` / `gsave-png`. With no argument it
693
+ * triggers a browser download; with a single string argument it writes the
694
+ * encoded image to that file path on Node.js.
695
+ * @param arguments_ - the evaluated argument list (empty, or one path string)
696
+ * @param mimeType - the image MIME type to encode
697
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
698
+ * @return `t` on success, `Cons.nil` otherwise
699
+ */
700
+ saveCanvas(arguments_, mimeType, label) {
647
701
  if (!this.checkSupport()) return kei_lisp.Cons.nil;
648
- if (this.isOpen) try {
649
- const anImage = new Image();
650
- anImage.crossOrigin = "Anonymous";
651
- anImage.src = this.canvas.toDataURL("image/png");
652
- const link = document.createElement("a");
653
- link.href = anImage.src;
654
- link.download = "canvas";
655
- document.body.append(link);
656
- link.click();
657
- link.remove();
658
- return kei_lisp.InterpretedSymbol.of("t");
659
- } catch {
660
- this.#print("Can not save png. If you are using an image in the canvas, you can't save png.");
702
+ if (this.isOpen) {
703
+ const length_ = arguments_.length();
704
+ if (length_ === 0) return this.#downloadCanvas(mimeType, label);
705
+ if (length_ === 1 && kei_lisp.Cons.isString(arguments_.car)) return this.#writeCanvasToFile(arguments_.car, mimeType, label);
706
+ this.#print(`Can not save ${label}.`);
661
707
  return kei_lisp.Cons.nil;
662
708
  }
663
709
  this.#print("The canvas is closed and cannot be executed.");
@@ -911,9 +957,8 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
911
957
  gTextDirection(arguments_) {
912
958
  if (!this.checkSupport()) return kei_lisp.Cons.nil;
913
959
  if (this.isOpen) try {
914
- if (arguments_.length() === 1 && kei_lisp.Cons.isNumber(arguments_.car)) {
915
- const aString = arguments_.car === 0 ? "inherit" : arguments_.car > 0 ? "rtl" : "ltr";
916
- this.ctx.direction = aString;
960
+ if (arguments_.length() === 1 && kei_lisp.Cons.isString(arguments_.car)) {
961
+ this.ctx.direction = arguments_.car;
917
962
  return kei_lisp.InterpretedSymbol.of("t");
918
963
  }
919
964
  this.#print("Can not set text direction.");
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["InterpretedSymbol","#print","Cons"],"sources":["../src/GraphicsPlugin/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-add-event-listener,\n 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 (Image#onload, clamp ternaries, mode-flag\n// ternaries, 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/**\n * @class\n * @classdesc Canvas2D drawing plugin for the kei-lisp interpreter. Implements\n * the `KeiLispPlugin` contract (`name` / `has` / `apply`) and\n * exposes 45 `g…` Lisp functions that proxy to a 2D rendering\n * context.\n * @author Keisuke Ikeda\n * @this {GraphicsPlugin}\n */\nexport class GraphicsPlugin extends Object implements KeiLispPlugin {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of\n * the GraphicsPlugin method that implements it.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = GraphicsPlugin.setup();\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-dire'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-font'), 'gTextFont');\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 return aTable;\n }\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 super();\n this.canvas = canvas;\n this.ctx = canvas.getContext('2d');\n this.isOpen = false;\n }\n\n /**\n * Writes a diagnostic line directly to `process.stderr`, matching the\n * convention used by kei-lisp itself (`Applier.format` writes to\n * `process.stdout`). In a Node runtime this hits the real stderr; in a\n * 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 * so the same call reaches the user via the host's normal output channel.\n * @param line - the line to write\n */\n #print(line: string): void {\n process.stderr.write(line + '\\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.buildInFunctions.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 return this.selectProcedure(aSymbol, arguments_);\n }\n\n /**\n * Resolves the procedure name and invokes the matching method.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result, or `Cons.nil` if not registered\n */\n selectProcedure(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n if (GraphicsPlugin.buildInFunctions.has(procedure)) {\n return this.buildInFunction(procedure, arguments_);\n }\n this.#print(`I could find no procedure description for ${String(procedure)}`);\n return Cons.nil;\n }\n\n /**\n * Looks up and invokes the JS method that implements the given Lisp symbol.\n * Throws `TypeError` when the dispatch table points to a method that does\n * not exist on the instance — this matches the legacy behavior, where the\n * Ramda `R.invoker(1, methodName)(args, this)` call would surface the same\n * error by attempting to call `undefined`.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result\n */\n buildInFunction(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n const methodName = GraphicsPlugin.buildInFunctions.get(procedure) as string;\n const target = this as unknown as Record<string, unknown>;\n const method = target[methodName];\n if (typeof method !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n return (method as (arguments__: Cons) => LispValue).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 ctx 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(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\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 return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not clear.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.fillText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw fill text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw fill text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const length_ = arguments_.length();\n if (length_ === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2);\n };\n return InterpretedSymbol.of('t');\n }\n } else if (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.isString(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4)\n ) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2, a3, a4);\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw Image.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw Image.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n const aString = arguments_.car === 0 ? 'butt' : arguments_.car > 0 ? 'round' : 'square';\n this.ctx.lineCap = aString;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line cap.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line cap.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gLineJoin(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 aString = arguments_.car === 0 ? 'miter' : arguments_.car > 0 ? 'round' : 'bevel';\n this.ctx.lineJoin = aString;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line join.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line join.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 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.isString(a0) && Cons.isNumber(a1)) {\n const aString = a1 === 0 ? 'repeat' : a1 > 0 ? 'repeat-x' : 'repeat-y';\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n // Legacy bug: createPattern() may return null; assigning null to fillStyle\n // is a no-op in practice (browsers ignore or coerce it).\n context.fillStyle = context.createPattern(anImage, aString) as CanvasPattern;\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not set pattern.');\n return Cons.nil;\n } catch {\n this.#print('Can not set pattern.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const anImage = new Image();\n anImage.crossOrigin = 'Anonymous';\n // NOTE: toDataURL is not available on OffscreenCanvas; callers must use HTMLCanvasElement.\n anImage.src = (this.canvas as HTMLCanvasElement).toDataURL('image/jpeg');\n const link = document.createElement('a');\n link.href = anImage.src;\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 jpeg. If you are using an image in the canvas, you can't save jpeg.\",\n );\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gSavePng(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const anImage = new Image();\n anImage.crossOrigin = 'Anonymous';\n // NOTE: toDataURL is not available on OffscreenCanvas; callers must use HTMLCanvasElement.\n anImage.src = (this.canvas as HTMLCanvasElement).toDataURL('image/png');\n const link = document.createElement('a');\n link.href = anImage.src;\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 png. If you are using an image in the canvas, you can't save png.\",\n );\n return Cons.nil;\n }\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.strokeText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.textAlign = arguments_.car as CanvasTextAlign;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text align.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text align.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextBaseline(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.textBaseline = arguments_.car as CanvasTextBaseline;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text baseline.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text baseline.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextDirection(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 aString = arguments_.car === 0 ? 'inherit' : arguments_.car > 0 ? 'rtl' : 'ltr';\n this.ctx.direction = aString;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text direction.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text direction.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 `ctx.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 /**\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.cjs","names":["InterpretedSymbol","#print","Cons","#downloadCanvas","#writeCanvasToFile"],"sources":["../src/GraphicsPlugin/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-add-event-listener,\n 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 (Image#onload, clamp ternaries, mode-flag\n// ternaries, 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/**\n * @class\n * @classdesc Canvas2D drawing plugin for the kei-lisp interpreter. Implements\n * the `KeiLispPlugin` contract (`name` / `has` / `apply`) and\n * exposes 45 `g…` Lisp functions that proxy to a 2D rendering\n * context.\n * @author Keisuke Ikeda\n * @this {GraphicsPlugin}\n */\nexport class GraphicsPlugin extends Object implements KeiLispPlugin {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of\n * the GraphicsPlugin method that implements it.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = GraphicsPlugin.setup();\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-dire'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-font'), 'gTextFont');\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 return aTable;\n }\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 super();\n this.canvas = canvas;\n this.ctx = canvas.getContext('2d');\n this.isOpen = false;\n }\n\n /**\n * Writes a diagnostic line directly to `process.stderr`, matching the\n * convention used by kei-lisp itself (`Applier.format` writes to\n * `process.stdout`). In a Node runtime this hits the real stderr; in a\n * 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 * so the same call reaches the user via the host's normal output channel.\n * @param line - the line to write\n */\n #print(line: string): void {\n process.stderr.write(line + '\\n');\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.buildInFunctions.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 return this.selectProcedure(aSymbol, arguments_);\n }\n\n /**\n * Resolves the procedure name and invokes the matching method.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result, or `Cons.nil` if not registered\n */\n selectProcedure(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n if (GraphicsPlugin.buildInFunctions.has(procedure)) {\n return this.buildInFunction(procedure, arguments_);\n }\n this.#print(`I could find no procedure description for ${String(procedure)}`);\n return Cons.nil;\n }\n\n /**\n * Looks up and invokes the JS method that implements the given Lisp symbol.\n * Throws `TypeError` when the dispatch table points to a method that does\n * not exist on the instance — this matches the legacy behavior, where the\n * Ramda `R.invoker(1, methodName)(args, this)` call would surface the same\n * error by attempting to call `undefined`.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result\n */\n buildInFunction(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n const methodName = GraphicsPlugin.buildInFunctions.get(procedure) as string;\n const target = this as unknown as Record<string, unknown>;\n const method = target[methodName];\n if (typeof method !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n return (method as (arguments__: Cons) => LispValue).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 ctx 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(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\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 return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not clear.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.fillText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw fill text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw fill text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const length_ = arguments_.length();\n if (length_ === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2);\n };\n return InterpretedSymbol.of('t');\n }\n } else if (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.isString(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4)\n ) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2, a3, a4);\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw Image.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw Image.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.lineCap = arguments_.car as CanvasLineCap;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line cap.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line cap.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gLineJoin(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.lineJoin = arguments_.car as CanvasLineJoin;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line join.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line join.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 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.isString(a0) && Cons.isNumber(a1)) {\n const aString = a1 === 0 ? 'repeat' : a1 > 0 ? 'repeat-x' : 'repeat-y';\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n // Legacy bug: createPattern() may return null; assigning null to fillStyle\n // is a no-op in practice (browsers ignore or coerce it).\n context.fillStyle = context.createPattern(anImage, aString) as CanvasPattern;\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not set pattern.');\n return Cons.nil;\n } catch {\n this.#print('Can not set pattern.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.strokeText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.textAlign = arguments_.car as CanvasTextAlign;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text align.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text align.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextBaseline(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.textBaseline = arguments_.car as CanvasTextBaseline;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text baseline.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text baseline.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextDirection(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.direction = arguments_.car as CanvasDirection;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text direction.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text direction.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 `ctx.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 /**\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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"}
package/dist/index.d.cts CHANGED
@@ -97,8 +97,18 @@ declare class GraphicsPlugin extends Object implements KeiLispPlugin {
97
97
  gOpen(): LispValue;
98
98
  gPattern(arguments_: Cons): LispValue;
99
99
  gQuadCurveTo(arguments_: Cons): LispValue;
100
- gSaveJpeg(): LispValue;
101
- gSavePng(): LispValue;
100
+ gSaveJpeg(arguments_: Cons): LispValue;
101
+ gSavePng(arguments_: Cons): LispValue;
102
+ /**
103
+ * Shared implementation of `gsave-jpeg` / `gsave-png`. With no argument it
104
+ * triggers a browser download; with a single string argument it writes the
105
+ * encoded image to that file path on Node.js.
106
+ * @param arguments_ - the evaluated argument list (empty, or one path string)
107
+ * @param mimeType - the image MIME type to encode
108
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
109
+ * @return `t` on success, `Cons.nil` otherwise
110
+ */
111
+ saveCanvas(arguments_: Cons, mimeType: string, label: string): LispValue;
102
112
  gScale(arguments_: Cons): LispValue;
103
113
  gShadowBlur(arguments_: Cons): LispValue;
104
114
  gShadowColor(arguments_: Cons): LispValue;
package/dist/index.d.ts CHANGED
@@ -97,8 +97,18 @@ declare class GraphicsPlugin extends Object implements KeiLispPlugin {
97
97
  gOpen(): LispValue;
98
98
  gPattern(arguments_: Cons): LispValue;
99
99
  gQuadCurveTo(arguments_: Cons): LispValue;
100
- gSaveJpeg(): LispValue;
101
- gSavePng(): LispValue;
100
+ gSaveJpeg(arguments_: Cons): LispValue;
101
+ gSavePng(arguments_: Cons): LispValue;
102
+ /**
103
+ * Shared implementation of `gsave-jpeg` / `gsave-png`. With no argument it
104
+ * triggers a browser download; with a single string argument it writes the
105
+ * encoded image to that file path on Node.js.
106
+ * @param arguments_ - the evaluated argument list (empty, or one path string)
107
+ * @param mimeType - the image MIME type to encode
108
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
109
+ * @return `t` on success, `Cons.nil` otherwise
110
+ */
111
+ saveCanvas(arguments_: Cons, mimeType: string, label: string): LispValue;
102
112
  gScale(arguments_: Cons): LispValue;
103
113
  gShadowBlur(arguments_: Cons): LispValue;
104
114
  gShadowColor(arguments_: Cons): LispValue;
package/dist/index.js CHANGED
@@ -99,6 +99,67 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
99
99
  process.stderr.write(line + "\n");
100
100
  }
101
101
  /**
102
+ * Encodes the canvas via `toDataURL` and triggers a browser download through
103
+ * a temporary `<a download>` element. Requires a DOM (`document`) and an
104
+ * `HTMLCanvasElement`; `OffscreenCanvas` has no `toDataURL`, and Node.js has
105
+ * no `document` — those callers must pass a file path instead.
106
+ * @param mimeType - the image MIME type to encode
107
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
108
+ * @return `t` on success, `Cons.nil` otherwise
109
+ */
110
+ #downloadCanvas(mimeType, label) {
111
+ if (typeof document === "undefined" || !("toDataURL" in this.canvas)) {
112
+ this.#print(`Can not save ${label}. Browser download needs a DOM and an HTMLCanvasElement; pass a file path to save on Node.js.`);
113
+ return Cons.nil;
114
+ }
115
+ try {
116
+ const link = document.createElement("a");
117
+ link.href = this.canvas.toDataURL(mimeType);
118
+ link.download = "canvas";
119
+ document.body.append(link);
120
+ link.click();
121
+ link.remove();
122
+ return InterpretedSymbol.of("t");
123
+ } catch {
124
+ this.#print(`Can not save ${label}. If you are using an image in the canvas, you can't save ${label}.`);
125
+ return Cons.nil;
126
+ }
127
+ }
128
+ /**
129
+ * Writes the encoded canvas image to a file path on Node.js, using
130
+ * `process.getBuiltinModule('node:fs')` so browser bundles never see a
131
+ * `node:fs` import. `HTMLCanvasElement` (and node-canvas) encode
132
+ * synchronously via `toDataURL`; `OffscreenCanvas` only offers the async
133
+ * `convertToBlob`, so its file is written after this returns — the same
134
+ * fire-and-forget contract as `gImage`.
135
+ * @param path - the destination file path
136
+ * @param mimeType - the image MIME type to encode
137
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
138
+ * @return `t` on success, `Cons.nil` otherwise
139
+ */
140
+ #writeCanvasToFile(path, mimeType, label) {
141
+ const fs = typeof process.getBuiltinModule === "function" ? process.getBuiltinModule("node:fs") : void 0;
142
+ if (fs === void 0) {
143
+ this.#print(`Can not save ${label}. Saving to a file path requires Node.js.`);
144
+ return Cons.nil;
145
+ }
146
+ try {
147
+ if ("toDataURL" in this.canvas) {
148
+ const dataUrl = this.canvas.toDataURL(mimeType);
149
+ const base64 = dataUrl.slice(dataUrl.indexOf(",") + 1);
150
+ fs.writeFileSync(path, Buffer.from(base64, "base64"));
151
+ return InterpretedSymbol.of("t");
152
+ }
153
+ this.canvas.convertToBlob({ type: mimeType }).then(async (blob) => {
154
+ fs.writeFileSync(path, new Uint8Array(await blob.arrayBuffer()));
155
+ });
156
+ return InterpretedSymbol.of("t");
157
+ } catch {
158
+ this.#print(`Can not save ${label}.`);
159
+ return Cons.nil;
160
+ }
161
+ }
162
+ /**
102
163
  * Returns true if this plugin handles the given symbol.
103
164
  * @param aSymbol - the call symbol
104
165
  * @return true if `apply` should be called
@@ -488,9 +549,8 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
488
549
  gLineCap(arguments_) {
489
550
  if (!this.checkSupport()) return Cons.nil;
490
551
  if (this.isOpen) try {
491
- if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {
492
- const aString = arguments_.car === 0 ? "butt" : arguments_.car > 0 ? "round" : "square";
493
- this.ctx.lineCap = aString;
552
+ if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {
553
+ this.ctx.lineCap = arguments_.car;
494
554
  return InterpretedSymbol.of("t");
495
555
  }
496
556
  this.#print("Can not set line cap.");
@@ -505,9 +565,8 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
505
565
  gLineJoin(arguments_) {
506
566
  if (!this.checkSupport()) return Cons.nil;
507
567
  if (this.isOpen) try {
508
- if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {
509
- const aString = arguments_.car === 0 ? "miter" : arguments_.car > 0 ? "round" : "bevel";
510
- this.ctx.lineJoin = aString;
568
+ if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {
569
+ this.ctx.lineJoin = arguments_.car;
511
570
  return InterpretedSymbol.of("t");
512
571
  }
513
572
  this.#print("Can not set line join.");
@@ -622,41 +681,28 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
622
681
  this.#print("The canvas is closed and cannot be executed.");
623
682
  return Cons.nil;
624
683
  }
625
- gSaveJpeg() {
626
- if (!this.checkSupport()) return Cons.nil;
627
- if (this.isOpen) try {
628
- const anImage = new Image();
629
- anImage.crossOrigin = "Anonymous";
630
- anImage.src = this.canvas.toDataURL("image/jpeg");
631
- const link = document.createElement("a");
632
- link.href = anImage.src;
633
- link.download = "canvas";
634
- document.body.append(link);
635
- link.click();
636
- link.remove();
637
- return InterpretedSymbol.of("t");
638
- } catch {
639
- this.#print("Can not save jpeg. If you are using an image in the canvas, you can't save jpeg.");
640
- return Cons.nil;
641
- }
642
- this.#print("The canvas is closed and cannot be executed.");
643
- return Cons.nil;
684
+ gSaveJpeg(arguments_) {
685
+ return this.saveCanvas(arguments_, "image/jpeg", "jpeg");
686
+ }
687
+ gSavePng(arguments_) {
688
+ return this.saveCanvas(arguments_, "image/png", "png");
644
689
  }
645
- gSavePng() {
690
+ /**
691
+ * Shared implementation of `gsave-jpeg` / `gsave-png`. With no argument it
692
+ * triggers a browser download; with a single string argument it writes the
693
+ * encoded image to that file path on Node.js.
694
+ * @param arguments_ - the evaluated argument list (empty, or one path string)
695
+ * @param mimeType - the image MIME type to encode
696
+ * @param label - the format name used in diagnostics ("jpeg" / "png")
697
+ * @return `t` on success, `Cons.nil` otherwise
698
+ */
699
+ saveCanvas(arguments_, mimeType, label) {
646
700
  if (!this.checkSupport()) return Cons.nil;
647
- if (this.isOpen) try {
648
- const anImage = new Image();
649
- anImage.crossOrigin = "Anonymous";
650
- anImage.src = this.canvas.toDataURL("image/png");
651
- const link = document.createElement("a");
652
- link.href = anImage.src;
653
- link.download = "canvas";
654
- document.body.append(link);
655
- link.click();
656
- link.remove();
657
- return InterpretedSymbol.of("t");
658
- } catch {
659
- this.#print("Can not save png. If you are using an image in the canvas, you can't save png.");
701
+ if (this.isOpen) {
702
+ const length_ = arguments_.length();
703
+ if (length_ === 0) return this.#downloadCanvas(mimeType, label);
704
+ if (length_ === 1 && Cons.isString(arguments_.car)) return this.#writeCanvasToFile(arguments_.car, mimeType, label);
705
+ this.#print(`Can not save ${label}.`);
660
706
  return Cons.nil;
661
707
  }
662
708
  this.#print("The canvas is closed and cannot be executed.");
@@ -910,9 +956,8 @@ var GraphicsPlugin = class GraphicsPlugin extends Object {
910
956
  gTextDirection(arguments_) {
911
957
  if (!this.checkSupport()) return Cons.nil;
912
958
  if (this.isOpen) try {
913
- if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {
914
- const aString = arguments_.car === 0 ? "inherit" : arguments_.car > 0 ? "rtl" : "ltr";
915
- this.ctx.direction = aString;
959
+ if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {
960
+ this.ctx.direction = arguments_.car;
916
961
  return InterpretedSymbol.of("t");
917
962
  }
918
963
  this.#print("Can not set text direction.");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#print"],"sources":["../src/GraphicsPlugin/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-add-event-listener,\n 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 (Image#onload, clamp ternaries, mode-flag\n// ternaries, 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/**\n * @class\n * @classdesc Canvas2D drawing plugin for the kei-lisp interpreter. Implements\n * the `KeiLispPlugin` contract (`name` / `has` / `apply`) and\n * exposes 45 `g…` Lisp functions that proxy to a 2D rendering\n * context.\n * @author Keisuke Ikeda\n * @this {GraphicsPlugin}\n */\nexport class GraphicsPlugin extends Object implements KeiLispPlugin {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of\n * the GraphicsPlugin method that implements it.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = GraphicsPlugin.setup();\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-dire'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-font'), 'gTextFont');\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 return aTable;\n }\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 super();\n this.canvas = canvas;\n this.ctx = canvas.getContext('2d');\n this.isOpen = false;\n }\n\n /**\n * Writes a diagnostic line directly to `process.stderr`, matching the\n * convention used by kei-lisp itself (`Applier.format` writes to\n * `process.stdout`). In a Node runtime this hits the real stderr; in a\n * 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 * so the same call reaches the user via the host's normal output channel.\n * @param line - the line to write\n */\n #print(line: string): void {\n process.stderr.write(line + '\\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.buildInFunctions.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 return this.selectProcedure(aSymbol, arguments_);\n }\n\n /**\n * Resolves the procedure name and invokes the matching method.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result, or `Cons.nil` if not registered\n */\n selectProcedure(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n if (GraphicsPlugin.buildInFunctions.has(procedure)) {\n return this.buildInFunction(procedure, arguments_);\n }\n this.#print(`I could find no procedure description for ${String(procedure)}`);\n return Cons.nil;\n }\n\n /**\n * Looks up and invokes the JS method that implements the given Lisp symbol.\n * Throws `TypeError` when the dispatch table points to a method that does\n * not exist on the instance — this matches the legacy behavior, where the\n * Ramda `R.invoker(1, methodName)(args, this)` call would surface the same\n * error by attempting to call `undefined`.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result\n */\n buildInFunction(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n const methodName = GraphicsPlugin.buildInFunctions.get(procedure) as string;\n const target = this as unknown as Record<string, unknown>;\n const method = target[methodName];\n if (typeof method !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n return (method as (arguments__: Cons) => LispValue).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 ctx 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(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\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 return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not clear.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.fillText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw fill text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw fill text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const length_ = arguments_.length();\n if (length_ === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2);\n };\n return InterpretedSymbol.of('t');\n }\n } else if (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.isString(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4)\n ) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2, a3, a4);\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw Image.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw Image.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isNumber(arguments_.car)) {\n const aString = arguments_.car === 0 ? 'butt' : arguments_.car > 0 ? 'round' : 'square';\n this.ctx.lineCap = aString;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line cap.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line cap.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gLineJoin(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 aString = arguments_.car === 0 ? 'miter' : arguments_.car > 0 ? 'round' : 'bevel';\n this.ctx.lineJoin = aString;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line join.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line join.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 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.isString(a0) && Cons.isNumber(a1)) {\n const aString = a1 === 0 ? 'repeat' : a1 > 0 ? 'repeat-x' : 'repeat-y';\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n // Legacy bug: createPattern() may return null; assigning null to fillStyle\n // is a no-op in practice (browsers ignore or coerce it).\n context.fillStyle = context.createPattern(anImage, aString) as CanvasPattern;\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not set pattern.');\n return Cons.nil;\n } catch {\n this.#print('Can not set pattern.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const anImage = new Image();\n anImage.crossOrigin = 'Anonymous';\n // NOTE: toDataURL is not available on OffscreenCanvas; callers must use HTMLCanvasElement.\n anImage.src = (this.canvas as HTMLCanvasElement).toDataURL('image/jpeg');\n const link = document.createElement('a');\n link.href = anImage.src;\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 jpeg. If you are using an image in the canvas, you can't save jpeg.\",\n );\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gSavePng(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const anImage = new Image();\n anImage.crossOrigin = 'Anonymous';\n // NOTE: toDataURL is not available on OffscreenCanvas; callers must use HTMLCanvasElement.\n anImage.src = (this.canvas as HTMLCanvasElement).toDataURL('image/png');\n const link = document.createElement('a');\n link.href = anImage.src;\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 png. If you are using an image in the canvas, you can't save png.\",\n );\n return Cons.nil;\n }\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.strokeText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.textAlign = arguments_.car as CanvasTextAlign;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text align.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text align.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextBaseline(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.textBaseline = arguments_.car as CanvasTextBaseline;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text baseline.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text baseline.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextDirection(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 aString = arguments_.car === 0 ? 'inherit' : arguments_.car > 0 ? 'rtl' : 'ltr';\n this.ctx.direction = aString;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text direction.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text direction.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 `ctx.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 /**\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":["#print","#downloadCanvas","#writeCanvasToFile"],"sources":["../src/GraphicsPlugin/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-add-event-listener,\n 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 (Image#onload, clamp ternaries, mode-flag\n// ternaries, 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/**\n * @class\n * @classdesc Canvas2D drawing plugin for the kei-lisp interpreter. Implements\n * the `KeiLispPlugin` contract (`name` / `has` / `apply`) and\n * exposes 45 `g…` Lisp functions that proxy to a 2D rendering\n * context.\n * @author Keisuke Ikeda\n * @this {GraphicsPlugin}\n */\nexport class GraphicsPlugin extends Object implements KeiLispPlugin {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of\n * the GraphicsPlugin method that implements it.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = GraphicsPlugin.setup();\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-dire'), 'gTextDirection');\n aTable.set(InterpretedSymbol.of('gtext-font'), 'gTextFont');\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 return aTable;\n }\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 super();\n this.canvas = canvas;\n this.ctx = canvas.getContext('2d');\n this.isOpen = false;\n }\n\n /**\n * Writes a diagnostic line directly to `process.stderr`, matching the\n * convention used by kei-lisp itself (`Applier.format` writes to\n * `process.stdout`). In a Node runtime this hits the real stderr; in a\n * 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 * so the same call reaches the user via the host's normal output channel.\n * @param line - the line to write\n */\n #print(line: string): void {\n process.stderr.write(line + '\\n');\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.buildInFunctions.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 return this.selectProcedure(aSymbol, arguments_);\n }\n\n /**\n * Resolves the procedure name and invokes the matching method.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result, or `Cons.nil` if not registered\n */\n selectProcedure(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n if (GraphicsPlugin.buildInFunctions.has(procedure)) {\n return this.buildInFunction(procedure, arguments_);\n }\n this.#print(`I could find no procedure description for ${String(procedure)}`);\n return Cons.nil;\n }\n\n /**\n * Looks up and invokes the JS method that implements the given Lisp symbol.\n * Throws `TypeError` when the dispatch table points to a method that does\n * not exist on the instance — this matches the legacy behavior, where the\n * Ramda `R.invoker(1, methodName)(args, this)` call would surface the same\n * error by attempting to call `undefined`.\n * @param procedure - the Lisp symbol\n * @param arguments_ - the evaluated argument list\n * @return the method's result\n */\n buildInFunction(procedure: InterpretedSymbol, arguments_: Cons): LispValue {\n const methodName = GraphicsPlugin.buildInFunctions.get(procedure) as string;\n const target = this as unknown as Record<string, unknown>;\n const method = target[methodName];\n if (typeof method !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n return (method as (arguments__: Cons) => LispValue).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 ctx 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(): LispValue {\n if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\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 return InterpretedSymbol.of('t');\n } catch {\n this.#print('Can not clear.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.fillText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw fill text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw fill text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n const length_ = arguments_.length();\n if (length_ === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2);\n };\n return InterpretedSymbol.of('t');\n }\n } else if (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.isString(a0) &&\n Cons.isNumber(a1) &&\n Cons.isNumber(a2) &&\n Cons.isNumber(a3) &&\n Cons.isNumber(a4)\n ) {\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n context.drawImage(anImage, a1, a2, a3, a4);\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw Image.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw Image.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.lineCap = arguments_.car as CanvasLineCap;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line cap.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line cap.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gLineJoin(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.lineJoin = arguments_.car as CanvasLineJoin;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set line join.');\n return Cons.nil;\n } catch {\n this.#print('Can not set line join.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 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.isString(a0) && Cons.isNumber(a1)) {\n const aString = a1 === 0 ? 'repeat' : a1 > 0 ? 'repeat-x' : 'repeat-y';\n const context = this.ctx;\n const anImage = new Image();\n anImage.src = a0;\n anImage.onload = () => {\n // Legacy bug: createPattern() may return null; assigning null to fillStyle\n // is a no-op in practice (browsers ignore or coerce it).\n context.fillStyle = context.createPattern(anImage, aString) as CanvasPattern;\n };\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not set pattern.');\n return Cons.nil;\n } catch {\n this.#print('Can not set pattern.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 3) {\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 if (Cons.isString(a0) && Cons.isNumber(a1) && Cons.isNumber(a2)) {\n this.ctx.strokeText(a0, a1, a2);\n return InterpretedSymbol.of('t');\n }\n }\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n } catch {\n this.#print('Can not draw stroke text.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 if (!this.checkSupport()) return Cons.nil;\n if (this.isOpen) {\n try {\n if (arguments_.length() === 1 && Cons.isString(arguments_.car)) {\n this.ctx.textAlign = arguments_.car as CanvasTextAlign;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text align.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text align.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextBaseline(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.textBaseline = arguments_.car as CanvasTextBaseline;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text baseline.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text baseline.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\n }\n\n gTextDirection(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.direction = arguments_.car as CanvasDirection;\n return InterpretedSymbol.of('t');\n }\n this.#print('Can not set text direction.');\n return Cons.nil;\n } catch {\n this.#print('Can not set text direction.');\n return Cons.nil;\n }\n }\n this.#print('The canvas is closed and cannot be executed.');\n return Cons.nil;\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 `ctx.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 /**\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kei-lisp-plugin-graphics",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "Canvas2D graphics plugin for the kei-lisp interpreter",
5
5
  "author": "Keisuke Ikeda",
6
6
  "license": "MIT",
@@ -44,6 +44,7 @@
44
44
  "devDependencies": {
45
45
  "@eslint/js": "^10.0.1",
46
46
  "@types/node": "^26.0.1",
47
+ "@vitest/coverage-v8": "^4.1.9",
47
48
  "@vitest/eslint-plugin": "^1.6.20",
48
49
  "cspell": "^10.0.0",
49
50
  "eslint": "^10.3.0",
@@ -72,20 +73,21 @@
72
73
  "scripts": {
73
74
  "build": "tsdown",
74
75
  "test": "vitest run",
76
+ "test:coverage": "vitest run --coverage",
75
77
  "test:watch": "vitest",
76
78
  "doc": "typedoc",
77
79
  "typecheck": "tsc --noEmit",
78
80
  "check": "run-s check:*",
79
- "check:format": "prettier \"./src/**/*.ts\" --check",
81
+ "check:format": "prettier \"./src/**/*.ts\" \"./examples/**/*.ts\" --check",
80
82
  "check:format-config": "prettier \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" --check",
81
- "check:lint": "eslint \"./src/**/*.ts\"",
83
+ "check:lint": "eslint \"./src/**/*.ts\" \"./examples/**/*.ts\"",
82
84
  "check:lint-config": "eslint ./*.{js,mjs} \"./configs/**/*.mjs\"",
83
- "check:spell": "cspell \"./src/**/*.ts\"",
85
+ "check:spell": "cspell \"./src/**/*.ts\" \"./examples/**/*.ts\"",
84
86
  "check:spell-config": "cspell \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\"",
85
87
  "fix": "run-s fix:*",
86
- "fix:format": "prettier \"./src/**/*.ts\" --write",
88
+ "fix:format": "prettier \"./src/**/*.ts\" \"./examples/**/*.ts\" --write",
87
89
  "fix:format-config": "prettier \"./*.{js,mjs,json,md}\" \"./docs/**/*.md\" \"./.github/**/*.yml\" \"./configs/**/*.mjs\" --write",
88
- "fix:lint": "eslint \"./src/**/*.ts\" --fix",
90
+ "fix:lint": "eslint \"./src/**/*.ts\" \"./examples/**/*.ts\" --fix",
89
91
  "fix:lint-config": "eslint ./*.{js,mjs} \"./configs/**/*.mjs\" --fix"
90
92
  }
91
93
  }