@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.
- package/dist/filters/loop-padding-filter.d.ts +6 -3
- package/dist/filters/loop-padding-filter.d.ts.map +1 -1
- package/dist/filters/loop-padding-filter.js +25 -30
- package/dist/filters/loop-padding-filter.js.map +1 -1
- package/dist/filters/menu-text-filter.d.ts +10 -7
- package/dist/filters/menu-text-filter.d.ts.map +1 -1
- package/dist/filters/menu-text-filter.js +22 -35
- package/dist/filters/menu-text-filter.js.map +1 -1
- package/dist/index.d.ts +7 -8
- package/dist/index.js +5 -12
- package/dist/pic/default-palette.js +45 -9
- package/dist/pic/default-palette.js.map +1 -1
- package/dist/pic/default-palettes.js +9 -9
- package/dist/pic/default-palettes.js.map +1 -1
- package/dist/pic/generate-pic.d.ts +7 -4
- package/dist/pic/generate-pic.d.ts.map +1 -1
- package/dist/pic/generate-pic.js +22 -40
- package/dist/pic/generate-pic.js.map +1 -1
- package/dist/pic/pic-step.js +42 -43
- package/dist/pic/pic-step.js.map +1 -1
- package/dist/pic/render-pic-options.d.ts +18 -15
- package/dist/pic/render-pic-options.d.ts.map +1 -1
- package/dist/pic/render-pic.d.ts +7 -4
- package/dist/pic/render-pic.d.ts.map +1 -1
- package/dist/pic/render-pic.js +18 -40
- package/dist/pic/render-pic.js.map +1 -1
- package/dist/pic/render-result.d.ts +9 -6
- package/dist/pic/render-result.d.ts.map +1 -1
- package/dist/pic/screen-buffer.js +64 -67
- package/dist/pic/screen-buffer.js.map +1 -1
- package/dist/pic/tools/circles.js +82 -84
- package/dist/pic/tools/circles.js.map +1 -1
- package/dist/pic/tools/create-blitter.js +14 -19
- package/dist/pic/tools/create-blitter.js.map +1 -1
- package/dist/pic/tools/create-brush.js +22 -34
- package/dist/pic/tools/create-brush.js.map +1 -1
- package/dist/pic/tools/create-flood-fill.js +43 -60
- package/dist/pic/tools/create-flood-fill.js.map +1 -1
- package/dist/pic/tools/create-line.js +37 -43
- package/dist/pic/tools/create-line.js.map +1 -1
- package/dist/pic/tools/index.js +5 -14
- package/dist/pic/tools/noise.js +160 -22
- package/dist/pic/tools/noise.js.map +1 -1
- package/dist/utils/exhaustive.js +5 -4
- package/dist/utils/exhaustive.js.map +1 -1
- package/package.json +16 -15
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/pic/default-palette.d.ts +0 -2
- package/dist/pic/default-palette.d.ts.map +0 -1
- package/dist/pic/default-palettes.d.ts +0 -3
- package/dist/pic/default-palettes.d.ts.map +0 -1
- package/dist/pic/pic-step.d.ts +0 -4
- package/dist/pic/pic-step.d.ts.map +0 -1
- package/dist/pic/render-pic-options.js +0 -3
- package/dist/pic/render-pic-options.js.map +0 -1
- package/dist/pic/render-result.js +0 -3
- package/dist/pic/render-result.js.map +0 -1
- package/dist/pic/screen-buffer.d.ts +0 -7
- package/dist/pic/screen-buffer.d.ts.map +0 -1
- package/dist/pic/tools/circles.d.ts +0 -3
- package/dist/pic/tools/circles.d.ts.map +0 -1
- package/dist/pic/tools/create-blitter.d.ts +0 -5
- package/dist/pic/tools/create-blitter.d.ts.map +0 -1
- package/dist/pic/tools/create-brush.d.ts +0 -4
- package/dist/pic/tools/create-brush.d.ts.map +0 -1
- package/dist/pic/tools/create-flood-fill.d.ts +0 -4
- package/dist/pic/tools/create-flood-fill.d.ts.map +0 -1
- package/dist/pic/tools/create-line.d.ts +0 -3
- package/dist/pic/tools/create-line.d.ts.map +0 -1
- package/dist/pic/tools/create-marker.d.ts +0 -3
- package/dist/pic/tools/create-marker.d.ts.map +0 -1
- package/dist/pic/tools/create-marker.js +0 -11
- package/dist/pic/tools/create-marker.js.map +0 -1
- package/dist/pic/tools/index.d.ts +0 -6
- package/dist/pic/tools/index.d.ts.map +0 -1
- package/dist/pic/tools/index.js.map +0 -1
- package/dist/pic/tools/noise.d.ts +0 -3
- package/dist/pic/tools/noise.d.ts.map +0 -1
- package/dist/pic/tools/screen.d.ts +0 -16
- package/dist/pic/tools/screen.d.ts.map +0 -1
- package/dist/pic/tools/screen.js +0 -3
- package/dist/pic/tools/screen.js.map +0 -1
- package/dist/utils/exhaustive.d.ts +0 -2
- package/dist/utils/exhaustive.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-pic.d.ts","
|
|
1
|
+
{"version":3,"file":"render-pic.d.ts","names":[],"sources":["../../src/pic/render-pic.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;cA8Ba,YACX,KAAK,KACL,UAAS,qBACR"}
|
package/dist/pic/render-pic.js
CHANGED
|
@@ -1,43 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
18
|
+
//#endregion
|
|
19
|
+
export { renderPic };
|
|
20
|
+
|
|
43
21
|
//# sourceMappingURL=render-pic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-pic.js","
|
|
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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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","
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
64
|
+
//#endregion
|
|
65
|
+
export { createScreenBuffer };
|
|
66
|
+
|
|
70
67
|
//# sourceMappingURL=screen-buffer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-buffer.js","
|
|
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
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
// prettier-ignore
|
|
1
|
+
//#region src/pic/tools/circles.ts
|
|
4
2
|
const circleBitmaps = [
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
82
|
+
//#endregion
|
|
83
|
+
export { circleBitmaps as default };
|
|
84
|
+
|
|
87
85
|
//# sourceMappingURL=circles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circles.js","
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
14
|
+
//#endregion
|
|
15
|
+
export { createBlitter };
|
|
16
|
+
|
|
22
17
|
//# sourceMappingURL=create-blitter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-blitter.js","
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
22
|
+
//#endregion
|
|
23
|
+
export { createBrush };
|
|
24
|
+
|
|
37
25
|
//# sourceMappingURL=create-brush.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-brush.js","
|
|
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"}
|