@4bitlabs/sci0-renderer 1.0.0 → 1.1.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.
@@ -0,0 +1,5 @@
1
+ //#region src/pic/default-palettes.d.ts
2
+ type PaletteSet = [Uint8Array, Uint8Array, Uint8Array, Uint8Array];
3
+ //#endregion
4
+ export { PaletteSet };
5
+ //# sourceMappingURL=default-palettes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-palettes.d.ts","names":[],"sources":["../../src/pic/default-palettes.ts"],"mappings":";KAEY,cAAc,YAAY,YAAY,YAAY"}
@@ -1,7 +1,13 @@
1
1
  import { RenderResult } from "./render-result.js";
2
2
  import { RenderPicOptions } from "./render-pic-options.js";
3
+ import { PaletteSet } from "./default-palettes.js";
4
+ import { Screen } from "./tools/screen.js";
3
5
  import { DrawCommand, Pic } from "@4bitlabs/sci0";
4
6
  //#region src/pic/generate-pic.d.ts
7
+ type IntermediatePicState = [idx: number, command: DrawCommand, layers: RenderResult, meta: {
8
+ palettes: PaletteSet;
9
+ screen: Screen;
10
+ }];
5
11
  /**
6
12
  * Generate a {@link Pic} iterator that will emit after processing each {@link DrawCommand} is processed.
7
13
  *
@@ -25,7 +31,7 @@ import { DrawCommand, Pic } from "@4bitlabs/sci0";
25
31
  * }
26
32
  * ```
27
33
  */
28
- declare function generatePic(pic: Pic, options?: RenderPicOptions): Generator<[idx: number, command: DrawCommand, layers: RenderResult]>;
34
+ declare function generatePic(pic: Pic, options?: RenderPicOptions): Generator<IntermediatePicState>;
29
35
  //#endregion
30
- export { generatePic };
36
+ export { IntermediatePicState, generatePic };
31
37
  //# sourceMappingURL=generate-pic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-pic.d.ts","names":[],"sources":["../../src/pic/generate-pic.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BiB,YACf,KAAK,KACL,UAAS,mBACR,WAAW,aAAa,SAAS,aAAa,QAAQ"}
1
+ {"version":3,"file":"generate-pic.d.ts","names":[],"sources":["../../src/pic/generate-pic.ts"],"mappings":";;;;;;KASY,wBACV,aACA,SAAS,aACT,QAAQ,cACR;EAAQ,UAAU;EAAY,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BvB,YACf,KAAK,KACL,UAAS,mBACR,UAAU"}
@@ -14,7 +14,11 @@ function* generatePic(pic, options = {}) {
14
14
  yield [
15
15
  step,
16
16
  cmd,
17
- result
17
+ result,
18
+ {
19
+ screen,
20
+ palettes
21
+ }
18
22
  ];
19
23
  step += 1;
20
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate-pic.js","names":[],"sources":["../../src/pic/generate-pic.ts"],"sourcesContent":["import type { DrawCommand, Pic } from '@4bitlabs/sci0';\nimport type { Vec2 } from '@4bitlabs/vec2';\nimport type { RenderPicOptions } from './render-pic-options.js';\nimport type { RenderResult } from './render-result.js';\nimport { defaultPalettes } from './default-palettes.js';\nimport { createScreenBuffer } from './screen-buffer.js';\nimport { picStep } from './pic-step.js';\n\n/**\n * Generate a {@link Pic} iterator that will emit after processing each {@link DrawCommand} is processed.\n *\n * @param pic Picture data.\n * @param options\n *\n * @example\n * ```ts\n * import { parsePic } from '@4bitlabs/sci0';\n * import { generatePic } from '@4bitlabs/sci0-renderer';\n * import { CGA } from '@4bitlabs/color/dithers';\n * import { createDitherFilter, renderPixelData } from '@4bitlabs/image';\n *\n * const classicPipeline = { render: createDitherFilter(CGA) };\n *\n * const picData = parsePic(data, { defer: true });\n * for (const [idx, cmd, layers] of generatePic(visible) {\n * const { visible } = layers;\n * const image = renderPixelData(visible, classicPipeline);\n * saveImage(`frame${idx}.png`, image);\n * }\n * ```\n */\nexport function* generatePic(\n pic: Pic,\n options: RenderPicOptions = {},\n): Generator<[idx: number, command: DrawCommand, layers: 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 yield [step, cmd, result];\n step += 1;\n }\n}\n"],"mappings":";;;;AA+BA,UAAiB,YACf,KACA,UAA4B,CAAC,GACyC;CACtE,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,MAAM;GAAC;GAAM;GAAK;EAAM;EACxB,QAAQ;CACV;AACF"}
1
+ {"version":3,"file":"generate-pic.js","names":[],"sources":["../../src/pic/generate-pic.ts"],"sourcesContent":["import type { DrawCommand, Pic } from '@4bitlabs/sci0';\nimport type { Vec2 } from '@4bitlabs/vec2';\nimport type { RenderPicOptions } from './render-pic-options.js';\nimport type { RenderResult } from './render-result.js';\nimport { defaultPalettes, type PaletteSet } from './default-palettes.js';\nimport { createScreenBuffer } from './screen-buffer.js';\nimport { picStep } from './pic-step.js';\nimport type { Screen } from './tools/screen.js';\n\nexport type IntermediatePicState = [\n idx: number,\n command: DrawCommand,\n layers: RenderResult,\n meta: { palettes: PaletteSet; screen: Screen },\n];\n\n/**\n * Generate a {@link Pic} iterator that will emit after processing each {@link DrawCommand} is processed.\n *\n * @param pic Picture data.\n * @param options\n *\n * @example\n * ```ts\n * import { parsePic } from '@4bitlabs/sci0';\n * import { generatePic } from '@4bitlabs/sci0-renderer';\n * import { CGA } from '@4bitlabs/color/dithers';\n * import { createDitherFilter, renderPixelData } from '@4bitlabs/image';\n *\n * const classicPipeline = { render: createDitherFilter(CGA) };\n *\n * const picData = parsePic(data, { defer: true });\n * for (const [idx, cmd, layers] of generatePic(visible) {\n * const { visible } = layers;\n * const image = renderPixelData(visible, classicPipeline);\n * saveImage(`frame${idx}.png`, image);\n * }\n * ```\n */\nexport function* generatePic(\n pic: Pic,\n options: RenderPicOptions = {},\n): Generator<IntermediatePicState> {\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 yield [step, cmd, result, { screen, palettes }];\n step += 1;\n }\n}\n"],"mappings":";;;;AAuCA,UAAiB,YACf,KACA,UAA4B,CAAC,GACI;CACjC,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,MAAM;GAAC;GAAM;GAAK;GAAQ;IAAE;IAAQ;GAAS;EAAC;EAC9C,QAAQ;CACV;AACF"}
@@ -1 +1 @@
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
+ {"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\nexport type 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"}
@@ -0,0 +1,17 @@
1
+ import { Cel, DrawCodes, DrawMode } from "@4bitlabs/sci0";
2
+ //#region src/pic/tools/screen.d.ts
3
+ type RawPlotter = (x: number, y: number, color: number) => void;
4
+ type Filler = (x: number, y: number, drawMode: DrawMode, drawCodes: DrawCodes) => void;
5
+ type Liner = (x0: number, y0: number, x1: number, y1: number, drawMode: DrawMode, drawCodes: DrawCodes) => void;
6
+ type Brusher = (cx: number, cy: number, drawMode: DrawMode, drawCodes: DrawCodes, size: number, isRect: boolean, isSpray: boolean, textureCode: number) => void;
7
+ type Blitter = (x: number, y: number, drawMode: DrawMode, cel: Cel) => void;
8
+ interface Screen {
9
+ brush: Brusher;
10
+ fill: Filler;
11
+ line: Liner;
12
+ setPixel: RawPlotter;
13
+ blit: Blitter;
14
+ }
15
+ //#endregion
16
+ export { Blitter, Brusher, Filler, Liner, RawPlotter, Screen };
17
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","names":[],"sources":["../../../src/pic/tools/screen.ts"],"mappings":";;KAEY,cAAc,WAAW,WAAW;KAWpC,UACV,WACA,WACA,UAAU,UACV,WAAW;KAGD,SACV,YACA,YACA,YACA,YACA,UAAU,UACV,WAAW;KAGD,WACV,YACA,YACA,UAAU,UACV,WAAW,WACX,cACA,iBACA,kBACA;KAGU,WACV,WACA,WACA,UAAU,UACV,KAAK;UAGU;EACf,OAAO;EACP,MAAM;EACN,MAAM;EACN,UAAU;EACV,MAAM"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@4bitlabs/sci0-renderer",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Image processing filters and rendering functions for Sierra On-line SCI0 graphical assets.",
5
5
  "homepage": "https://github.com/32bitkid/sci.js/tree/main/libs/sci0#readme",
6
6
  "bugs": {
@@ -21,13 +21,16 @@
21
21
  "scripts": {
22
22
  "build": "tsdown",
23
23
  "clean": "tsc --build --clean",
24
- "clean:wipe": "rimraf ./dist"
24
+ "clean:wipe": "rimraf ./dist",
25
+ "prepublishOnly": "npm run build",
26
+ "test": "vitest run",
27
+ "test:dev": "vitest dev"
25
28
  },
26
29
  "dependencies": {
27
- "@4bitlabs/image": "^5.0.0",
30
+ "@4bitlabs/image": "^5.0.1",
28
31
  "@4bitlabs/numeric-deque": "^2.0.0",
29
32
  "@4bitlabs/sci0": "^6.0.0",
30
- "@4bitlabs/vec2": "^3.0.0"
33
+ "@4bitlabs/vec2": "^3.0.1"
31
34
  },
32
- "gitHead": "e8b4502e1f5fd42407c8857829e66eb5713a9f84"
35
+ "gitHead": "17892f8cda5d4332d646d343e54ba36448943d39"
33
36
  }