@4bitlabs/sci0-renderer 0.1.0 → 1.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.
Files changed (85) hide show
  1. package/dist/filters/loop-padding-filter.d.ts +6 -3
  2. package/dist/filters/loop-padding-filter.d.ts.map +1 -1
  3. package/dist/filters/loop-padding-filter.js +25 -30
  4. package/dist/filters/loop-padding-filter.js.map +1 -1
  5. package/dist/filters/menu-text-filter.d.ts +10 -7
  6. package/dist/filters/menu-text-filter.d.ts.map +1 -1
  7. package/dist/filters/menu-text-filter.js +22 -35
  8. package/dist/filters/menu-text-filter.js.map +1 -1
  9. package/dist/index.d.ts +7 -8
  10. package/dist/index.js +5 -12
  11. package/dist/pic/default-palette.js +45 -9
  12. package/dist/pic/default-palette.js.map +1 -1
  13. package/dist/pic/default-palettes.js +9 -9
  14. package/dist/pic/default-palettes.js.map +1 -1
  15. package/dist/pic/generate-pic.d.ts +7 -4
  16. package/dist/pic/generate-pic.d.ts.map +1 -1
  17. package/dist/pic/generate-pic.js +22 -40
  18. package/dist/pic/generate-pic.js.map +1 -1
  19. package/dist/pic/pic-step.js +42 -43
  20. package/dist/pic/pic-step.js.map +1 -1
  21. package/dist/pic/render-pic-options.d.ts +18 -15
  22. package/dist/pic/render-pic-options.d.ts.map +1 -1
  23. package/dist/pic/render-pic.d.ts +7 -4
  24. package/dist/pic/render-pic.d.ts.map +1 -1
  25. package/dist/pic/render-pic.js +18 -40
  26. package/dist/pic/render-pic.js.map +1 -1
  27. package/dist/pic/render-result.d.ts +9 -6
  28. package/dist/pic/render-result.d.ts.map +1 -1
  29. package/dist/pic/screen-buffer.js +64 -67
  30. package/dist/pic/screen-buffer.js.map +1 -1
  31. package/dist/pic/tools/circles.js +82 -84
  32. package/dist/pic/tools/circles.js.map +1 -1
  33. package/dist/pic/tools/create-blitter.js +14 -19
  34. package/dist/pic/tools/create-blitter.js.map +1 -1
  35. package/dist/pic/tools/create-brush.js +22 -34
  36. package/dist/pic/tools/create-brush.js.map +1 -1
  37. package/dist/pic/tools/create-flood-fill.js +43 -60
  38. package/dist/pic/tools/create-flood-fill.js.map +1 -1
  39. package/dist/pic/tools/create-line.js +37 -43
  40. package/dist/pic/tools/create-line.js.map +1 -1
  41. package/dist/pic/tools/index.js +5 -14
  42. package/dist/pic/tools/noise.js +160 -22
  43. package/dist/pic/tools/noise.js.map +1 -1
  44. package/dist/utils/exhaustive.js +5 -4
  45. package/dist/utils/exhaustive.js.map +1 -1
  46. package/package.json +16 -15
  47. package/dist/index.d.ts.map +0 -1
  48. package/dist/index.js.map +0 -1
  49. package/dist/pic/default-palette.d.ts +0 -2
  50. package/dist/pic/default-palette.d.ts.map +0 -1
  51. package/dist/pic/default-palettes.d.ts +0 -3
  52. package/dist/pic/default-palettes.d.ts.map +0 -1
  53. package/dist/pic/pic-step.d.ts +0 -4
  54. package/dist/pic/pic-step.d.ts.map +0 -1
  55. package/dist/pic/render-pic-options.js +0 -3
  56. package/dist/pic/render-pic-options.js.map +0 -1
  57. package/dist/pic/render-result.js +0 -3
  58. package/dist/pic/render-result.js.map +0 -1
  59. package/dist/pic/screen-buffer.d.ts +0 -7
  60. package/dist/pic/screen-buffer.d.ts.map +0 -1
  61. package/dist/pic/tools/circles.d.ts +0 -3
  62. package/dist/pic/tools/circles.d.ts.map +0 -1
  63. package/dist/pic/tools/create-blitter.d.ts +0 -5
  64. package/dist/pic/tools/create-blitter.d.ts.map +0 -1
  65. package/dist/pic/tools/create-brush.d.ts +0 -4
  66. package/dist/pic/tools/create-brush.d.ts.map +0 -1
  67. package/dist/pic/tools/create-flood-fill.d.ts +0 -4
  68. package/dist/pic/tools/create-flood-fill.d.ts.map +0 -1
  69. package/dist/pic/tools/create-line.d.ts +0 -3
  70. package/dist/pic/tools/create-line.d.ts.map +0 -1
  71. package/dist/pic/tools/create-marker.d.ts +0 -3
  72. package/dist/pic/tools/create-marker.d.ts.map +0 -1
  73. package/dist/pic/tools/create-marker.js +0 -11
  74. package/dist/pic/tools/create-marker.js.map +0 -1
  75. package/dist/pic/tools/index.d.ts +0 -6
  76. package/dist/pic/tools/index.d.ts.map +0 -1
  77. package/dist/pic/tools/index.js.map +0 -1
  78. package/dist/pic/tools/noise.d.ts +0 -3
  79. package/dist/pic/tools/noise.d.ts.map +0 -1
  80. package/dist/pic/tools/screen.d.ts +0 -16
  81. package/dist/pic/tools/screen.d.ts.map +0 -1
  82. package/dist/pic/tools/screen.js +0 -3
  83. package/dist/pic/tools/screen.js.map +0 -1
  84. package/dist/utils/exhaustive.d.ts +0 -2
  85. package/dist/utils/exhaustive.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"render-pic.d.ts","sourceRoot":"","sources":["../../src/pic/render-pic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,SAAS,QACf,GAAG,YACC,gBAAgB,KACxB,YAeF,CAAC"}
1
+ {"version":3,"file":"render-pic.d.ts","names":[],"sources":["../../src/pic/render-pic.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;cA8Ba,YACX,KAAK,KACL,UAAS,qBACR"}
@@ -1,43 +1,21 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderPic = void 0;
4
- const screen_buffer_1 = require("./screen-buffer");
5
- const pic_step_1 = require("./pic-step");
6
- const default_palettes_1 = require("./default-palettes");
7
- /**
8
- * Render a {@link Pic} resource into its composite layers.
9
- *
10
- * @param pic The picture data to render.
11
- * @param options
12
- *
13
- * @see {@link RenderResult}
14
- *
15
- * @example
16
- * ```ts
17
- * import { parsePic } from '@4bitlabs/sci0';
18
- * import { renderPic } from '@4bitlabs/sci0-renderer';
19
- * import { CGA } from '@4bitlabs/color/dithers';
20
- * import { createDitherFilter, renderPixelData } from '@4bitlabs/image';
21
- *
22
- * const picData = parsePic(data);
23
- * const { visible, priority, control } = renderPic(picData);
24
- * const image = renderPixelData(visible, {
25
- * render: createDitherFilter(CGA),
26
- * });
27
- * ```
28
- */
1
+ import { createScreenBuffer } from "./screen-buffer.js";
2
+ import { picStep } from "./pic-step.js";
3
+ import { defaultPalettes } from "./default-palettes.js";
4
+ //#region src/pic/render-pic.ts
29
5
  const renderPic = (pic, options = {}) => {
30
- const { forcePal, width = 320, height = 190 } = options;
31
- const size = [width, height];
32
- const palettes = (0, default_palettes_1.defaultPalettes)();
33
- const [result, screen, tick] = (0, screen_buffer_1.createScreenBuffer)(forcePal, palettes, size);
34
- let step = 0;
35
- for (const cmd of pic) {
36
- tick(step);
37
- (0, pic_step_1.picStep)(cmd, screen, palettes);
38
- step += 1;
39
- }
40
- return result;
6
+ const { forcePal, width = 320, height = 190 } = options;
7
+ const size = [width, height];
8
+ const palettes = defaultPalettes();
9
+ const [result, screen, tick] = createScreenBuffer(forcePal, palettes, size);
10
+ let step = 0;
11
+ for (const cmd of pic) {
12
+ tick(step);
13
+ picStep(cmd, screen, palettes);
14
+ step += 1;
15
+ }
16
+ return result;
41
17
  };
42
- exports.renderPic = renderPic;
18
+ //#endregion
19
+ export { renderPic };
20
+
43
21
  //# sourceMappingURL=render-pic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-pic.js","sourceRoot":"","sources":["../../src/pic/render-pic.ts"],"names":[],"mappings":";;;AAEA,mDAAqD;AAGrD,yCAAqC;AACrC,yDAAqD;AAErD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACI,MAAM,SAAS,GAAG,CACvB,GAAQ,EACR,UAA4B,EAAE,EAChB,EAAE;IAChB,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,IAAI,GAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,IAAA,kCAAe,GAAE,CAAC;IACnC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,IAAA,kCAAkB,EAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE5E,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,CAAC;QACX,IAAA,kBAAO,EAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAlBW,QAAA,SAAS,aAkBpB"}
1
+ {"version":3,"file":"render-pic.js","names":[],"sources":["../../src/pic/render-pic.ts"],"sourcesContent":["import type { Vec2 } from '@4bitlabs/vec2';\nimport type { Pic } from '@4bitlabs/sci0';\nimport { createScreenBuffer } from './screen-buffer.js';\nimport type { RenderResult } from './render-result.js';\nimport type { RenderPicOptions } from './render-pic-options.js';\nimport { picStep } from './pic-step.js';\nimport { defaultPalettes } from './default-palettes.js';\n\n/**\n * Render a {@link Pic} resource into its composite layers.\n *\n * @param pic The picture data to render.\n * @param options\n *\n * @see {@link RenderResult}\n *\n * @example\n * ```ts\n * import { parsePic } from '@4bitlabs/sci0';\n * import { renderPic } from '@4bitlabs/sci0-renderer';\n * import { CGA } from '@4bitlabs/color/dithers';\n * import { createDitherFilter, renderPixelData } from '@4bitlabs/image';\n *\n * const picData = parsePic(data);\n * const { visible, priority, control } = renderPic(picData);\n * const image = renderPixelData(visible, {\n * render: createDitherFilter(CGA),\n * });\n * ```\n */\nexport const renderPic = (\n pic: Pic,\n options: RenderPicOptions = {},\n): RenderResult => {\n const { forcePal, width = 320, height = 190 } = options;\n const size: Vec2 = [width, height];\n\n const palettes = defaultPalettes();\n const [result, screen, tick] = createScreenBuffer(forcePal, palettes, size);\n\n let step = 0;\n for (const cmd of pic) {\n tick(step);\n picStep(cmd, screen, palettes);\n step += 1;\n }\n\n return result;\n};\n"],"mappings":";;;;AA8BA,MAAa,aACX,KACA,UAA4B,CAAC,MACZ;CACjB,MAAM,EAAE,UAAU,QAAQ,KAAK,SAAS,QAAQ;CAChD,MAAM,OAAa,CAAC,OAAO,MAAM;CAEjC,MAAM,WAAW,gBAAgB;CACjC,MAAM,CAAC,QAAQ,QAAQ,QAAQ,mBAAmB,UAAU,UAAU,IAAI;CAE1E,IAAI,OAAO;CACX,KAAK,MAAM,OAAO,KAAK;EACrB,KAAK,IAAI;EACT,QAAQ,KAAK,QAAQ,QAAQ;EAC7B,QAAQ;CACV;CAEA,OAAO;AACT"}
@@ -1,8 +1,11 @@
1
- import type { IndexedPixelData } from '@4bitlabs/image';
2
- export interface RenderResult {
3
- visible: IndexedPixelData;
4
- priority: IndexedPixelData;
5
- control: IndexedPixelData;
6
- tBuffer: Uint32Array;
1
+ import { IndexedPixelData } from "@4bitlabs/image";
2
+ //#region src/pic/render-result.d.ts
3
+ interface RenderResult {
4
+ visible: IndexedPixelData;
5
+ priority: IndexedPixelData;
6
+ control: IndexedPixelData;
7
+ tBuffer: Uint32Array;
7
8
  }
9
+ //#endregion
10
+ export { RenderResult };
8
11
  //# sourceMappingURL=render-result.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-result.d.ts","sourceRoot":"","sources":["../../src/pic/render-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,WAAW,CAAC;CACtB"}
1
+ {"version":3,"file":"render-result.d.ts","names":[],"sources":["../../src/pic/render-result.ts"],"mappings":";;UAEiB;EACf,SAAS;EACT,UAAU;EACV,SAAS;EACT,SAAS"}
@@ -1,70 +1,67 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createScreenBuffer = void 0;
4
- const image_1 = require("@4bitlabs/image");
5
- const sci0_1 = require("@4bitlabs/sci0");
6
- const tools_1 = require("./tools");
1
+ import { createBrush } from "./tools/create-brush.js";
2
+ import { createFloodFill } from "./tools/create-flood-fill.js";
3
+ import { createLine } from "./tools/create-line.js";
4
+ import { createBlitter } from "./tools/create-blitter.js";
5
+ import "./tools/index.js";
6
+ import { createIndexedPixelData } from "@4bitlabs/image";
7
+ import { DrawMode } from "@4bitlabs/sci0";
8
+ //#region src/pic/screen-buffer.ts
7
9
  const createScreenBuffer = (forcePal, palettes, [width, height]) => {
8
- const visible = (0, image_1.createIndexedPixelData)(width, height);
9
- const priority = (0, image_1.createIndexedPixelData)(width, height);
10
- const control = (0, image_1.createIndexedPixelData)(width, height);
11
- const tBuffer = new Uint32Array(width * height).fill(-1);
12
- let t = 0;
13
- const setTValue = (next) => {
14
- t = next;
15
- };
16
- visible.pixels.fill(0xff);
17
- priority.pixels.fill(0x00);
18
- control.pixels.fill(0x00);
19
- const setPixel = (x, y, color) => {
20
- const idx = width * y + x;
21
- visible.pixels[idx] = (color & 0b1111) | (color << 4);
22
- };
23
- const plot = (x, y, drawMode, drawCodes) => {
24
- if (x < 0 || x >= width || y < 0 || y >= height)
25
- return;
26
- const idx = width * y + x;
27
- if (sci0_1.DrawMode.isVisualMode(drawMode)) {
28
- const pal = forcePal !== null && forcePal !== void 0 ? forcePal : (drawCodes[0] / 40) >>> 0;
29
- const palette = palettes[pal];
30
- const palIndex = drawCodes[0] % 40 >>> 0;
31
- visible.pixels[idx] = palette[palIndex];
32
- tBuffer[idx] = t;
33
- }
34
- if (sci0_1.DrawMode.isPriorityMode(drawMode)) {
35
- priority.pixels[idx] = drawCodes[1];
36
- }
37
- if (sci0_1.DrawMode.isControlMode(drawMode)) {
38
- control.pixels[idx] = drawCodes[2];
39
- }
40
- };
41
- const isFillable = (x, y, drawMode) => {
42
- const idx = x + y * width;
43
- if (sci0_1.DrawMode.isVisualMode(drawMode)) {
44
- const dither = (x & 1) ^ (y & 1);
45
- const val = visible.pixels[idx];
46
- const [high, low] = [val >>> 4, val & 0b1111];
47
- return 0xf === (dither ? high : low);
48
- }
49
- /* TODO not sure if this is correct… but it looks *okay*-ish.
50
- * SCI Companion seems to be able to recognize the difference between "never-touched" pixels and
51
- * replaced 0x00 pixels in control and priority layers. Not sure if its intentional or not. But
52
- * may require a different way of modeling indexed "alpha" channel.
53
- */
54
- return ((sci0_1.DrawMode.isPriorityMode(drawMode) && priority.pixels[idx] === 0x00) ||
55
- (sci0_1.DrawMode.isControlMode(drawMode) && control.pixels[idx] === 0x00));
56
- };
57
- return [
58
- { visible, priority, control, tBuffer },
59
- {
60
- setPixel,
61
- brush: (0, tools_1.createBrush)(plot, [width, height]),
62
- fill: (0, tools_1.createFloodFill)(plot, isFillable, [width, height]),
63
- line: (0, tools_1.createLine)(plot),
64
- blit: (0, tools_1.createBlitter)(setPixel, [width, height]),
65
- },
66
- setTValue,
67
- ];
10
+ const visible = createIndexedPixelData(width, height);
11
+ const priority = createIndexedPixelData(width, height);
12
+ const control = createIndexedPixelData(width, height);
13
+ const tBuffer = new Uint32Array(width * height).fill(-1);
14
+ let t = 0;
15
+ const setTValue = (next) => {
16
+ t = next;
17
+ };
18
+ visible.pixels.fill(255);
19
+ priority.pixels.fill(0);
20
+ control.pixels.fill(0);
21
+ const setPixel = (x, y, color) => {
22
+ const idx = width * y + x;
23
+ visible.pixels[idx] = color & 15 | color << 4;
24
+ };
25
+ const plot = (x, y, drawMode, drawCodes) => {
26
+ if (x < 0 || x >= width || y < 0 || y >= height) return;
27
+ const idx = width * y + x;
28
+ if (DrawMode.isVisualMode(drawMode)) {
29
+ const palette = palettes[forcePal ?? drawCodes[0] / 40 >>> 0];
30
+ const palIndex = drawCodes[0] % 40 >>> 0;
31
+ visible.pixels[idx] = palette[palIndex];
32
+ tBuffer[idx] = t;
33
+ }
34
+ if (DrawMode.isPriorityMode(drawMode)) priority.pixels[idx] = drawCodes[1];
35
+ if (DrawMode.isControlMode(drawMode)) control.pixels[idx] = drawCodes[2];
36
+ };
37
+ const isFillable = (x, y, drawMode) => {
38
+ const idx = x + y * width;
39
+ if (DrawMode.isVisualMode(drawMode)) {
40
+ const dither = x & 1 ^ y & 1;
41
+ const val = visible.pixels[idx];
42
+ const [high, low] = [val >>> 4, val & 15];
43
+ return 15 === (dither ? high : low);
44
+ }
45
+ return DrawMode.isPriorityMode(drawMode) && priority.pixels[idx] === 0 || DrawMode.isControlMode(drawMode) && control.pixels[idx] === 0;
46
+ };
47
+ return [
48
+ {
49
+ visible,
50
+ priority,
51
+ control,
52
+ tBuffer
53
+ },
54
+ {
55
+ setPixel,
56
+ brush: createBrush(plot, [width, height]),
57
+ fill: createFloodFill(plot, isFillable, [width, height]),
58
+ line: createLine(plot),
59
+ blit: createBlitter(setPixel, [width, height])
60
+ },
61
+ setTValue
62
+ ];
68
63
  };
69
- exports.createScreenBuffer = createScreenBuffer;
64
+ //#endregion
65
+ export { createScreenBuffer };
66
+
70
67
  //# sourceMappingURL=screen-buffer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"screen-buffer.js","sourceRoot":"","sources":["../../src/pic/screen-buffer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screen-buffer.js","names":[],"sources":["../../src/pic/screen-buffer.ts"],"sourcesContent":["import type { Vec2 } from '@4bitlabs/vec2';\nimport { createIndexedPixelData } from '@4bitlabs/image';\nimport { DrawMode } from '@4bitlabs/sci0';\nimport type {\n IsFillable,\n Plotter,\n RawPlotter,\n Screen,\n} from './tools/screen.js';\nimport type { RenderResult } from './render-result.js';\nimport {\n createBrush,\n createFloodFill,\n createLine,\n createBlitter,\n} from './tools/index.js';\n\ntype SetTValueFn = (n: number) => void;\n\nexport const createScreenBuffer = (\n forcePal: 0 | 1 | 2 | 3 | undefined,\n palettes: [Uint8Array, Uint8Array, Uint8Array, Uint8Array],\n [width, height]: Vec2,\n): [RenderResult, Screen, SetTValueFn] => {\n const visible = createIndexedPixelData(width, height);\n const priority = createIndexedPixelData(width, height);\n const control = createIndexedPixelData(width, height);\n const tBuffer = new Uint32Array(width * height).fill(-1);\n\n let t = 0;\n const setTValue = (next: number) => {\n t = next;\n };\n\n visible.pixels.fill(0xff);\n priority.pixels.fill(0x00);\n control.pixels.fill(0x00);\n\n const setPixel: RawPlotter = (x: number, y: number, color: number) => {\n const idx = width * y + x;\n visible.pixels[idx] = (color & 0b1111) | (color << 4);\n };\n\n const plot: Plotter = (x: number, y: number, drawMode, drawCodes) => {\n if (x < 0 || x >= width || y < 0 || y >= height) return;\n\n const idx = width * y + x;\n\n if (DrawMode.isVisualMode(drawMode)) {\n const pal = forcePal ?? (drawCodes[0] / 40) >>> 0;\n const palette = palettes[pal];\n const palIndex = (drawCodes[0] % 40) >>> 0;\n visible.pixels[idx] = palette[palIndex];\n tBuffer[idx] = t;\n }\n\n if (DrawMode.isPriorityMode(drawMode)) {\n priority.pixels[idx] = drawCodes[1];\n }\n\n if (DrawMode.isControlMode(drawMode)) {\n control.pixels[idx] = drawCodes[2];\n }\n };\n\n const isFillable: IsFillable = (x, y, drawMode) => {\n const idx = x + y * width;\n\n if (DrawMode.isVisualMode(drawMode)) {\n const dither = (x & 1) ^ (y & 1);\n const val = visible.pixels[idx];\n const [high, low] = [val >>> 4, val & 0b1111];\n return 0xf === (dither ? high : low);\n }\n\n /* TODO not sure if this is correct… but it looks *okay*-ish.\n * SCI Companion seems to be able to recognize the difference between \"never-touched\" pixels and\n * replaced 0x00 pixels in control and priority layers. Not sure if its intentional or not. But\n * may require a different way of modeling indexed \"alpha\" channel.\n */\n return (\n (DrawMode.isPriorityMode(drawMode) && priority.pixels[idx] === 0x00) ||\n (DrawMode.isControlMode(drawMode) && control.pixels[idx] === 0x00)\n );\n };\n\n return [\n { visible, priority, control, tBuffer },\n {\n setPixel,\n brush: createBrush(plot, [width, height]),\n fill: createFloodFill(plot, isFillable, [width, height]),\n line: createLine(plot),\n blit: createBlitter(setPixel, [width, height]),\n },\n setTValue,\n ];\n};\n"],"mappings":";;;;;;;;AAmBA,MAAa,sBACX,UACA,UACA,CAAC,OAAO,YACgC;CACxC,MAAM,UAAU,uBAAuB,OAAO,MAAM;CACpD,MAAM,WAAW,uBAAuB,OAAO,MAAM;CACrD,MAAM,UAAU,uBAAuB,OAAO,MAAM;CACpD,MAAM,UAAU,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC,KAAK,EAAE;CAEvD,IAAI,IAAI;CACR,MAAM,aAAa,SAAiB;EAClC,IAAI;CACN;CAEA,QAAQ,OAAO,KAAK,GAAI;CACxB,SAAS,OAAO,KAAK,CAAI;CACzB,QAAQ,OAAO,KAAK,CAAI;CAExB,MAAM,YAAwB,GAAW,GAAW,UAAkB;EACpE,MAAM,MAAM,QAAQ,IAAI;EACxB,QAAQ,OAAO,OAAQ,QAAQ,KAAW,SAAS;CACrD;CAEA,MAAM,QAAiB,GAAW,GAAW,UAAU,cAAc;EACnE,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ;EAEjD,MAAM,MAAM,QAAQ,IAAI;EAExB,IAAI,SAAS,aAAa,QAAQ,GAAG;GAEnC,MAAM,UAAU,SADJ,YAAa,UAAU,KAAK,OAAQ;GAEhD,MAAM,WAAY,UAAU,KAAK,OAAQ;GACzC,QAAQ,OAAO,OAAO,QAAQ;GAC9B,QAAQ,OAAO;EACjB;EAEA,IAAI,SAAS,eAAe,QAAQ,GAClC,SAAS,OAAO,OAAO,UAAU;EAGnC,IAAI,SAAS,cAAc,QAAQ,GACjC,QAAQ,OAAO,OAAO,UAAU;CAEpC;CAEA,MAAM,cAA0B,GAAG,GAAG,aAAa;EACjD,MAAM,MAAM,IAAI,IAAI;EAEpB,IAAI,SAAS,aAAa,QAAQ,GAAG;GACnC,MAAM,SAAU,IAAI,IAAM,IAAI;GAC9B,MAAM,MAAM,QAAQ,OAAO;GAC3B,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,GAAG,MAAM,EAAM;GAC5C,OAAO,QAAS,SAAS,OAAO;EAClC;EAOA,OACG,SAAS,eAAe,QAAQ,KAAK,SAAS,OAAO,SAAS,KAC9D,SAAS,cAAc,QAAQ,KAAK,QAAQ,OAAO,SAAS;CAEjE;CAEA,OAAO;EACL;GAAE;GAAS;GAAU;GAAS;EAAQ;EACtC;GACE;GACA,OAAO,YAAY,MAAM,CAAC,OAAO,MAAM,CAAC;GACxC,MAAM,gBAAgB,MAAM,YAAY,CAAC,OAAO,MAAM,CAAC;GACvD,MAAM,WAAW,IAAI;GACrB,MAAM,cAAc,UAAU,CAAC,OAAO,MAAM,CAAC;EAC/C;EACA;CACF;AACF"}
@@ -1,87 +1,85 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // prettier-ignore
1
+ //#region src/pic/tools/circles.ts
4
2
  const circleBitmaps = [
5
- [
6
- 0b1
7
- ],
8
- [
9
- 0b010,
10
- 0b111,
11
- 0b010,
12
- ],
13
- [
14
- 0b01110,
15
- 0b11111,
16
- 0b11111,
17
- 0b11111,
18
- 0b01110,
19
- ],
20
- [
21
- 0b0011100,
22
- 0b0111110,
23
- 0b1111111,
24
- 0b1111111,
25
- 0b1111111,
26
- 0b0111110,
27
- 0b0011100,
28
- ],
29
- [
30
- 0b000111000,
31
- 0b011111110,
32
- 0b111111111,
33
- 0b111111111,
34
- 0b111111111,
35
- 0b111111111,
36
- 0b111111111,
37
- 0b011111110,
38
- 0b000111000,
39
- ],
40
- [
41
- 0b00001110000,
42
- 0b00111111100,
43
- 0b01111111110,
44
- 0b01111111110,
45
- 0b11111111111,
46
- 0b11111111111,
47
- 0b11111111111,
48
- 0b01111111110,
49
- 0b01111111110,
50
- 0b00111111100,
51
- 0b00011111000,
52
- ],
53
- [
54
- 0b0000111110000,
55
- 0b0011111111100,
56
- 0b0111111111110,
57
- 0b0111111111110,
58
- 0b1111111111111,
59
- 0b1111111111111,
60
- 0b1111111111111,
61
- 0b1111111111111,
62
- 0b1111111111111,
63
- 0b0111111111110,
64
- 0b0111111111110,
65
- 0b0011111111100,
66
- 0b0000111110000,
67
- ],
68
- [
69
- 0b000001111100000,
70
- 0b000111111111000,
71
- 0b001111111111100,
72
- 0b011111111111110,
73
- 0b011111111111110,
74
- 0b111111111111111,
75
- 0b111111111111111,
76
- 0b111111111111111,
77
- 0b111111111111111,
78
- 0b111111111111111,
79
- 0b011111111111110,
80
- 0b011111111111110,
81
- 0b001111111111100,
82
- 0b000111111111000,
83
- 0b000001111100000,
84
- ],
3
+ [1],
4
+ [
5
+ 2,
6
+ 7,
7
+ 2
8
+ ],
9
+ [
10
+ 14,
11
+ 31,
12
+ 31,
13
+ 31,
14
+ 14
15
+ ],
16
+ [
17
+ 28,
18
+ 62,
19
+ 127,
20
+ 127,
21
+ 127,
22
+ 62,
23
+ 28
24
+ ],
25
+ [
26
+ 56,
27
+ 254,
28
+ 511,
29
+ 511,
30
+ 511,
31
+ 511,
32
+ 511,
33
+ 254,
34
+ 56
35
+ ],
36
+ [
37
+ 112,
38
+ 508,
39
+ 1022,
40
+ 1022,
41
+ 2047,
42
+ 2047,
43
+ 2047,
44
+ 1022,
45
+ 1022,
46
+ 508,
47
+ 248
48
+ ],
49
+ [
50
+ 496,
51
+ 2044,
52
+ 4094,
53
+ 4094,
54
+ 8191,
55
+ 8191,
56
+ 8191,
57
+ 8191,
58
+ 8191,
59
+ 4094,
60
+ 4094,
61
+ 2044,
62
+ 496
63
+ ],
64
+ [
65
+ 992,
66
+ 4088,
67
+ 8188,
68
+ 16382,
69
+ 16382,
70
+ 32767,
71
+ 32767,
72
+ 32767,
73
+ 32767,
74
+ 32767,
75
+ 16382,
76
+ 16382,
77
+ 8188,
78
+ 4088,
79
+ 992
80
+ ]
85
81
  ];
86
- exports.default = circleBitmaps;
82
+ //#endregion
83
+ export { circleBitmaps as default };
84
+
87
85
  //# sourceMappingURL=circles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"circles.js","sourceRoot":"","sources":["../../../src/pic/tools/circles.ts"],"names":[],"mappings":";;AAAA,kBAAkB;AAClB,MAAM,aAAa,GAAe;IAChC;QACE,GAAG;KACJ;IACD;QACE,KAAK;QACL,KAAK;QACL,KAAK;KACN;IAED;QACE,OAAO;QACP,OAAO;QACP,OAAO;QACP,OAAO;QACP,OAAO;KACR;IAED;QACE,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;KACV;IAED;QACE,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;KACZ;IACD;QACE,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;QACb,aAAa;KACd;IACD;QACE,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;QACf,eAAe;KAChB;IACD;QACE,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;KAClB;CACF,CAAC;AAEF,kBAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"circles.js","names":[],"sources":["../../../src/pic/tools/circles.ts"],"sourcesContent":["// biome-ignore format: bitmaps\nconst circleBitmaps: number[][] = [\n [\n 0b1\n ],\n [\n 0b010,\n 0b111,\n 0b010,\n ],\n\n [\n 0b01110,\n 0b11111,\n 0b11111,\n 0b11111,\n 0b01110,\n ],\n\n [\n 0b0011100,\n 0b0111110,\n 0b1111111,\n 0b1111111,\n 0b1111111,\n 0b0111110,\n 0b0011100,\n ],\n\n [\n 0b000111000,\n 0b011111110,\n 0b111111111,\n 0b111111111,\n 0b111111111,\n 0b111111111,\n 0b111111111,\n 0b011111110,\n 0b000111000,\n ],\n [\n 0b00001110000,\n 0b00111111100,\n 0b01111111110,\n 0b01111111110,\n 0b11111111111,\n 0b11111111111,\n 0b11111111111,\n 0b01111111110,\n 0b01111111110,\n 0b00111111100,\n 0b00011111000,\n ],\n [\n 0b0000111110000,\n 0b0011111111100,\n 0b0111111111110,\n 0b0111111111110,\n 0b1111111111111,\n 0b1111111111111,\n 0b1111111111111,\n 0b1111111111111,\n 0b1111111111111,\n 0b0111111111110,\n 0b0111111111110,\n 0b0011111111100,\n 0b0000111110000,\n ],\n [\n 0b000001111100000,\n 0b000111111111000,\n 0b001111111111100,\n 0b011111111111110,\n 0b011111111111110,\n 0b111111111111111,\n 0b111111111111111,\n 0b111111111111111,\n 0b111111111111111,\n 0b111111111111111,\n 0b011111111111110,\n 0b011111111111110,\n 0b001111111111100,\n 0b000111111111000,\n 0b000001111100000,\n ],\n];\n\nexport default circleBitmaps;\n"],"mappings":";AACA,MAAM,gBAA4B;CAChC,CACE,CACF;CACA;EACE;EACA;EACA;CACF;CAEA;EACE;EACA;EACA;EACA;EACA;CACF;CAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -1,22 +1,17 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createBlitter = void 0;
4
- const sci0_1 = require("@4bitlabs/sci0");
1
+ import { DrawMode } from "@4bitlabs/sci0";
2
+ //#region src/pic/tools/create-blitter.ts
5
3
  const createBlitter = (plot, [stageWidth, stageHeight]) => (x0, y0, drawMode, cel) => {
6
- if (sci0_1.DrawMode.isControlMode(drawMode) || sci0_1.DrawMode.isPriorityMode(drawMode))
7
- console.warn('unhandled CEL command on Control/Priority layer');
8
- if (!sci0_1.DrawMode.isVisualMode(drawMode))
9
- return;
10
- const data = cel.pixels;
11
- for (let y = y0; y < y0 + cel.height; y++)
12
- for (let x = x0; x < x0 + cel.width; x++) {
13
- if (x >= stageWidth || y >= stageHeight)
14
- continue;
15
- const color = data[x + y * cel.width];
16
- if (color === cel.keyColor)
17
- continue;
18
- plot(x, y, color);
19
- }
4
+ if (DrawMode.isControlMode(drawMode) || DrawMode.isPriorityMode(drawMode)) console.warn("unhandled CEL command on Control/Priority layer");
5
+ if (!DrawMode.isVisualMode(drawMode)) return;
6
+ const data = cel.pixels;
7
+ for (let y = y0; y < y0 + cel.height; y++) for (let x = x0; x < x0 + cel.width; x++) {
8
+ if (x >= stageWidth || y >= stageHeight) continue;
9
+ const color = data[x + y * cel.width];
10
+ if (color === cel.keyColor) continue;
11
+ plot(x, y, color);
12
+ }
20
13
  };
21
- exports.createBlitter = createBlitter;
14
+ //#endregion
15
+ export { createBlitter };
16
+
22
17
  //# sourceMappingURL=create-blitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-blitter.js","sourceRoot":"","sources":["../../../src/pic/tools/create-blitter.ts"],"names":[],"mappings":";;;AACA,yCAA+C;AAGxC,MAAM,aAAa,GACxB,CAAC,IAAgB,EAAE,CAAC,UAAU,EAAE,WAAW,CAAiB,EAAE,EAAE,CAChE,CAAC,EAAU,EAAE,EAAU,EAAE,QAAkB,EAAE,GAAQ,EAAQ,EAAE;IAC7D,IAAI,eAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,eAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAElE,IAAI,CAAC,eAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC;QAAE,OAAO;IAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QACvC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,WAAW;gBAAE,SAAS;YAElD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,KAAK,KAAK,GAAG,CAAC,QAAQ;gBAAE,SAAS;YACrC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACpB,CAAC;AACL,CAAC,CAAC;AAjBS,QAAA,aAAa,iBAiBtB"}
1
+ {"version":3,"file":"create-blitter.js","names":[],"sources":["../../../src/pic/tools/create-blitter.ts"],"sourcesContent":["import type { Vec2 } from '@4bitlabs/vec2';\nimport { DrawMode, type Cel } from '@4bitlabs/sci0';\nimport type { RawPlotter } from './screen.js';\n\nexport const createBlitter =\n (plot: RawPlotter, [stageWidth, stageHeight]: Readonly<Vec2>) =>\n (x0: number, y0: number, drawMode: DrawMode, cel: Cel): void => {\n if (DrawMode.isControlMode(drawMode) || DrawMode.isPriorityMode(drawMode))\n console.warn('unhandled CEL command on Control/Priority layer');\n\n if (!DrawMode.isVisualMode(drawMode)) return;\n\n const data = cel.pixels;\n for (let y = y0; y < y0 + cel.height; y++)\n for (let x = x0; x < x0 + cel.width; x++) {\n if (x >= stageWidth || y >= stageHeight) continue;\n\n const color = data[x + y * cel.width];\n if (color === cel.keyColor) continue;\n plot(x, y, color);\n }\n };\n"],"mappings":";;AAIA,MAAa,iBACV,MAAkB,CAAC,YAAY,kBAC/B,IAAY,IAAY,UAAoB,QAAmB;CAC9D,IAAI,SAAS,cAAc,QAAQ,KAAK,SAAS,eAAe,QAAQ,GACtE,QAAQ,KAAK,iDAAiD;CAEhE,IAAI,CAAC,SAAS,aAAa,QAAQ,GAAG;CAEtC,MAAM,OAAO,IAAI;CACjB,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ,KACpC,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK;EACxC,IAAI,KAAK,cAAc,KAAK,aAAa;EAEzC,MAAM,QAAQ,KAAK,IAAI,IAAI,IAAI;EAC/B,IAAI,UAAU,IAAI,UAAU;EAC5B,KAAK,GAAG,GAAG,KAAK;CAClB;AACJ"}
@@ -1,37 +1,25 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createBrush = void 0;
7
- const noise_1 = require("./noise");
8
- const circles_1 = __importDefault(require("./circles"));
1
+ import { NOISE, NOISE_OFFSETS } from "./noise.js";
2
+ import circleBitmaps from "./circles.js";
3
+ //#region src/pic/tools/create-brush.ts
9
4
  const createBrush = (plot, [stageWidth, stageHeight]) => function brush(cx, cy, drawMode, drawCodes, size, isRect, isSpray, textureCode) {
10
- const baseWidth = isRect ? 2 : 1;
11
- const width = baseWidth + size * 2;
12
- const height = 1 + size * 2;
13
- let top = Math.max(0, cy - size);
14
- let left = Math.max(0, cx - size);
15
- const bottom = top + height;
16
- const right = left + width;
17
- if (right >= stageWidth)
18
- left = stageWidth - width;
19
- if (bottom >= stageHeight)
20
- top = stageHeight - height;
21
- let noiseIdx = noise_1.NOISE_OFFSETS[textureCode];
22
- for (let py = top; py < bottom; py += 1)
23
- for (let px = left; px < right; px += 1) {
24
- if (!isRect) {
25
- const sprite = circles_1.default[size];
26
- const row = sprite[py - top];
27
- const shift = width - (px - left) - 1;
28
- if (((row >>> shift) & 0b1) === 0)
29
- continue;
30
- }
31
- if (isSpray && !noise_1.NOISE[noiseIdx++ & 0xff])
32
- continue;
33
- plot(px, py, drawMode, drawCodes);
34
- }
5
+ const width = (isRect ? 2 : 1) + size * 2;
6
+ const height = 1 + size * 2;
7
+ let top = Math.max(0, cy - size);
8
+ let left = Math.max(0, cx - size);
9
+ const bottom = top + height;
10
+ const right = left + width;
11
+ if (right >= stageWidth) left = stageWidth - width;
12
+ if (bottom >= stageHeight) top = stageHeight - height;
13
+ let noiseIdx = NOISE_OFFSETS[textureCode];
14
+ for (let py = top; py < bottom; py += 1) for (let px = left; px < right; px += 1) {
15
+ if (!isRect) {
16
+ if ((circleBitmaps[size][py - top] >>> width - (px - left) - 1 & 1) === 0) continue;
17
+ }
18
+ if (isSpray && !NOISE[noiseIdx++ & 255]) continue;
19
+ plot(px, py, drawMode, drawCodes);
20
+ }
35
21
  };
36
- exports.createBrush = createBrush;
22
+ //#endregion
23
+ export { createBrush };
24
+
37
25
  //# sourceMappingURL=create-brush.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-brush.js","sourceRoot":"","sources":["../../../src/pic/tools/create-brush.ts"],"names":[],"mappings":";;;;;;AAGA,mCAA+C;AAC/C,wDAAgC;AAEzB,MAAM,WAAW,GAAG,CACzB,IAAa,EACb,CAAC,UAAU,EAAE,WAAW,CAAiB,EAChC,EAAE,CACX,SAAS,KAAK,CACZ,EAAE,EACF,EAAE,EACF,QAAkB,EAClB,SAAoB,EACpB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,WAAW;IAEX,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAE5B,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IAC3B,IAAI,KAAK,IAAI,UAAU;QAAE,IAAI,GAAG,UAAU,GAAG,KAAK,CAAC;IACnD,IAAI,MAAM,IAAI,WAAW;QAAE,GAAG,GAAG,WAAW,GAAG,MAAM,CAAC;IAEtD,IAAI,QAAQ,GAAG,qBAAa,CAAC,WAAW,CAAC,CAAC;IAE1C,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC;QACrC,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,iBAAO,CAAC,IAAI,CAAC,CAAC;gBAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;oBAAE,SAAS;YAC9C,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,aAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;gBAAE,SAAS;YACnD,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;AACL,CAAC,CAAC;AAtCS,QAAA,WAAW,eAsCpB"}
1
+ {"version":3,"file":"create-brush.js","names":["CIRCLES"],"sources":["../../../src/pic/tools/create-brush.ts"],"sourcesContent":["import type { Vec2 } from '@4bitlabs/vec2';\nimport type { DrawMode, DrawCodes } from '@4bitlabs/sci0';\nimport type { Brusher, Plotter } from './screen.js';\nimport { NOISE, NOISE_OFFSETS } from './noise.js';\nimport CIRCLES from './circles.js';\n\nexport const createBrush = (\n plot: Plotter,\n [stageWidth, stageHeight]: Readonly<Vec2>,\n): Brusher =>\n function brush(\n cx,\n cy,\n drawMode: DrawMode,\n drawCodes: DrawCodes,\n size,\n isRect,\n isSpray,\n textureCode,\n ): void {\n const baseWidth = isRect ? 2 : 1;\n const width = baseWidth + size * 2;\n const height = 1 + size * 2;\n\n let top = Math.max(0, cy - size);\n let left = Math.max(0, cx - size);\n const bottom = top + height;\n const right = left + width;\n if (right >= stageWidth) left = stageWidth - width;\n if (bottom >= stageHeight) top = stageHeight - height;\n\n let noiseIdx = NOISE_OFFSETS[textureCode];\n\n for (let py = top; py < bottom; py += 1)\n for (let px = left; px < right; px += 1) {\n if (!isRect) {\n const sprite = CIRCLES[size];\n const row = sprite[py - top];\n const shift = width - (px - left) - 1;\n if (((row >>> shift) & 0b1) === 0) continue;\n }\n if (isSpray && !NOISE[noiseIdx++ & 0xff]) continue;\n plot(px, py, drawMode, drawCodes);\n }\n };\n"],"mappings":";;;AAMA,MAAa,eACX,MACA,CAAC,YAAY,iBAEb,SAAS,MACP,IACA,IACA,UACA,WACA,MACA,QACA,SACA,aACM;CAEN,MAAM,SADY,SAAS,IAAI,KACL,OAAO;CACjC,MAAM,SAAS,IAAI,OAAO;CAE1B,IAAI,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI;CAC/B,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI;CAChC,MAAM,SAAS,MAAM;CACrB,MAAM,QAAQ,OAAO;CACrB,IAAI,SAAS,YAAY,OAAO,aAAa;CAC7C,IAAI,UAAU,aAAa,MAAM,cAAc;CAE/C,IAAI,WAAW,cAAc;CAE7B,KAAK,IAAI,KAAK,KAAK,KAAK,QAAQ,MAAM,GACpC,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO,MAAM,GAAG;EACvC,IAAI,CAAC,QACYA;QAAAA,cAAQ,KACL,CAAC,KAAK,SACV,SAAS,KAAK,QAAQ,IACb,OAAS,GAAG;EAAA;EAErC,IAAI,WAAW,CAAC,MAAM,aAAa,MAAO;EAC1C,KAAK,IAAI,IAAI,UAAU,SAAS;CAClC;AACJ"}