@al8b/screen 0.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.
- package/README.md +23 -0
- package/dist/core/base-screen.d.mts +84 -0
- package/dist/core/base-screen.d.ts +84 -0
- package/dist/core/base-screen.js +419 -0
- package/dist/core/base-screen.js.map +1 -0
- package/dist/core/base-screen.mjs +396 -0
- package/dist/core/base-screen.mjs.map +1 -0
- package/dist/core/index.d.mts +10 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.js +1208 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +1183 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/core/screen.d.mts +15 -0
- package/dist/core/screen.d.ts +15 -0
- package/dist/core/screen.js +1209 -0
- package/dist/core/screen.js.map +1 -0
- package/dist/core/screen.mjs +1184 -0
- package/dist/core/screen.mjs.map +1 -0
- package/dist/drawing/primitives-screen.d.mts +28 -0
- package/dist/drawing/primitives-screen.d.ts +28 -0
- package/dist/drawing/primitives-screen.js +685 -0
- package/dist/drawing/primitives-screen.js.map +1 -0
- package/dist/drawing/primitives-screen.mjs +662 -0
- package/dist/drawing/primitives-screen.mjs.map +1 -0
- package/dist/drawing/sprite-screen.d.mts +41 -0
- package/dist/drawing/sprite-screen.d.ts +41 -0
- package/dist/drawing/sprite-screen.js +853 -0
- package/dist/drawing/sprite-screen.js.map +1 -0
- package/dist/drawing/sprite-screen.mjs +830 -0
- package/dist/drawing/sprite-screen.mjs.map +1 -0
- package/dist/drawing/text-screen.d.mts +19 -0
- package/dist/drawing/text-screen.d.ts +19 -0
- package/dist/drawing/text-screen.js +909 -0
- package/dist/drawing/text-screen.js.map +1 -0
- package/dist/drawing/text-screen.mjs +884 -0
- package/dist/drawing/text-screen.mjs.map +1 -0
- package/dist/index.d.mts +10 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +1210 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1184 -0
- package/dist/index.mjs.map +1 -0
- package/dist/tri/index.d.mts +3 -0
- package/dist/tri/index.d.ts +3 -0
- package/dist/tri/index.js +231 -0
- package/dist/tri/index.js.map +1 -0
- package/dist/tri/index.mjs +203 -0
- package/dist/tri/index.mjs.map +1 -0
- package/dist/tri/triangle-screen.d.mts +16 -0
- package/dist/tri/triangle-screen.d.ts +16 -0
- package/dist/tri/triangle-screen.js +1147 -0
- package/dist/tri/triangle-screen.js.map +1 -0
- package/dist/tri/triangle-screen.mjs +1122 -0
- package/dist/tri/triangle-screen.mjs.map +1 -0
- package/dist/tri/ttri.d.mts +71 -0
- package/dist/tri/ttri.d.ts +71 -0
- package/dist/tri/ttri.js +229 -0
- package/dist/tri/ttri.js.map +1 -0
- package/dist/tri/ttri.mjs +203 -0
- package/dist/tri/ttri.mjs.map +1 -0
- package/dist/types/index.d.mts +64 -0
- package/dist/types/index.d.ts +64 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/drawing/sprite-screen.ts","../src/drawing/primitives-screen.ts","../src/core/base-screen.ts","../src/tri/ttri.ts","../src/drawing/text-screen.ts","../src/tri/triangle-screen.ts","../src/core/screen.ts"],"sourcesContent":["/**\n * @al8b/screen - Modular screen rendering system\n *\n * Architecture (mirrors @al8b/runtime style):\n * - core/: Canvas + orchestration (`Screen`)\n * - drawing/: Primitive, sprite, and text rendering layers\n * - tri/: Software triangle rasterizer (TTRI)\n * - types/: Shared interfaces\n */\n\nexport {\n\tScreen,\n\tScreen as default,\n} from \"./core\";\nexport {\n\ttype TextureSource,\n\ttype TexVert,\n\ttype Vec2,\n\ttype Vec3,\n\tZBuffer,\n} from \"./tri\";\nexport * from \"./types\";\n","/**\n * Sprite rendering for Screen class\n */\n\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nimport { PrimitiveScreen } from \"./primitives-screen\";\n\nexport class SpriteScreen extends PrimitiveScreen {\n\t// Cache imageSmoothingEnabled — only set when pixelated flag changes\n\tprivate _lastImageSmoothing = true;\n\n\t// Cache frame time once per draw frame instead of per-sprite\n\tprotected _frameTime = 0;\n\n\t/**\n\t * Initialize draw state (called before each draw frame)\n\t */\n\toverride initDraw(): void {\n\t\tsuper.initDraw();\n\t\tthis._frameTime = performance.now();\n\t}\n\n\t/**\n\t * Set imageSmoothingEnabled only when it actually changes\n\t */\n\tprotected setImageSmoothing(): void {\n\t\tconst smooth = !this.pixelated;\n\t\tif (smooth !== this._lastImageSmoothing) {\n\t\t\tthis.context.imageSmoothingEnabled = smooth;\n\t\t\tthis._lastImageSmoothing = smooth;\n\t\t}\n\t}\n\n\t/**\n\t * Get the canvas for the current sprite frame\n\t */\n\tprotected getSpriteFrame(sprite: Sprite | string | any): HTMLCanvasElement | null {\n\t\tlet frame: number | null = null;\n\n\t\t// Handle string sprite name\n\t\tif (typeof sprite === \"string\") {\n\t\t\tconst spriteName = sprite;\n\t\t\tlet spriteObj: Sprite | null = null;\n\n\t\t\tif (this.runtime && this.runtime.sprites) {\n\t\t\t\tspriteObj = this.runtime.sprites[sprite];\n\t\t\t}\n\n\t\t\t// Handle \"sprite.frame\" format (e.g., \"player.0\")\n\t\t\tif (!spriteObj) {\n\t\t\t\tconst parts = sprite.split(\".\");\n\t\t\t\tif (parts.length > 1 && this.runtime && this.runtime.sprites) {\n\t\t\t\t\tspriteObj = this.runtime.sprites[parts[0]];\n\t\t\t\t\tframe = Number.parseInt(parts[1]) || 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Report sprite not found error\n\t\t\tif (!spriteObj) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7004, { spriteName });\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tsprite = spriteObj;\n\t\t}\n\t\t// Handle Image instances - check for objects with canvas but no frames\n\t\telse if (sprite && typeof sprite === \"object\" && (sprite as any).canvas && !(sprite as any).frames) {\n\t\t\treturn (sprite as any).canvas || (sprite as any).image || null;\n\t\t}\n\n\t\t// Validate sprite object\n\t\tif (!sprite || !(sprite as Sprite).ready) {\n\t\t\tconst spriteName = typeof sprite === \"string\" ? sprite : \"unknown\";\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7005, { spriteName });\n\t\t\treturn null;\n\t\t}\n\n\t\tconst spriteObj = sprite as Sprite;\n\n\t\t// Handle multi-frame sprites — use cached _frameTime instead of Date.now() per call\n\t\tif (spriteObj.frames && spriteObj.frames.length > 1) {\n\t\t\tif (frame === null) {\n\t\t\t\tif (spriteObj.animation_start === 0) {\n\t\t\t\t\tspriteObj.animation_start = this._frameTime;\n\t\t\t\t}\n\t\t\t\tconst dt = 1000 / spriteObj.fps;\n\t\t\t\tframe = Math.floor((this._frameTime - spriteObj.animation_start) / dt) % spriteObj.frames.length;\n\t\t\t}\n\t\t\tif (frame >= 0 && frame < spriteObj.frames.length) {\n\t\t\t\treturn spriteObj.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn spriteObj.frames[0].canvas;\n\t\t}\n\t\t// Handle single-frame sprites\n\t\telse if (spriteObj.frames && spriteObj.frames[0]) {\n\t\t\treturn spriteObj.frames[0].canvas;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Draw a sprite\n\t */\n\tdrawSprite(sprite: Sprite | string | any, x: number, y: number, w?: number, h?: number): void {\n\t\tconst canvas = this.getSpriteFrame(sprite);\n\t\tif (!canvas) return;\n\n\t\tif (w == null) {\n\t\t\tw = canvas.width;\n\t\t}\n\n\t\tif (!h) {\n\t\t\th = (w / canvas.width) * canvas.height;\n\t\t}\n\n\t\t// Viewport culling: skip sprites entirely outside visible area\n\t\t// Only when no screen/object transforms are active (simple AABB check)\n\t\tif (\n\t\t\t!this.screen_transform &&\n\t\t\tthis.object_rotation === 0 &&\n\t\t\tthis.object_scale_x === 1 &&\n\t\t\tthis.object_scale_y === 1\n\t\t) {\n\t\t\tconst drawX = x - w / 2 - (this.anchor_x * w) / 2;\n\t\t\tconst drawY = -y - h / 2 + (this.anchor_y * h) / 2;\n\t\t\tconst halfW = this.width / 2;\n\t\t\tconst halfH = this.height / 2;\n\t\t\tif (drawX > halfW || drawX + w < -halfW || drawY > halfH || drawY + h < -halfH) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.drawImage(canvas, -w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.drawImage(canvas, x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a portion of a sprite\n\t */\n\tdrawSpritePart(\n\t\tsprite: Sprite | string | any,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tconst canvas = this.getSpriteFrame(sprite);\n\t\tif (!canvas) return;\n\n\t\tif (w == null) {\n\t\t\tw = sw;\n\t\t}\n\n\t\tif (!h) {\n\t\t\th = (w / sw) * sh;\n\t\t}\n\n\t\t// Viewport culling: skip sprites entirely outside visible area\n\t\tif (\n\t\t\t!this.screen_transform &&\n\t\t\tthis.object_rotation === 0 &&\n\t\t\tthis.object_scale_x === 1 &&\n\t\t\tthis.object_scale_y === 1\n\t\t) {\n\t\t\tconst drawX = x - w / 2 - (this.anchor_x * w) / 2;\n\t\t\tconst drawY = -y - h / 2 + (this.anchor_y * h) / 2;\n\t\t\tconst halfW = this.width / 2;\n\t\t\tconst halfH = this.height / 2;\n\t\t\tif (drawX > halfW || drawX + w < -halfW || drawY > halfH || drawY + h < -halfH) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.drawImage(\n\t\t\t\tcanvas,\n\t\t\t\tsx,\n\t\t\t\tsy,\n\t\t\t\tsw,\n\t\t\t\tsh,\n\t\t\t\t-w / 2 - (this.anchor_x * w) / 2,\n\t\t\t\t-h / 2 + (this.anchor_y * h) / 2,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.drawImage(\n\t\t\t\tcanvas,\n\t\t\t\tsx,\n\t\t\t\tsy,\n\t\t\t\tsw,\n\t\t\t\tsh,\n\t\t\t\tx - w / 2 - (this.anchor_x * w) / 2,\n\t\t\t\t-y - h / 2 + (this.anchor_y * h) / 2,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a map\n\t */\n\tdrawMap(map: Map | string, x: number, y: number, w: number, h: number): void {\n\t\tlet mapObj: Map | null = null;\n\n\t\tif (typeof map === \"string\") {\n\t\t\tif (this.runtime && this.runtime.maps) {\n\t\t\t\tmapObj = this.runtime.maps[map];\n\t\t\t}\n\t\t} else {\n\t\t\tmapObj = map;\n\t\t}\n\n\t\tif (!(mapObj && mapObj.ready)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tmapObj.draw(this.context, -w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tmapObj.draw(this.context, x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n}\n","import { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { BaseScreen } from \"../core/base-screen\";\n\n/**\n * Adds primitive shape drawing APIs on top of BaseScreen.\n */\nexport class PrimitiveScreen extends BaseScreen {\n\tfillRect(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\t// Validate drawing context\n\t\tif (!this.context) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7092, {});\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate drawing parameters\n\t\tif (!isFinite(x) || !isFinite(y) || !isFinite(w) || !isFinite(h) || w <= 0 || h <= 0) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7093, { error: `Invalid parameters: x=${x}, y=${y}, w=${w}, h=${h}` });\n\t\t\treturn;\n\t\t}\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.fillRect(-w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.fillRect(x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\tfillRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tconst transform = this.initDrawOp(x, -y);\n\t\tconst rx = (transform ? -w / 2 : x - w / 2) - (this.anchor_x * w) / 2;\n\t\tconst ry = (transform ? -h / 2 : -y - h / 2) + (this.anchor_y * h) / 2;\n\n\t\tthis.context.beginPath();\n\t\tif (this.context.roundRect) {\n\t\t\tthis.context.roundRect(rx, ry, w, h, round);\n\t\t} else {\n\t\t\tconst r = Math.min(round, w / 2, h / 2);\n\t\t\tthis.context.moveTo(rx + r, ry);\n\t\t\tthis.context.lineTo(rx + w - r, ry);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry, rx + w, ry + r);\n\t\t\tthis.context.lineTo(rx + w, ry + h - r);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry + h, rx + w - r, ry + h);\n\t\t\tthis.context.lineTo(rx + r, ry + h);\n\t\t\tthis.context.quadraticCurveTo(rx, ry + h, rx, ry + h - r);\n\t\t\tthis.context.lineTo(rx, ry + r);\n\t\t\tthis.context.quadraticCurveTo(rx, ry, rx + r, ry);\n\t\t\tthis.context.closePath();\n\t\t}\n\t\tthis.context.fill();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tfillRound(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tw = Math.abs(w);\n\t\th = Math.abs(h);\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse((-this.anchor_x * w) / 2, (this.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\t\tthis.context.fill();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse(\n\t\t\t\tx - (this.anchor_x * w) / 2,\n\t\t\t\t-y + (this.anchor_y * h) / 2,\n\t\t\t\tw / 2,\n\t\t\t\th / 2,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.PI * 2,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tthis.context.fill();\n\t\t}\n\t}\n\n\tdrawRect(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.strokeRect(-w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.strokeRect(x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\tdrawRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tconst transform = this.initDrawOp(x, -y);\n\t\tconst rx = (transform ? -w / 2 : x - w / 2) - (this.anchor_x * w) / 2;\n\t\tconst ry = (transform ? -h / 2 : -y - h / 2) + (this.anchor_y * h) / 2;\n\n\t\tthis.context.beginPath();\n\t\tif (this.context.roundRect) {\n\t\t\tthis.context.roundRect(rx, ry, w, h, round);\n\t\t} else {\n\t\t\tconst r = Math.min(round, w / 2, h / 2);\n\t\t\tthis.context.moveTo(rx + r, ry);\n\t\t\tthis.context.lineTo(rx + w - r, ry);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry, rx + w, ry + r);\n\t\t\tthis.context.lineTo(rx + w, ry + h - r);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry + h, rx + w - r, ry + h);\n\t\t\tthis.context.lineTo(rx + r, ry + h);\n\t\t\tthis.context.quadraticCurveTo(rx, ry + h, rx, ry + h - r);\n\t\t\tthis.context.lineTo(rx, ry + r);\n\t\t\tthis.context.quadraticCurveTo(rx, ry, rx + r, ry);\n\t\t\tthis.context.closePath();\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawRound(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tw = Math.abs(w);\n\t\th = Math.abs(h);\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse((-this.anchor_x * w) / 2, (this.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\t\tthis.context.stroke();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse(\n\t\t\t\tx - (this.anchor_x * w) / 2,\n\t\t\t\t-y + (this.anchor_y * h) / 2,\n\t\t\t\tw / 2,\n\t\t\t\th / 2,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.PI * 2,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tthis.context.stroke();\n\t\t}\n\t}\n\n\tdrawLine(x1: number, y1: number, x2: number, y2: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(x1, -y1);\n\t\tthis.context.lineTo(x2, -y2);\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawPolygon(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.closePath();\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawPolyline(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tfillPolygon(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.fill();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawQuadCurve(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tlet index = 2;\n\t\twhile (index <= points.length - 4) {\n\t\t\tthis.context.quadraticCurveTo(points[index], -points[index + 1], points[index + 2], -points[index + 3]);\n\t\t\tindex += 4;\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawBezierCurve(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tlet index = 2;\n\t\twhile (index <= points.length - 6) {\n\t\t\tthis.context.bezierCurveTo(\n\t\t\t\tpoints[index],\n\t\t\t\t-points[index + 1],\n\t\t\t\tpoints[index + 2],\n\t\t\t\t-points[index + 3],\n\t\t\t\tpoints[index + 4],\n\t\t\t\t-points[index + 5],\n\t\t\t);\n\t\t\tindex += 6;\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawArc(\n\t\tx: number,\n\t\ty: number,\n\t\tradius: number,\n\t\tangle1: number,\n\t\tangle2: number,\n\t\tccw: boolean,\n\t\tcolor?: string | number,\n\t): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(0, 0, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.stroke();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(x, -y, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.stroke();\n\t\t}\n\t}\n\n\tfillArc(\n\t\tx: number,\n\t\ty: number,\n\t\tradius: number,\n\t\tangle1: number,\n\t\tangle2: number,\n\t\tccw: boolean,\n\t\tcolor?: string | number,\n\t): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(0, 0, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.fill();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(x, -y, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.fill();\n\t\t}\n\t}\n\n\tprivate extractPoints(args: any[]): {\n\t\tcolor?: string | number;\n\t\tpoints?: number[];\n\t} {\n\t\tlet color: string | number | undefined;\n\t\tlet points: number[] | undefined;\n\n\t\tif (args.length > 0 && args.length % 2 === 1 && typeof args[args.length - 1] === \"string\") {\n\t\t\tcolor = args[args.length - 1];\n\t\t\tpoints = args.slice(0, -1);\n\t\t} else if (Array.isArray(args[0])) {\n\t\t\tif (args[1] && typeof args[1] === \"string\") {\n\t\t\t\tcolor = args[1];\n\t\t\t}\n\t\t\tpoints = args[0];\n\t\t} else {\n\t\t\tpoints = args as number[];\n\t\t}\n\n\t\treturn {\n\t\t\tcolor,\n\t\t\tpoints,\n\t\t};\n\t}\n}\n","import { APIErrorCode, createDiagnostic, formatForBrowser, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { ZBuffer } from \"../tri\";\nimport type { ScreenInterface, ScreenOptions } from \"../types\";\n\n/**\n * BaseScreen encapsulates canvas/context management plus shared drawing state.\n * Feature-specific behaviors (primitives, sprites, text, triangles) extend this class.\n */\nexport class BaseScreen {\n\tprotected canvas: HTMLCanvasElement;\n\tprotected context!: CanvasRenderingContext2D;\n\tprotected runtime: any;\n\n\tpublic width!: number;\n\tpublic height!: number;\n\n\t// Drawing state\n\tprotected alpha = 1;\n\tprotected pixelated = 1;\n\tprotected line_width = 1;\n\tprotected font = \"BitCell\";\n\n\t// Transformations\n\tprotected translation_x = 0;\n\tprotected translation_y = 0;\n\tprotected rotation = 0;\n\tprotected scale_x = 1;\n\tprotected scale_y = 1;\n\tprotected screen_transform = false;\n\n\t// Object transformations\n\tprotected object_rotation = 0;\n\tprotected object_scale_x = 1;\n\tprotected object_scale_y = 1;\n\tprotected anchor_x = 0;\n\tprotected anchor_y = 0;\n\n\t// Blending + font caches\n\tprotected blending: Record<string, string> = {};\n\tprotected font_load_requested: Record<string, boolean> = {};\n\tprotected font_loaded: Record<string, boolean> = {};\n\n\t// Interface cache\n\tprotected interfaceCache: ScreenInterface | null = null;\n\n\t// Cursor management\n\tprotected cursor: string = \"default\";\n\tprotected cursor_visibility: string = \"auto\";\n\tprotected last_mouse_move: number = Date.now();\n\n\t// 3D helper\n\tprotected zBuffer: ZBuffer;\n\n\tconstructor(options: ScreenOptions = {}) {\n\t\tthis.runtime = options.runtime;\n\n\t\tif (options.canvas) {\n\t\t\tthis.canvas = options.canvas;\n\t\t\tif (this.canvas.width === 0 || this.canvas.height === 0) {\n\t\t\t\tthis.canvas.width = options.width || 1080;\n\t\t\t\tthis.canvas.height = options.height || 1920;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.canvas = document.createElement(\"canvas\");\n\t\t\tthis.canvas.width = options.width || 1080;\n\t\t\tthis.canvas.height = options.height || 1920;\n\t\t}\n\n\t\tthis.initContext();\n\n\t\tthis.blending = {\n\t\t\tnormal: \"source-over\",\n\t\t\tadditive: \"lighter\",\n\t\t};\n\n\t\tconst blendModes = [\n\t\t\t\"source-over\",\n\t\t\t\"source-in\",\n\t\t\t\"source-out\",\n\t\t\t\"source-atop\",\n\t\t\t\"destination-over\",\n\t\t\t\"destination-in\",\n\t\t\t\"destination-out\",\n\t\t\t\"destination-atop\",\n\t\t\t\"lighter\",\n\t\t\t\"copy\",\n\t\t\t\"xor\",\n\t\t\t\"multiply\",\n\t\t\t\"screen\",\n\t\t\t\"overlay\",\n\t\t\t\"darken\",\n\t\t\t\"lighten\",\n\t\t\t\"color-dodge\",\n\t\t\t\"color-burn\",\n\t\t\t\"hard-light\",\n\t\t\t\"soft-light\",\n\t\t\t\"difference\",\n\t\t\t\"exclusion\",\n\t\t\t\"hue\",\n\t\t\t\"saturation\",\n\t\t\t\"color\",\n\t\t\t\"luminosity\",\n\t\t];\n\n\t\tfor (const mode of blendModes) {\n\t\t\tthis.blending[mode] = mode;\n\t\t}\n\n\t\tthis.loadFont(this.font);\n\t\tthis.zBuffer = new ZBuffer(this.canvas.width, this.canvas.height);\n\n\t\tthis.cursor = \"default\";\n\n\t\tthis.canvas.addEventListener(\"mousemove\", () => {\n\t\t\tthis.last_mouse_move = Date.now();\n\t\t\tif (this.cursor !== \"default\" && this.cursor_visibility === \"auto\") {\n\t\t\t\tthis.cursor = \"default\";\n\t\t\t\tthis.canvas.style.cursor = \"default\";\n\t\t\t}\n\t\t});\n\n\t\t// When the context is lost and then restored, base transform needs to be reinstated\n\t\tthis.canvas.addEventListener(\"contextrestored\", () => {\n\t\t\tthis.initContext();\n\t\t});\n\n\t\tsetInterval(() => this.checkMouseCursor(), 1000);\n\t\tthis.cursor_visibility = \"auto\";\n\t}\n\n\tprotected initContext(): void {\n\t\tconst ctx = this.canvas.getContext(\"2d\", {\n\t\t\talpha: false,\n\t\t});\n\t\tif (!ctx) {\n\t\t\tconst diagnostic = createDiagnostic(APIErrorCode.E7001);\n\t\t\tconst formatted = formatForBrowser(diagnostic);\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7001, {});\n\n\t\t\tthrow new Error(formatted);\n\t\t}\n\n\t\tif (ctx !== this.context) {\n\t\t\tthis.context = ctx;\n\t\t} else {\n\t\t\tthis.context.restore();\n\t\t}\n\n\t\tthis.context.save();\n\t\tthis.context.translate(this.canvas.width / 2, this.canvas.height / 2);\n\n\t\t// Calculate ratio: Math.min(canvas.width/200, canvas.height/200)\n\t\tconst ratio = Math.min(this.canvas.width / 200, this.canvas.height / 200);\n\t\tthis.context.scale(ratio, ratio);\n\n\t\t// Set logical width/height\n\t\tthis.width = this.canvas.width / ratio;\n\t\tthis.height = this.canvas.height / ratio;\n\t\tthis.context.lineCap = \"round\";\n\t}\n\n\t/**\n\t * Initialize draw state (called before each draw frame)\n\t */\n\tinitDraw(): void {\n\t\tthis.alpha = 1;\n\t\tthis.line_width = 1;\n\t\t// Note: Supersampling not implemented in l8b\n\t\t// If needed, add: if (this.supersampling != this.previous_supersampling) { this.resize(); this.previous_supersampling = this.supersampling; }\n\t}\n\n\t/**\n\t * Update interface dimensions (called before each draw frame)\n\t */\n\tupdateInterface(): void {\n\t\t// Update interface cache if it exists\n\t\tif (this.interfaceCache) {\n\t\t\tthis.interfaceCache.width = this.width;\n\t\t\tthis.interfaceCache.height = this.height;\n\t\t}\n\t}\n\n\tclear(color?: string): void {\n\t\tthis.context.globalAlpha = 1;\n\t\tthis.context.globalCompositeOperation = \"source-over\";\n\t\tthis.context.fillStyle = color || \"#000\";\n\t\tthis.context.strokeStyle = color || \"#000\";\n\t\tthis.context.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n\t\tthis.zBuffer.clear();\n\t}\n\n\tsetColor(color: string | number): void {\n\t\tif (!color) return;\n\n\t\tif (!Number.isNaN(Number.parseInt(String(color)))) {\n\t\t\tconst num = Number.parseInt(String(color));\n\t\t\tconst r = ((Math.floor(num / 100) % 10) / 9) * 255;\n\t\t\tconst g = ((Math.floor(num / 10) % 10) / 9) * 255;\n\t\t\tconst b = ((num % 10) / 9) * 255;\n\t\t\tconst c = 0xff000000 + (r << 16) + (g << 8) + b;\n\t\t\tconst hex = \"#\" + c.toString(16).substring(2, 8);\n\t\t\tthis.context.fillStyle = hex;\n\t\t\tthis.context.strokeStyle = hex;\n\t\t} else if (typeof color === \"string\") {\n\t\t\t// Validate color format\n\t\t\tconst isValidColor =\n\t\t\t\t/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(color) ||\n\t\t\t\t/^rgb\\(|^rgba\\(|^hsl\\(|^hsla\\(/.test(color) ||\n\t\t\t\t/^(red|green|blue|yellow|cyan|magenta|black|white|gray|grey|orange|pink|purple|brown|transparent)$/i.test(color);\n\n\t\t\tif (!isValidColor) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7003, { color });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.context.fillStyle = color;\n\t\t\tthis.context.strokeStyle = color;\n\t\t}\n\t}\n\n\tsetAlpha(alpha: number): void {\n\t\tthis.alpha = alpha;\n\t}\n\n\tsetPixelated(pixelated: number): void {\n\t\tthis.pixelated = pixelated;\n\t}\n\n\tsetBlending(blending: string): void {\n\t\tconst blend = this.blending[blending || \"normal\"];\n\n\t\tif (!blend) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7007, { blendMode: blending });\n\t\t\t// Fallback to normal blend mode\n\t\t\tthis.context.globalCompositeOperation = \"source-over\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.globalCompositeOperation = blend as GlobalCompositeOperation;\n\t}\n\n\tsetLineWidth(width: number): void {\n\t\tthis.line_width = width;\n\t}\n\n\tsetLineDash(dash: number[] | null): void {\n\t\tif (!Array.isArray(dash)) {\n\t\t\tthis.context.setLineDash([]);\n\t\t} else {\n\t\t\tthis.context.setLineDash(dash);\n\t\t}\n\t}\n\n\tsetLinearGradient(x1: number, y1: number, x2: number, y2: number, c1: string, c2: string): void {\n\t\tconst grd = this.context.createLinearGradient(x1, -y1, x2, -y2);\n\t\tgrd.addColorStop(0, c1);\n\t\tgrd.addColorStop(1, c2);\n\t\tthis.context.fillStyle = grd;\n\t\tthis.context.strokeStyle = grd;\n\t}\n\n\tsetRadialGradient(x: number, y: number, radius: number, c1: string, c2: string): void {\n\t\tconst grd = this.context.createRadialGradient(x, -y, 0, x, -y, radius);\n\t\tgrd.addColorStop(0, c1);\n\t\tgrd.addColorStop(1, c2);\n\t\tthis.context.fillStyle = grd;\n\t\tthis.context.strokeStyle = grd;\n\t}\n\n\tsetFont(font: string): void {\n\t\tthis.font = font || \"Verdana\";\n\t\tthis.loadFont(this.font);\n\t}\n\n\tloadFont(font: string = \"BitCell\"): void {\n\t\tif (this.font_load_requested[font]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.font_load_requested[font] = true;\n\t\ttry {\n\t\t\tdocument.fonts?.load?.(`16pt ${font}`).catch(() => {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7006, { font });\n\t\t\t});\n\t\t} catch {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7006, { font });\n\t\t}\n\t}\n\n\tisFontReady(font: string = this.font): number {\n\t\tif (this.font_loaded[font]) {\n\t\t\treturn 1;\n\t\t}\n\n\t\ttry {\n\t\t\tconst ready = document.fonts?.check?.(`16pt ${font}`) ?? true;\n\t\t\tif (ready) {\n\t\t\t\tthis.font_loaded[font] = true;\n\t\t\t}\n\t\t\treturn ready ? 1 : 0;\n\t\t} catch {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tsetTranslation(tx: number, ty: number): void {\n\t\tthis.translation_x = isFinite(tx) ? tx : 0;\n\t\tthis.translation_y = isFinite(ty) ? ty : 0;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tsetScale(x: number, y: number): void {\n\t\tthis.scale_x = isFinite(x) && x !== 0 ? x : 1;\n\t\tthis.scale_y = isFinite(y) && y !== 0 ? y : 1;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tsetRotation(rotation: number): void {\n\t\tthis.rotation = isFinite(rotation) ? rotation : 0;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tprotected updateScreenTransform(): void {\n\t\tthis.screen_transform =\n\t\t\tthis.translation_x !== 0 ||\n\t\t\tthis.translation_y !== 0 ||\n\t\t\tthis.scale_x !== 1 ||\n\t\t\tthis.scale_y !== 1 ||\n\t\t\tthis.rotation !== 0;\n\t}\n\n\tsetDrawAnchor(ax: number, ay: number): void {\n\t\tthis.anchor_x = typeof ax === \"number\" ? ax : 0;\n\t\tthis.anchor_y = typeof ay === \"number\" ? ay : 0;\n\t}\n\n\tsetDrawRotation(rotation: number): void {\n\t\tthis.object_rotation = rotation;\n\t}\n\n\tsetDrawScale(x: number, y: number = x): void {\n\t\tthis.object_scale_x = x;\n\t\tthis.object_scale_y = y;\n\t}\n\n\tprotected initDrawOp(x: number, y: number, object_transform: boolean = true): boolean {\n\t\tlet res = false;\n\n\t\tif (this.screen_transform) {\n\t\t\tthis.context.save();\n\t\t\tres = true;\n\t\t\tthis.context.translate(this.translation_x, -this.translation_y);\n\t\t\tthis.context.scale(this.scale_x, this.scale_y);\n\t\t\tthis.context.rotate((-this.rotation / 180) * Math.PI);\n\t\t\tthis.context.translate(x, y);\n\t\t}\n\n\t\tif (object_transform && (this.object_rotation !== 0 || this.object_scale_x !== 1 || this.object_scale_y !== 1)) {\n\t\t\tif (!res) {\n\t\t\t\tthis.context.save();\n\t\t\t\tres = true;\n\t\t\t\tthis.context.translate(x, y);\n\t\t\t}\n\n\t\t\tif (this.object_rotation !== 0) {\n\t\t\t\tthis.context.rotate((-this.object_rotation / 180) * Math.PI);\n\t\t\t}\n\n\t\t\tif (this.object_scale_x !== 1 || this.object_scale_y !== 1) {\n\t\t\t\tthis.context.scale(this.object_scale_x, this.object_scale_y);\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tprotected closeDrawOp(): void {\n\t\tthis.context.restore();\n\t}\n\n\t/**\n\t * Check mouse cursor visibility\n\t * Auto-hides cursor after 4 seconds of inactivity\n\t */\n\tprotected checkMouseCursor(): void {\n\t\tif (Date.now() > this.last_mouse_move + 4000 && this.cursor_visibility === \"auto\") {\n\t\t\tif (this.cursor !== \"none\") {\n\t\t\t\tthis.cursor = \"none\";\n\t\t\t\tthis.canvas.style.cursor = \"none\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set cursor visibility\n\t */\n\tsetCursorVisible(visible: boolean): void {\n\t\tthis.cursor_visibility = visible ? \"default\" : \"none\";\n\t\tif (visible) {\n\t\t\tthis.cursor = \"default\";\n\t\t\tthis.canvas.style.cursor = \"default\";\n\t\t} else {\n\t\t\tthis.cursor = \"none\";\n\t\t\tthis.canvas.style.cursor = \"none\";\n\t\t}\n\t}\n\n\tgetCanvas(): HTMLCanvasElement {\n\t\treturn this.canvas;\n\t}\n\n\tgetContext(): CanvasRenderingContext2D {\n\t\treturn this.context;\n\t}\n\n\tresize(width?: number, height?: number): void {\n\t\tif (width && height) {\n\t\t\t// Validate dimensions\n\t\t\tif (width <= 0 || height <= 0 || !isFinite(width) || !isFinite(height)) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7002, { width, height });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.canvas.width = width;\n\t\t\tthis.canvas.height = height;\n\t\t\tthis.initContext();\n\t\t\tthis.zBuffer.resize(width, height);\n\t\t\t// Update interface cache immediately after resize\n\t\t\tthis.updateInterface();\n\t\t}\n\t}\n}\n","/**\n * TTRI - Textured Triangle Rendering (Software Rasterization)\n *\n * Based on TIC-80's ttri implementation for 3D-style graphics.\n * This is NOT a 3D engine - it's pure 2D pixel manipulation using Canvas 2D API.\n *\n * How it works:\n * 1. Use getImageData() to get pixel buffer\n * 2. Rasterize triangle pixel-by-pixel (barycentric coordinates)\n * 3. Interpolate UV texture coordinates (perspective-correct with 1/z)\n * 4. Sample texture and write to pixel buffer\n * 5. Use putImageData() to update canvas\n *\n * This is software rendering like Doom, Quake software mode, and PlayStation 1.\n * No WebGL, no GPU - just CPU pixel manipulation.\n */\n\nimport type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nexport interface Vec2 {\n\tx: number;\n\ty: number;\n}\n\nexport interface Vec3 {\n\tx: number;\n\ty: number;\n\tz: number;\n}\n\nexport interface TexVert {\n\tx: number;\n\ty: number;\n\tu: number;\n\tv: number;\n\tz: number;\n}\n\nexport type TextureSource = \"tiles\" | \"map\" | \"screen\";\n\nexport interface TriangleData {\n\tcontext: CanvasRenderingContext2D;\n\twidth: number;\n\theight: number;\n\truntime?: any;\n\tpixelated: boolean;\n}\n\n/**\n * Z-Buffer for depth testing\n */\nexport class ZBuffer {\n\tprivate buffer: Float32Array;\n\tprivate width: number;\n\tprivate height: number;\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.buffer = new Float32Array(width * height);\n\t}\n\n\tclear(): void {\n\t\tthis.buffer.fill(0);\n\t}\n\n\tget(x: number, y: number): number {\n\t\treturn this.buffer[y * this.width + x] || 0;\n\t}\n\n\tset(x: number, y: number, z: number): void {\n\t\tthis.buffer[y * this.width + x] = z;\n\t}\n\n\tresize(width: number, height: number): void {\n\t\tif (this.width !== width || this.height !== height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.buffer = new Float32Array(width * height);\n\t\t}\n\t}\n}\n\n/**\n * Edge function for triangle rasterization\n */\nfunction edgeFn(a: Vec2, b: Vec2, c: Vec2): number {\n\treturn (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/**\n * Get pixel from sprite/image\n */\nfunction getSpritePixel(\n\tsprite: Sprite | any,\n\tu: number,\n\tv: number,\n\truntime?: any,\n): {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta: number;\n} | null {\n\t// Resolve sprite canvas from object or runtime registry\n\tlet canvas: HTMLCanvasElement | null = null;\n\n\tif (sprite && typeof sprite === \"object\" && sprite.canvas) {\n\t\tcanvas = sprite.canvas;\n\t} else if (typeof sprite === \"string\" && runtime?.sprites) {\n\t\tconst spriteObj = runtime.sprites[sprite];\n\t\tif (spriteObj?.frames?.[0]?.canvas) {\n\t\t\tcanvas = spriteObj.frames[0].canvas;\n\t\t}\n\t}\n\n\tif (!canvas) return null;\n\n\t// Apply texture coordinate wrapping (repeat mode)\n\tconst width = canvas.width;\n\tconst height = canvas.height;\n\tconst x = Math.floor(u) % width;\n\tconst y = Math.floor(v) % height;\n\tconst px = x < 0 ? x + width : x;\n\tconst py = y < 0 ? y + height : y;\n\n\t// Sample pixel color from sprite canvas\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return null;\n\n\ttry {\n\t\tconst imageData = ctx.getImageData(px, py, 1, 1);\n\t\treturn {\n\t\t\tr: imageData.data[0],\n\t\t\tg: imageData.data[1],\n\t\t\tb: imageData.data[2],\n\t\t\ta: imageData.data[3],\n\t\t};\n\t} catch (e) {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get pixel from map\n */\nfunction getMapPixel(\n\tmap: Map | any,\n\tu: number,\n\tv: number,\n\truntime?: any,\n): {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta: number;\n} | null {\n\t// Get map object\n\tlet mapObj: any = null;\n\n\tif (map && typeof map === \"object\" && map.getCanvas) {\n\t\tmapObj = map;\n\t} else if (typeof map === \"string\" && runtime?.maps) {\n\t\tmapObj = runtime.maps[map];\n\t}\n\n\tif (!mapObj) return null;\n\n\t// Get canvas from map\n\tconst canvas = mapObj.getCanvas ? mapObj.getCanvas() : mapObj.canvas;\n\tif (!canvas) return null;\n\n\t// Wrap texture coordinates\n\tconst width = canvas.width;\n\tconst height = canvas.height;\n\tconst x = Math.floor(u) % width;\n\tconst y = Math.floor(v) % height;\n\tconst px = x < 0 ? x + width : x;\n\tconst py = y < 0 ? y + height : y;\n\n\t// Get pixel data\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return null;\n\n\ttry {\n\t\tconst imageData = ctx.getImageData(px, py, 1, 1);\n\t\treturn {\n\t\t\tr: imageData.data[0],\n\t\t\tg: imageData.data[1],\n\t\t\tb: imageData.data[2],\n\t\t\ta: imageData.data[3],\n\t\t};\n\t} catch (e) {\n\t\treturn null;\n\t}\n}\n\n/**\n * Draw textured triangle with perspective correction\n */\nexport function drawTexturedTriangle(\n\tdata: TriangleData,\n\tv0: TexVert,\n\tv1: TexVert,\n\tv2: TexVert,\n\ttexture: Sprite | Map | string | any,\n\ttextureSource: TextureSource = \"tiles\",\n\tzBuffer?: ZBuffer,\n\tuseDepth: boolean = false,\n): void {\n\tconst { context, width, height, runtime, pixelated } = data;\n\n\t// Get bounding box\n\tconst minX = Math.max(0, Math.floor(Math.min(v0.x, v1.x, v2.x)));\n\tconst minY = Math.max(0, Math.floor(Math.min(v0.y, v1.y, v2.y)));\n\tconst maxX = Math.min(width, Math.ceil(Math.max(v0.x, v1.x, v2.x)));\n\tconst maxY = Math.min(height, Math.ceil(Math.max(v0.y, v1.y, v2.y)));\n\n\tif (minX >= maxX || minY >= maxY) return;\n\n\t// Calculate triangle area\n\tconst area = edgeFn(v0, v1, v2);\n\tif (Math.abs(area) < 0.001) return;\n\n\t// Backface culling\n\tif (area < 0) return;\n\n\t// Prepare perspective-correct interpolation\n\tconst useZ = useDepth && v0.z > 0 && v1.z > 0 && v2.z > 0;\n\n\tlet w0 = 1,\n\t\tw1 = 1,\n\t\tw2 = 1;\n\tlet u0 = v0.u,\n\t\tu1 = v1.u,\n\t\tu2 = v2.u;\n\tlet v0v = v0.v,\n\t\tv1v = v1.v,\n\t\tv2v = v2.v;\n\n\tif (useZ) {\n\t\tw0 = 1 / v0.z;\n\t\tw1 = 1 / v1.z;\n\t\tw2 = 1 / v2.z;\n\t\tu0 *= w0;\n\t\tu1 *= w1;\n\t\tu2 *= w2;\n\t\tv0v *= w0;\n\t\tv1v *= w1;\n\t\tv2v *= w2;\n\t}\n\n\t// Get image data for fast pixel manipulation\n\tconst imageData = context.getImageData(minX, minY, maxX - minX, maxY - minY);\n\tconst pixels = imageData.data;\n\n\t// Rasterize\n\tfor (let y = minY; y < maxY; y++) {\n\t\tfor (let x = minX; x < maxX; x++) {\n\t\t\tconst p = {\n\t\t\t\tx: x + 0.5,\n\t\t\t\ty: y + 0.5,\n\t\t\t};\n\n\t\t\t// Calculate barycentric coordinates\n\t\t\tconst w0b = edgeFn(v1, v2, p);\n\t\t\tconst w1b = edgeFn(v2, v0, p);\n\t\t\tconst w2b = edgeFn(v0, v1, p);\n\n\t\t\t// Check if point is inside triangle\n\t\t\tif (w0b >= 0 && w1b >= 0 && w2b >= 0) {\n\t\t\t\t// Normalize barycentric coordinates\n\t\t\t\tconst bary0 = w0b / area;\n\t\t\t\tconst bary1 = w1b / area;\n\t\t\t\tconst bary2 = w2b / area;\n\n\t\t\t\t// Depth test\n\t\t\t\tif (useZ && zBuffer) {\n\t\t\t\t\tconst z = bary0 * v0.z + bary1 * v1.z + bary2 * v2.z;\n\t\t\t\t\tconst currentZ = zBuffer.get(x, y);\n\t\t\t\t\tif (currentZ > 0 && currentZ >= z) continue;\n\t\t\t\t\tzBuffer.set(x, y, z);\n\t\t\t\t}\n\n\t\t\t\t// Interpolate texture coordinates\n\t\t\t\tlet u: number, v: number;\n\n\t\t\t\tif (useZ) {\n\t\t\t\t\tconst w = bary0 * w0 + bary1 * w1 + bary2 * w2;\n\t\t\t\t\tu = (bary0 * u0 + bary1 * u1 + bary2 * u2) / w;\n\t\t\t\t\tv = (bary0 * v0v + bary1 * v1v + bary2 * v2v) / w;\n\t\t\t\t} else {\n\t\t\t\t\tu = bary0 * v0.u + bary1 * v1.u + bary2 * v2.u;\n\t\t\t\t\tv = bary0 * v0.v + bary1 * v1.v + bary2 * v2.v;\n\t\t\t\t}\n\n\t\t\t\t// Sample texture\n\t\t\t\tlet pixel: {\n\t\t\t\t\tr: number;\n\t\t\t\t\tg: number;\n\t\t\t\t\tb: number;\n\t\t\t\t\ta: number;\n\t\t\t\t} | null = null;\n\n\t\t\t\tif (textureSource === \"map\") {\n\t\t\t\t\tpixel = getMapPixel(texture, u, v, runtime);\n\t\t\t\t} else {\n\t\t\t\t\tpixel = getSpritePixel(texture, u, v, runtime);\n\t\t\t\t}\n\n\t\t\t\t// Draw pixel\n\t\t\t\tif (pixel && pixel.a > 0) {\n\t\t\t\t\tconst idx = ((y - minY) * (maxX - minX) + (x - minX)) * 4;\n\t\t\t\t\tpixels[idx] = pixel.r;\n\t\t\t\t\tpixels[idx + 1] = pixel.g;\n\t\t\t\t\tpixels[idx + 2] = pixel.b;\n\t\t\t\t\tpixels[idx + 3] = pixel.a;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Put image data back\n\tcontext.imageSmoothingEnabled = !pixelated;\n\tcontext.putImageData(imageData, minX, minY);\n}\n\n/**\n * Draw solid color triangle\n */\nexport function drawTriangle(context: CanvasRenderingContext2D, v0: Vec2, v1: Vec2, v2: Vec2, color: string): void {\n\tcontext.fillStyle = color;\n\tcontext.beginPath();\n\tcontext.moveTo(v0.x, v0.y);\n\tcontext.lineTo(v1.x, v1.y);\n\tcontext.lineTo(v2.x, v2.y);\n\tcontext.closePath();\n\tcontext.fill();\n}\n\n/**\n * Draw triangle outline\n */\nexport function drawTriangleOutline(\n\tcontext: CanvasRenderingContext2D,\n\tv0: Vec2,\n\tv1: Vec2,\n\tv2: Vec2,\n\tcolor: string,\n\tlineWidth: number = 1,\n): void {\n\tcontext.strokeStyle = color;\n\tcontext.lineWidth = lineWidth;\n\tcontext.beginPath();\n\tcontext.moveTo(v0.x, v0.y);\n\tcontext.lineTo(v1.x, v1.y);\n\tcontext.lineTo(v2.x, v2.y);\n\tcontext.closePath();\n\tcontext.stroke();\n}\n","import { SpriteScreen } from \"./sprite-screen\";\n\nexport class TextScreen extends SpriteScreen {\n\t// Font string cache — avoid rebuilding template string every draw call\n\tprivate _cachedFontSize = -1;\n\tprivate _cachedFontName = \"\";\n\tprivate _cachedFontString = \"\";\n\n\tprivate getFontString(size: number): string {\n\t\tif (size !== this._cachedFontSize || this.font !== this._cachedFontName) {\n\t\t\tthis._cachedFontSize = size;\n\t\t\tthis._cachedFontName = this.font;\n\t\t\tthis._cachedFontString = `${size}pt ${this.font}`;\n\t\t}\n\t\treturn this._cachedFontString;\n\t}\n\n\ttextWidth(text: string, size: number): number {\n\t\tthis.context.font = this.getFontString(size);\n\t\treturn this.context.measureText(text).width;\n\t}\n\n\tdrawText(text: string, x: number, y: number, size: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.font = this.getFontString(size);\n\t\tthis.context.textAlign = \"center\";\n\t\tthis.context.textBaseline = \"middle\";\n\t\tconst w = this.context.measureText(text).width;\n\t\tconst h = size;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.fillText(text, 0 - (this.anchor_x * w) / 2, 0 + (this.anchor_y * h) / 2);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.fillText(text, x - (this.anchor_x * w) / 2, -y + (this.anchor_y * h) / 2);\n\t\t}\n\t}\n\n\tdrawTextOutline(text: string, x: number, y: number, size: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.font = this.getFontString(size);\n\t\tthis.context.lineWidth = this.line_width;\n\t\tthis.context.textAlign = \"center\";\n\t\tthis.context.textBaseline = \"middle\";\n\t\tconst w = this.context.measureText(text).width;\n\t\tconst h = size;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.strokeText(text, 0 - (this.anchor_x * w) / 2, 0 + (this.anchor_y * h) / 2);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.strokeText(text, x - (this.anchor_x * w) / 2, -y + (this.anchor_y * h) / 2);\n\t\t}\n\t}\n}\n","import type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nimport { TextScreen } from \"../drawing/text-screen\";\nimport { drawTexturedTriangle, drawTriangle, drawTriangleOutline, type TextureSource, type TriangleData } from \"./ttri\";\n\nexport class TriangleScreen extends TextScreen {\n\ttri(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst v0 = {\n\t\t\tx: x1,\n\t\t\ty: -y1,\n\t\t};\n\t\tconst v1 = {\n\t\t\tx: x2,\n\t\t\ty: -y2,\n\t\t};\n\t\tconst v2 = {\n\t\t\tx: x3,\n\t\t\ty: -y3,\n\t\t};\n\n\t\tdrawTriangle(this.context, v0, v1, v2, this.context.fillStyle as string);\n\t}\n\n\ttrib(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst v0 = {\n\t\t\tx: x1,\n\t\t\ty: -y1,\n\t\t};\n\t\tconst v1 = {\n\t\t\tx: x2,\n\t\t\ty: -y2,\n\t\t};\n\t\tconst v2 = {\n\t\t\tx: x3,\n\t\t\ty: -y3,\n\t\t};\n\n\t\tdrawTriangleOutline(this.context, v0, v1, v2, this.context.strokeStyle as string, this.line_width);\n\t}\n\n\tttri(\n\t\tx1: number,\n\t\ty1: number,\n\t\tx2: number,\n\t\ty2: number,\n\t\tx3: number,\n\t\ty3: number,\n\t\tu1: number,\n\t\tv1: number,\n\t\tu2: number,\n\t\tv2: number,\n\t\tu3: number,\n\t\tv3: number,\n\t\ttexture: Sprite | Map | string,\n\t\ttextureSource: TextureSource = \"tiles\",\n\t\tz1: number = 1,\n\t\tz2: number = 1,\n\t\tz3: number = 1,\n\t\tuseDepth: boolean = false,\n\t): void {\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst canvasWidth = this.canvas.width;\n\t\tconst canvasHeight = this.canvas.height;\n\t\tconst ratio = Math.min(canvasWidth / 200, canvasHeight / 200);\n\n\t\tconst toCanvasX = (x: number) => canvasWidth / 2 + x * ratio;\n\t\tconst toCanvasY = (y: number) => canvasHeight / 2 - y * ratio;\n\n\t\tconst data: TriangleData = {\n\t\t\tcontext: this.context,\n\t\t\twidth: canvasWidth,\n\t\t\theight: canvasHeight,\n\t\t\truntime: this.runtime,\n\t\t\tpixelated: this.pixelated === 1,\n\t\t};\n\n\t\tdrawTexturedTriangle(\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tx: toCanvasX(x1),\n\t\t\t\ty: toCanvasY(y1),\n\t\t\t\tu: u1,\n\t\t\t\tv: v1,\n\t\t\t\tz: z1,\n\t\t\t},\n\t\t\t{\n\t\t\t\tx: toCanvasX(x2),\n\t\t\t\ty: toCanvasY(y2),\n\t\t\t\tu: u2,\n\t\t\t\tv: v2,\n\t\t\t\tz: z2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tx: toCanvasX(x3),\n\t\t\t\ty: toCanvasY(y3),\n\t\t\t\tu: u3,\n\t\t\t\tv: v3,\n\t\t\t\tz: z3,\n\t\t\t},\n\t\t\ttexture,\n\t\t\ttextureSource,\n\t\t\tthis.zBuffer,\n\t\t\tuseDepth,\n\t\t);\n\t}\n}\n","import type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\nimport type { TextureSource } from \"../tri\";\nimport { TriangleScreen } from \"../tri/triangle-screen\";\nimport type { ScreenInterface } from \"../types\";\n\nexport class Screen extends TriangleScreen {\n\tgetInterface(): ScreenInterface {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\n\t\tconst screen = this;\n\t\tthis.interfaceCache = {\n\t\t\twidth: screen.width,\n\t\t\theight: screen.height,\n\t\t\tclear: (color?: string) => screen.clear(color),\n\t\t\tsetColor: (color: string | number) => screen.setColor(color),\n\t\t\tsetAlpha: (alpha: number) => screen.setAlpha(alpha),\n\t\t\tsetPixelated: (pixelated: number) => screen.setPixelated(pixelated),\n\t\t\tsetBlending: (blending: string) => screen.setBlending(blending),\n\t\t\tsetLinearGradient: (x1: number, y1: number, x2: number, y2: number, c1: string, c2: string) =>\n\t\t\t\tscreen.setLinearGradient(x1, y1, x2, y2, c1, c2),\n\t\t\tsetRadialGradient: (x: number, y: number, radius: number, c1: string, c2: string) =>\n\t\t\t\tscreen.setRadialGradient(x, y, radius, c1, c2),\n\t\t\tsetFont: (font: string) => screen.setFont(font),\n\t\t\tsetTranslation: (tx: number, ty: number) => screen.setTranslation(tx, ty),\n\t\t\tsetScale: (x: number, y: number) => screen.setScale(x, y),\n\t\t\tsetRotation: (rotation: number) => screen.setRotation(rotation),\n\t\t\tsetDrawAnchor: (ax: number, ay: number) => screen.setDrawAnchor(ax, ay),\n\t\t\tsetDrawRotation: (rotation: number) => screen.setDrawRotation(rotation),\n\t\t\tsetDrawScale: (x: number, y?: number) => screen.setDrawScale(x, y),\n\t\t\tfillRect: (x: number, y: number, w: number, h: number, c?: string | number) => screen.fillRect(x, y, w, h, c),\n\t\t\tfillRoundRect: (x: number, y: number, w: number, h: number, r?: number, c?: string | number) =>\n\t\t\t\tscreen.fillRoundRect(x, y, w, h, r, c),\n\t\t\tfillRound: (x: number, y: number, w: number, h: number, c?: string | number) => screen.fillRound(x, y, w, h, c),\n\t\t\tdrawRect: (x: number, y: number, w: number, h: number, c?: string | number) => screen.drawRect(x, y, w, h, c),\n\t\t\tdrawRoundRect: (x: number, y: number, w: number, h: number, r?: number, c?: string | number) =>\n\t\t\t\tscreen.drawRoundRect(x, y, w, h, r, c),\n\t\t\tdrawRound: (x: number, y: number, w: number, h: number, c?: string | number) => screen.drawRound(x, y, w, h, c),\n\t\t\tdrawSprite: (sprite: Sprite | string, x: number, y: number, w?: number, h?: number) =>\n\t\t\t\tscreen.drawSprite(sprite, x, y, w, h),\n\t\t\tdrawSpritePart: (\n\t\t\t\tsprite: Sprite | string,\n\t\t\t\tsx: number,\n\t\t\t\tsy: number,\n\t\t\t\tsw: number,\n\t\t\t\tsh: number,\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tw?: number,\n\t\t\t\th?: number,\n\t\t\t) => screen.drawSpritePart(sprite, sx, sy, sw, sh, x, y, w, h),\n\t\t\tdrawMap: (map: Map | string, x: number, y: number, w: number, h: number) => screen.drawMap(map, x, y, w, h),\n\t\t\tdrawText: (text: string, x: number, y: number, size: number, color?: string | number) =>\n\t\t\t\tscreen.drawText(text, x, y, size, color),\n\t\t\tdrawTextOutline: (text: string, x: number, y: number, size: number, color?: string | number) =>\n\t\t\t\tscreen.drawTextOutline(text, x, y, size, color),\n\t\t\ttextWidth: (text: string, size: number) => screen.textWidth(text, size),\n\t\t\tsetLineWidth: (width: number) => screen.setLineWidth(width),\n\t\t\tsetLineDash: (dash: number[] | null) => screen.setLineDash(dash),\n\t\t\tdrawLine: (x1: number, y1: number, x2: number, y2: number, color?: string | number) =>\n\t\t\t\tscreen.drawLine(x1, y1, x2, y2, color),\n\t\t\tdrawPolygon: (...args: any[]) => screen.drawPolygon(args),\n\t\t\tdrawPolyline: (...args: any[]) => screen.drawPolyline(args),\n\t\t\tfillPolygon: (...args: any[]) => screen.fillPolygon(args),\n\t\t\tdrawQuadCurve: (...args: any[]) => screen.drawQuadCurve(args),\n\t\t\tdrawBezierCurve: (...args: any[]) => screen.drawBezierCurve(args),\n\t\t\tdrawArc: (\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tradius: number,\n\t\t\t\tangle1: number,\n\t\t\t\tangle2: number,\n\t\t\t\tccw: boolean,\n\t\t\t\tcolor?: string | number,\n\t\t\t) => screen.drawArc(x, y, radius, angle1, angle2, ccw, color),\n\t\t\tfillArc: (\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tradius: number,\n\t\t\t\tangle1: number,\n\t\t\t\tangle2: number,\n\t\t\t\tccw: boolean,\n\t\t\t\tcolor?: string | number,\n\t\t\t) => screen.fillArc(x, y, radius, angle1, angle2, ccw, color),\n\t\t\tsetCursorVisible: (visible: boolean) => screen.setCursorVisible(visible),\n\t\t\tloadFont: (font: string) => screen.loadFont(font),\n\t\t\tisFontReady: (font?: string) => screen.isFontReady(font),\n\t\t\ttri: (x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number) =>\n\t\t\t\tscreen.tri(x1, y1, x2, y2, x3, y3, color),\n\t\t\ttrib: (x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number) =>\n\t\t\t\tscreen.trib(x1, y1, x2, y2, x3, y3, color),\n\t\t\tttri: (\n\t\t\t\tx1: number,\n\t\t\t\ty1: number,\n\t\t\t\tx2: number,\n\t\t\t\ty2: number,\n\t\t\t\tx3: number,\n\t\t\t\ty3: number,\n\t\t\t\tu1: number,\n\t\t\t\tv1: number,\n\t\t\t\tu2: number,\n\t\t\t\tv2: number,\n\t\t\t\tu3: number,\n\t\t\t\tv3: number,\n\t\t\t\ttexture: Sprite | Map | string,\n\t\t\t\ttextureSource?: TextureSource,\n\t\t\t\tz1?: number,\n\t\t\t\tz2?: number,\n\t\t\t\tz3?: number,\n\t\t\t\tuseDepth?: boolean,\n\t\t\t) => screen.ttri(x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3, texture, textureSource, z1, z2, z3, useDepth),\n\t\t};\n\n\t\treturn this.interfaceCache;\n\t}\n}\n\nexport default Screen;\n"],"mappings":"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","names":["import_diagnostics","import_diagnostics","ZBuffer","buffer","width","height","Float32Array","clear","fill","get","x","y","set","z","resize","edgeFn","a","b","c","getSpritePixel","sprite","u","v","runtime","canvas","sprites","spriteObj","frames","Math","floor","px","py","ctx","getContext","imageData","getImageData","r","data","g","e","getMapPixel","map","mapObj","getCanvas","maps","drawTexturedTriangle","v0","v1","v2","texture","textureSource","zBuffer","useDepth","context","pixelated","minX","max","min","minY","maxX","ceil","maxY","area","abs","useZ","w0","w1","w2","u0","u1","u2","v0v","v1v","v2v","pixels","p","w0b","w1b","w2b","bary0","bary1","bary2","currentZ","w","pixel","idx","imageSmoothingEnabled","putImageData","drawTriangle","color","fillStyle","beginPath","moveTo","lineTo","closePath","drawTriangleOutline","lineWidth","strokeStyle","stroke","BaseScreen","canvas","context","runtime","width","height","alpha","pixelated","line_width","font","translation_x","translation_y","rotation","scale_x","scale_y","screen_transform","object_rotation","object_scale_x","object_scale_y","anchor_x","anchor_y","blending","font_load_requested","font_loaded","interfaceCache","cursor","cursor_visibility","last_mouse_move","Date","now","zBuffer","options","document","createElement","initContext","normal","additive","blendModes","mode","loadFont","ZBuffer","addEventListener","style","setInterval","checkMouseCursor","ctx","getContext","diagnostic","createDiagnostic","APIErrorCode","E7001","formatted","formatForBrowser","reportRuntimeError","listener","Error","restore","save","translate","ratio","Math","min","scale","lineCap","initDraw","updateInterface","clear","color","globalAlpha","globalCompositeOperation","fillStyle","strokeStyle","fillRect","setColor","Number","isNaN","parseInt","String","num","r","floor","g","b","c","hex","toString","substring","isValidColor","test","E7003","setAlpha","setPixelated","setBlending","blend","E7007","blendMode","setLineWidth","setLineDash","dash","Array","isArray","setLinearGradient","x1","y1","x2","y2","c1","c2","grd","createLinearGradient","addColorStop","setRadialGradient","x","y","radius","createRadialGradient","setFont","fonts","load","catch","E7006","isFontReady","ready","check","setTranslation","tx","ty","isFinite","updateScreenTransform","setScale","setRotation","setDrawAnchor","ax","ay","setDrawRotation","setDrawScale","initDrawOp","object_transform","res","rotate","PI","closeDrawOp","setCursorVisible","visible","getCanvas","resize","E7002","PrimitiveScreen","BaseScreen","fillRect","x","y","w","h","color","context","reportRuntimeError","runtime","listener","APIErrorCode","E7092","isFinite","E7093","error","setColor","globalAlpha","alpha","initDrawOp","anchor_x","anchor_y","closeDrawOp","fillRoundRect","round","transform","rx","ry","beginPath","roundRect","r","Math","min","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillRound","abs","ellipse","PI","drawRect","lineWidth","line_width","strokeRect","drawRoundRect","stroke","drawRound","drawLine","x1","y1","x2","y2","drawPolygon","args","points","extractPoints","length","len","floor","i","drawPolyline","fillPolygon","drawQuadCurve","index","drawBezierCurve","bezierCurveTo","drawArc","radius","angle1","angle2","ccw","arc","fillArc","slice","Array","isArray","SpriteScreen","PrimitiveScreen","_lastImageSmoothing","_frameTime","initDraw","performance","now","setImageSmoothing","smooth","pixelated","context","imageSmoothingEnabled","getSpriteFrame","sprite","frame","spriteName","spriteObj","runtime","sprites","parts","split","length","Number","parseInt","reportRuntimeError","listener","APIErrorCode","E7004","canvas","frames","image","ready","E7005","animation_start","dt","fps","Math","floor","drawSprite","x","y","w","h","width","height","screen_transform","object_rotation","object_scale_x","object_scale_y","drawX","anchor_x","drawY","anchor_y","halfW","halfH","globalAlpha","alpha","initDrawOp","drawImage","closeDrawOp","drawSpritePart","sx","sy","sw","sh","drawMap","map","mapObj","maps","draw","TextScreen","SpriteScreen","_cachedFontSize","_cachedFontName","_cachedFontString","getFontString","size","font","textWidth","text","context","measureText","width","drawText","x","y","color","setColor","globalAlpha","alpha","textAlign","textBaseline","w","h","initDrawOp","fillText","anchor_x","anchor_y","closeDrawOp","drawTextOutline","lineWidth","line_width","strokeText","TriangleScreen","TextScreen","tri","x1","y1","x2","y2","x3","y3","color","setColor","context","globalAlpha","alpha","v0","x","y","v1","v2","drawTriangle","fillStyle","trib","drawTriangleOutline","strokeStyle","line_width","ttri","u1","u2","u3","v3","texture","textureSource","z1","z2","z3","useDepth","canvasWidth","canvas","width","canvasHeight","height","ratio","Math","min","toCanvasX","toCanvasY","data","runtime","pixelated","drawTexturedTriangle","u","v","z","zBuffer","Screen","TriangleScreen","getInterface","interfaceCache","screen","width","height","clear","color","setColor","setAlpha","alpha","setPixelated","pixelated","setBlending","blending","setLinearGradient","x1","y1","x2","y2","c1","c2","setRadialGradient","x","y","radius","setFont","font","setTranslation","tx","ty","setScale","setRotation","rotation","setDrawAnchor","ax","ay","setDrawRotation","setDrawScale","fillRect","w","h","c","fillRoundRect","r","fillRound","drawRect","drawRoundRect","drawRound","drawSprite","sprite","drawSpritePart","sx","sy","sw","sh","drawMap","map","drawText","text","size","drawTextOutline","textWidth","setLineWidth","setLineDash","dash","drawLine","drawPolygon","args","drawPolyline","fillPolygon","drawQuadCurve","drawBezierCurve","drawArc","angle1","angle2","ccw","fillArc","setCursorVisible","visible","loadFont","isFontReady","tri","x3","y3","trib","ttri","u1","v1","u2","v2","u3","v3","texture","textureSource","z1","z2","z3","useDepth"]}
|