|
|
|
@ -8,7 +8,7 @@ import { MonoDisplayRenderer } from "./renderer"; |
|
|
|
/** Optional constructor arguments for MonoDisplayDriver */ |
|
|
|
/** Optional constructor arguments for MonoDisplayDriver */ |
|
|
|
export interface MonoDisplayDriverOptions { |
|
|
|
export interface MonoDisplayDriverOptions { |
|
|
|
/** CSS colour for on-pixels. Default "#ffffff" */ |
|
|
|
/** CSS colour for on-pixels. Default "#ffffff" */ |
|
|
|
onColor?: string; |
|
|
|
onColor?: string; |
|
|
|
/** CSS colour for off-pixels / background. Default "#000000" */ |
|
|
|
/** CSS colour for off-pixels / background. Default "#000000" */ |
|
|
|
offColor?: string; |
|
|
|
offColor?: string; |
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -16,9 +16,9 @@ export interface MonoDisplayDriverOptions { |
|
|
|
* Keep at 1 and use CSS to stretch for crisp upscaling. |
|
|
|
* Keep at 1 and use CSS to stretch for crisp upscaling. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
scale?: number; |
|
|
|
scale?: number; |
|
|
|
/** Default display width for elements without inherent size. Default 160. */ |
|
|
|
/** Default display width for elements without inherent size. Default 120. */ |
|
|
|
displayWidth?: number; |
|
|
|
displayWidth?: number; |
|
|
|
/** Default display height. Default 80. */ |
|
|
|
/** Default display height. Default 60. */ |
|
|
|
displayHeight?: number; |
|
|
|
displayHeight?: number; |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Render rate in ticks per second. All animations and scrolls are driven by this. |
|
|
|
* Render rate in ticks per second. All animations and scrolls are driven by this. |
|
|
|
@ -54,9 +54,9 @@ export interface MonoDisplayDriverOptions { |
|
|
|
* ``` |
|
|
|
* ``` |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export class MonoDisplayDriver { |
|
|
|
export class MonoDisplayDriver { |
|
|
|
private canvas: HTMLCanvasElement; |
|
|
|
private canvas: HTMLCanvasElement; |
|
|
|
private opts: Required<MonoDisplayDriverOptions>; |
|
|
|
private opts: Required<MonoDisplayDriverOptions>; |
|
|
|
private parser: MonoDisplayParser; |
|
|
|
private parser: MonoDisplayParser; |
|
|
|
private renderer: MonoDisplayRenderer | null = null; |
|
|
|
private renderer: MonoDisplayRenderer | null = null; |
|
|
|
|
|
|
|
|
|
|
|
constructor(canvasId: string, options: MonoDisplayDriverOptions = {}) { |
|
|
|
constructor(canvasId: string, options: MonoDisplayDriverOptions = {}) { |
|
|
|
@ -64,15 +64,15 @@ export class MonoDisplayDriver { |
|
|
|
if (!el || el.tagName !== "CANVAS") throw new Error(`#${canvasId} is not a <canvas>`); |
|
|
|
if (!el || el.tagName !== "CANVAS") throw new Error(`#${canvasId} is not a <canvas>`); |
|
|
|
this.canvas = el as HTMLCanvasElement; |
|
|
|
this.canvas = el as HTMLCanvasElement; |
|
|
|
this.opts = { |
|
|
|
this.opts = { |
|
|
|
onColor: options.onColor ?? "#ffffff", |
|
|
|
onColor: options.onColor ?? "#ffffff", |
|
|
|
offColor: options.offColor ?? "#000000", |
|
|
|
offColor: options.offColor ?? "#000000", |
|
|
|
scale: options.scale ?? 1, |
|
|
|
scale: options.scale ?? 1, |
|
|
|
displayWidth: options.displayWidth ?? 160, |
|
|
|
displayWidth: options.displayWidth ?? 120, |
|
|
|
displayHeight: options.displayHeight ?? 80, |
|
|
|
displayHeight: options.displayHeight ?? 60, |
|
|
|
fps: options.fps ?? 25, |
|
|
|
fps: options.fps ?? 25, |
|
|
|
loop: options.loop ?? true, |
|
|
|
loop: options.loop ?? true, |
|
|
|
onError: options.onError ?? ((e: Error) => { throw e; }), |
|
|
|
onError: options.onError ?? ((e: Error) => { throw e; }), |
|
|
|
now: options.now ?? (() => new Date()), |
|
|
|
now: options.now ?? (() => new Date()), |
|
|
|
}; |
|
|
|
}; |
|
|
|
this.parser = new MonoDisplayParser(); |
|
|
|
this.parser = new MonoDisplayParser(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -80,7 +80,7 @@ export class MonoDisplayDriver { |
|
|
|
async load(loader: () => Promise<ArrayBuffer>): Promise<void> { |
|
|
|
async load(loader: () => Promise<ArrayBuffer>): Promise<void> { |
|
|
|
try { |
|
|
|
try { |
|
|
|
const buffer = await loader(); |
|
|
|
const buffer = await loader(); |
|
|
|
const file = this.parser.parse(buffer); |
|
|
|
const file = this.parser.parse(buffer); |
|
|
|
if (!this.renderer) this.renderer = new MonoDisplayRenderer(this.canvas, this.opts); |
|
|
|
if (!this.renderer) this.renderer = new MonoDisplayRenderer(this.canvas, this.opts); |
|
|
|
this.renderer.render(file); |
|
|
|
this.renderer.render(file); |
|
|
|
} catch (err) { |
|
|
|
} catch (err) { |
|
|
|
|