@pixagram/renderart 0.1.3 → 0.2.1
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 +92 -142
- package/dist/index.d.mts +33 -49
- package/dist/index.d.ts +33 -49
- package/dist/index.js +194 -915
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +190 -914
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -22
- package/dist/wasm/renderart_wasm.d.ts +0 -289
- package/dist/wasm/renderart_wasm.js +0 -893
- package/dist/wasm/renderart_wasm_bg.wasm +0 -0
- package/dist/wasm/renderart_wasm_bg.wasm.d.ts +0 -70
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../pkg/renderart_wasm.js","../src/crt-gpu.ts","../src/hex-gpu.ts","../src/wasm-loader.ts","../src/renderart.ts"],"names":["ptr","VERTEX_SHADER","FRAGMENT_SHADER","wasm"],"mappings":"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","file":"index.mjs","sourcesContent":["let wasm;\n\nfunction _assertClass(instance, klass) {\n if (!(instance instanceof klass)) {\n throw new Error(`expected instance of ${klass.name}`);\n }\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint32ArrayMemory0 = null;\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n }\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst CrtConfigFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_crtconfig_free(ptr >>> 0, 1));\n\nconst HexConfigFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_hexconfig_free(ptr >>> 0, 1));\n\nconst UpscaleResultFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_upscaleresult_free(ptr >>> 0, 1));\n\nconst XbrzConfigFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_xbrzconfig_free(ptr >>> 0, 1));\n\n/**\n * CRT configuration options\n */\nexport class CrtConfig {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(CrtConfig.prototype);\n obj.__wbg_ptr = ptr;\n CrtConfigFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n CrtConfigFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_crtconfig_free(ptr, 0);\n }\n /**\n * Horizontal warp intensity (0.0 - 0.1)\n * @returns {number}\n */\n get warp_x() {\n const ret = wasm.__wbg_get_crtconfig_warp_x(this.__wbg_ptr);\n return ret;\n }\n /**\n * Horizontal warp intensity (0.0 - 0.1)\n * @param {number} arg0\n */\n set warp_x(arg0) {\n wasm.__wbg_set_crtconfig_warp_x(this.__wbg_ptr, arg0);\n }\n /**\n * Vertical warp intensity (0.0 - 0.1)\n * @returns {number}\n */\n get warp_y() {\n const ret = wasm.__wbg_get_crtconfig_warp_y(this.__wbg_ptr);\n return ret;\n }\n /**\n * Vertical warp intensity (0.0 - 0.1)\n * @param {number} arg0\n */\n set warp_y(arg0) {\n wasm.__wbg_set_crtconfig_warp_y(this.__wbg_ptr, arg0);\n }\n /**\n * Scanline hardness (-10.0 to 0.0, more negative = sharper)\n * @returns {number}\n */\n get scan_hardness() {\n const ret = wasm.__wbg_get_crtconfig_scan_hardness(this.__wbg_ptr);\n return ret;\n }\n /**\n * Scanline hardness (-10.0 to 0.0, more negative = sharper)\n * @param {number} arg0\n */\n set scan_hardness(arg0) {\n wasm.__wbg_set_crtconfig_scan_hardness(this.__wbg_ptr, arg0);\n }\n /**\n * Scanline opacity (0.0 - 1.0)\n * @returns {number}\n */\n get scan_opacity() {\n const ret = wasm.__wbg_get_crtconfig_scan_opacity(this.__wbg_ptr);\n return ret;\n }\n /**\n * Scanline opacity (0.0 - 1.0)\n * @param {number} arg0\n */\n set scan_opacity(arg0) {\n wasm.__wbg_set_crtconfig_scan_opacity(this.__wbg_ptr, arg0);\n }\n /**\n * Shadow mask opacity (0.0 - 1.0)\n * @returns {number}\n */\n get mask_opacity() {\n const ret = wasm.__wbg_get_crtconfig_mask_opacity(this.__wbg_ptr);\n return ret;\n }\n /**\n * Shadow mask opacity (0.0 - 1.0)\n * @param {number} arg0\n */\n set mask_opacity(arg0) {\n wasm.__wbg_set_crtconfig_mask_opacity(this.__wbg_ptr, arg0);\n }\n /**\n * Enable barrel distortion\n * @returns {boolean}\n */\n get enable_warp() {\n const ret = wasm.__wbg_get_crtconfig_enable_warp(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Enable barrel distortion\n * @param {boolean} arg0\n */\n set enable_warp(arg0) {\n wasm.__wbg_set_crtconfig_enable_warp(this.__wbg_ptr, arg0);\n }\n /**\n * Enable scanlines\n * @returns {boolean}\n */\n get enable_scanlines() {\n const ret = wasm.__wbg_get_crtconfig_enable_scanlines(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Enable scanlines\n * @param {boolean} arg0\n */\n set enable_scanlines(arg0) {\n wasm.__wbg_set_crtconfig_enable_scanlines(this.__wbg_ptr, arg0);\n }\n /**\n * Enable shadow mask\n * @returns {boolean}\n */\n get enable_mask() {\n const ret = wasm.__wbg_get_crtconfig_enable_mask(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Enable shadow mask\n * @param {boolean} arg0\n */\n set enable_mask(arg0) {\n wasm.__wbg_set_crtconfig_enable_mask(this.__wbg_ptr, arg0);\n }\n constructor() {\n const ret = wasm.crtconfig_new();\n this.__wbg_ptr = ret >>> 0;\n CrtConfigFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * Create preset: Authentic CRT look\n * @returns {CrtConfig}\n */\n static preset_authentic() {\n const ret = wasm.crtconfig_preset_authentic();\n return CrtConfig.__wrap(ret);\n }\n /**\n * Create preset: Subtle modern look\n * @returns {CrtConfig}\n */\n static preset_subtle() {\n const ret = wasm.crtconfig_preset_subtle();\n return CrtConfig.__wrap(ret);\n }\n /**\n * Create preset: Flat screen (no curvature)\n * @returns {CrtConfig}\n */\n static preset_flat() {\n const ret = wasm.crtconfig_preset_flat();\n return CrtConfig.__wrap(ret);\n }\n}\nif (Symbol.dispose) CrtConfig.prototype[Symbol.dispose] = CrtConfig.prototype.free;\n\n/**\n * Configuration for hexagonal upscaling\n */\nexport class HexConfig {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(HexConfig.prototype);\n obj.__wbg_ptr = ptr;\n HexConfigFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n HexConfigFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_hexconfig_free(ptr, 0);\n }\n /**\n * Hexagon orientation\n * @returns {HexOrientation}\n */\n get orientation() {\n const ret = wasm.__wbg_get_hexconfig_orientation(this.__wbg_ptr);\n return ret;\n }\n /**\n * Hexagon orientation\n * @param {HexOrientation} arg0\n */\n set orientation(arg0) {\n wasm.__wbg_set_hexconfig_orientation(this.__wbg_ptr, arg0);\n }\n /**\n * Draw hexagon borders\n * @returns {boolean}\n */\n get draw_borders() {\n const ret = wasm.__wbg_get_hexconfig_draw_borders(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Draw hexagon borders\n * @param {boolean} arg0\n */\n set draw_borders(arg0) {\n wasm.__wbg_set_hexconfig_draw_borders(this.__wbg_ptr, arg0);\n }\n /**\n * Border color (RGBA packed as u32: 0xRRGGBBAA)\n * @returns {number}\n */\n get border_color() {\n const ret = wasm.__wbg_get_hexconfig_border_color(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Border color (RGBA packed as u32: 0xRRGGBBAA)\n * @param {number} arg0\n */\n set border_color(arg0) {\n wasm.__wbg_set_hexconfig_border_color(this.__wbg_ptr, arg0);\n }\n /**\n * Border thickness in pixels\n * @returns {number}\n */\n get border_thickness() {\n const ret = wasm.__wbg_get_hexconfig_border_thickness(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Border thickness in pixels\n * @param {number} arg0\n */\n set border_thickness(arg0) {\n wasm.__wbg_set_hexconfig_border_thickness(this.__wbg_ptr, arg0);\n }\n /**\n * Background color (RGBA packed as u32)\n * @returns {number}\n */\n get background_color() {\n const ret = wasm.__wbg_get_hexconfig_background_color(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Background color (RGBA packed as u32)\n * @param {number} arg0\n */\n set background_color(arg0) {\n wasm.__wbg_set_hexconfig_background_color(this.__wbg_ptr, arg0);\n }\n constructor() {\n const ret = wasm.hexconfig_new();\n this.__wbg_ptr = ret >>> 0;\n HexConfigFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * Create preset with borders\n * @returns {HexConfig}\n */\n static preset_bordered() {\n const ret = wasm.hexconfig_preset_bordered();\n return HexConfig.__wrap(ret);\n }\n /**\n * Create preset for pointy-top hexagons\n * @returns {HexConfig}\n */\n static preset_pointy() {\n const ret = wasm.hexconfig_preset_pointy();\n return HexConfig.__wrap(ret);\n }\n}\nif (Symbol.dispose) HexConfig.prototype[Symbol.dispose] = HexConfig.prototype.free;\n\n/**\n * Hexagon orientation type\n * @enum {0 | 1}\n */\nexport const HexOrientation = Object.freeze({\n /**\n * Flat edge at top, vertices on left/right\n */\n FlatTop: 0, \"0\": \"FlatTop\",\n /**\n * Vertex at top, flat edges on left/right\n */\n PointyTop: 1, \"1\": \"PointyTop\",\n});\n\n/**\n * Result container for upscaled image data\n */\nexport class UpscaleResult {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(UpscaleResult.prototype);\n obj.__wbg_ptr = ptr;\n UpscaleResultFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n UpscaleResultFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_upscaleresult_free(ptr, 0);\n }\n /**\n * Pointer to the output buffer in WASM memory\n * @returns {number}\n */\n get ptr() {\n const ret = wasm.upscaleresult_ptr(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Length of the output buffer in bytes\n * @returns {number}\n */\n get len() {\n const ret = wasm.upscaleresult_len(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Output image width\n * @returns {number}\n */\n get width() {\n const ret = wasm.upscaleresult_width(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Output image height\n * @returns {number}\n */\n get height() {\n const ret = wasm.upscaleresult_height(this.__wbg_ptr);\n return ret >>> 0;\n }\n}\nif (Symbol.dispose) UpscaleResult.prototype[Symbol.dispose] = UpscaleResult.prototype.free;\n\n/**\n * xBRZ configuration options\n */\nexport class XbrzConfig {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(XbrzConfig.prototype);\n obj.__wbg_ptr = ptr;\n XbrzConfigFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n XbrzConfigFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_xbrzconfig_free(ptr, 0);\n }\n /**\n * Luminance weight for edge detection (0.0 - 1.0)\n * @returns {number}\n */\n get luminance_weight() {\n const ret = wasm.__wbg_get_crtconfig_warp_x(this.__wbg_ptr);\n return ret;\n }\n /**\n * Luminance weight for edge detection (0.0 - 1.0)\n * @param {number} arg0\n */\n set luminance_weight(arg0) {\n wasm.__wbg_set_crtconfig_warp_x(this.__wbg_ptr, arg0);\n }\n /**\n * Equal color tolerance (0 - 50)\n * @returns {number}\n */\n get equal_color_tolerance() {\n const ret = wasm.__wbg_get_hexconfig_border_thickness(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Equal color tolerance (0 - 50)\n * @param {number} arg0\n */\n set equal_color_tolerance(arg0) {\n wasm.__wbg_set_hexconfig_border_thickness(this.__wbg_ptr, arg0);\n }\n /**\n * Dominant direction threshold (3.5 - 6.0)\n * @returns {number}\n */\n get dominant_direction_threshold() {\n const ret = wasm.__wbg_get_crtconfig_scan_hardness(this.__wbg_ptr);\n return ret;\n }\n /**\n * Dominant direction threshold (3.5 - 6.0)\n * @param {number} arg0\n */\n set dominant_direction_threshold(arg0) {\n wasm.__wbg_set_crtconfig_scan_hardness(this.__wbg_ptr, arg0);\n }\n /**\n * Steep direction threshold (2.0 - 3.0)\n * @returns {number}\n */\n get steep_direction_threshold() {\n const ret = wasm.__wbg_get_crtconfig_scan_opacity(this.__wbg_ptr);\n return ret;\n }\n /**\n * Steep direction threshold (2.0 - 3.0)\n * @param {number} arg0\n */\n set steep_direction_threshold(arg0) {\n wasm.__wbg_set_crtconfig_scan_opacity(this.__wbg_ptr, arg0);\n }\n constructor() {\n const ret = wasm.xbrzconfig_new();\n this.__wbg_ptr = ret >>> 0;\n XbrzConfigFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * Preset for sharp edges\n * @returns {XbrzConfig}\n */\n static preset_sharp() {\n const ret = wasm.xbrzconfig_preset_sharp();\n return XbrzConfig.__wrap(ret);\n }\n /**\n * Preset for smooth output\n * @returns {XbrzConfig}\n */\n static preset_smooth() {\n const ret = wasm.xbrzconfig_preset_smooth();\n return XbrzConfig.__wrap(ret);\n }\n}\nif (Symbol.dispose) XbrzConfig.prototype[Symbol.dispose] = XbrzConfig.prototype.free;\n\n/**\n * Apply CRT effect with default configuration\n * @param {Uint8Array} input\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @returns {UpscaleResult}\n */\nexport function crt_upscale(input, src_w, src_h, scale) {\n const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.crt_upscale(ptr0, len0, src_w, src_h, scale);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return UpscaleResult.__wrap(ret[0]);\n}\n\n/**\n * Apply CRT effect with custom configuration\n * @param {Uint8Array} input\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @param {CrtConfig} config\n * @returns {UpscaleResult}\n */\nexport function crt_upscale_config(input, src_w, src_h, scale, config) {\n const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n _assertClass(config, CrtConfig);\n const ret = wasm.crt_upscale_config(ptr0, len0, src_w, src_h, scale, config.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return UpscaleResult.__wrap(ret[0]);\n}\n\n/**\n * Get WASM memory for zero-copy data transfer\n * @returns {any}\n */\nexport function get_memory() {\n const ret = wasm.get_memory();\n return ret;\n}\n\n/**\n * Get output dimensions for hexagonal upscaling\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @param {HexOrientation} orientation\n * @returns {Uint32Array}\n */\nexport function hex_get_dimensions(src_w, src_h, scale, orientation) {\n const ret = wasm.hex_get_dimensions(src_w, src_h, scale, orientation);\n var v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n}\n\n/**\n * Apply hexagonal upscaling with default configuration\n * @param {Uint8Array} input\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @returns {UpscaleResult}\n */\nexport function hex_upscale(input, src_w, src_h, scale) {\n const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.hex_upscale(ptr0, len0, src_w, src_h, scale);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return UpscaleResult.__wrap(ret[0]);\n}\n\n/**\n * Apply hexagonal upscaling with custom configuration\n * @param {Uint8Array} input\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @param {HexConfig} config\n * @returns {UpscaleResult}\n */\nexport function hex_upscale_config(input, src_w, src_h, scale, config) {\n const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n _assertClass(config, HexConfig);\n const ret = wasm.hex_upscale_config(ptr0, len0, src_w, src_h, scale, config.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return UpscaleResult.__wrap(ret[0]);\n}\n\nexport function init() {\n wasm.init();\n}\n\n/**\n * Apply xBRZ upscaling with default configuration\n * @param {Uint8Array} input\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @returns {UpscaleResult}\n */\nexport function xbrz_upscale(input, src_w, src_h, scale) {\n const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.xbrz_upscale(ptr0, len0, src_w, src_h, scale);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return UpscaleResult.__wrap(ret[0]);\n}\n\n/**\n * Apply xBRZ upscaling with custom configuration\n * @param {Uint8Array} input\n * @param {number} src_w\n * @param {number} src_h\n * @param {number} scale\n * @param {XbrzConfig} config\n * @returns {UpscaleResult}\n */\nexport function xbrz_upscale_config(input, src_w, src_h, scale, config) {\n const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n _assertClass(config, XbrzConfig);\n const ret = wasm.xbrz_upscale_config(ptr0, len0, src_w, src_h, scale, config.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return UpscaleResult.__wrap(ret[0]);\n}\n\nconst EXPECTED_RESPONSE_TYPES = new Set(['basic', 'cors', 'default']);\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = module.ok && EXPECTED_RESPONSE_TYPES.has(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg___wbindgen_memory_a342e963fbcabd68 = function() {\n const ret = wasm.memory;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n };\n imports.wbg.__wbg_new_8a6f238a6ece86ea = function() {\n const ret = new Error();\n return ret;\n };\n imports.wbg.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_cast_2241b6af4c4b2941 = function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n };\n\n return imports;\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedUint32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('renderart_wasm_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","/**\n * CRT GPU Renderer using WebGL2\n * \n * High-performance CRT effect rendering using fragment shaders.\n */\n\nimport type { CrtOptions, ImageInput, ImageOutput, Renderer } from './types';\n\n// Vertex shader\nconst VERTEX_SHADER = `#version 300 es\nlayout(location = 0) in vec2 position;\nout vec2 vUv;\n\nvoid main() {\n vUv = position * 0.5 + 0.5;\n gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\n// Fragment shader with configurable CRT effects\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D uTex;\nuniform vec2 uRes;\nuniform vec2 uWarp;\nuniform float uScanHardness;\nuniform float uScanOpacity;\nuniform float uMaskOpacity;\nuniform int uEnableWarp;\nuniform int uEnableScanlines;\nuniform int uEnableMask;\n\nin vec2 vUv;\nout vec4 outColor;\n\n// Gamma 2.0 approximation\nvec3 toLinear(vec3 c) { return c * c; }\nvec3 toSrgb(vec3 c) { return sqrt(c); }\n\nvec2 warp(vec2 uv) {\n if (uEnableWarp == 0) return uv;\n vec2 dc = abs(0.5 - uv);\n vec2 dc2 = dc * dc;\n uv.x -= 0.5; uv.x *= 1.0 + (dc2.y * (0.3 * uWarp.x)); uv.x += 0.5;\n uv.y -= 0.5; uv.y *= 1.0 + (dc2.x * (0.4 * uWarp.y)); uv.y += 0.5;\n return uv;\n}\n\nfloat scanline(float y, float sourceHeight) {\n if (uEnableScanlines == 0) return 1.0;\n float v = fract(y * sourceHeight);\n float d = abs(v - 0.5);\n float line = exp(d * d * uScanHardness);\n return mix(1.0, line, uScanOpacity);\n}\n\nvec3 mask(vec2 pos) {\n if (uEnableMask == 0) return vec3(1.0);\n float x = fract(pos.x / 6.0);\n vec3 m = vec3(1.0);\n float step1 = 0.333;\n float step2 = 0.666;\n \n m.r = step(0.0, x) - step(step1, x);\n m.g = step(step1, x) - step(step2, x);\n m.b = step(step2, x) - step(1.0, x);\n \n return mix(vec3(1.0), m, uMaskOpacity);\n}\n\nvoid main() {\n // 1. Geometry\n vec2 uv = warp(vUv);\n \n // 2. Bounds Check\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n outColor = vec4(0.0); \n return;\n }\n\n // 3. Texture Sample\n vec4 texSample = texture(uTex, uv);\n \n if (texSample.a == 0.0) {\n outColor = vec4(0.0);\n return;\n }\n\n vec3 linearColor = toLinear(texSample.rgb);\n \n // 4. CRT Effects\n ivec2 texSize = textureSize(uTex, 0);\n \n // Smart Bloom\n float luma = dot(linearColor, vec3(0.299, 0.587, 0.114));\n float bloom = luma * 0.7;\n\n // Calculate patterns\n float scan = scanline(uv.y, float(texSize.y));\n vec3 m = mask(gl_FragCoord.xy);\n \n // Apply effects\n vec3 effects = m * scan;\n vec3 finalRGB = linearColor * mix(effects, vec3(1.0), bloom);\n\n // 5. Output\n outColor = vec4(toSrgb(finalRGB), texSample.a);\n}`;\n\n/** CRT GPU Renderer */\nexport class CrtGpuRenderer implements Renderer<CrtOptions> {\n private gl: WebGL2RenderingContext | null = null;\n private canvas: OffscreenCanvas | null = null;\n private program: WebGLProgram | null = null;\n private texture: WebGLTexture | null = null;\n private uniforms: Record<string, WebGLUniformLocation | null> = {};\n private initialized = false;\n private currentCanvasSize = { width: 0, height: 0 };\n private currentTexSize = { width: 0, height: 0 };\n\n /** Create a new CRT GPU renderer */\n static create(): CrtGpuRenderer {\n const renderer = new CrtGpuRenderer();\n renderer.init();\n return renderer;\n }\n\n private init(): void {\n if (typeof OffscreenCanvas === 'undefined') {\n throw new Error('OffscreenCanvas not supported');\n }\n\n this.canvas = new OffscreenCanvas(1, 1);\n this.gl = this.canvas.getContext('webgl2', {\n alpha: true,\n premultipliedAlpha: false,\n desynchronized: true,\n powerPreference: 'high-performance',\n antialias: false,\n });\n\n if (!this.gl) {\n throw new Error('WebGL2 not supported');\n }\n\n const gl = this.gl;\n\n // Create shaders\n const vs = this.createShader(gl.VERTEX_SHADER, VERTEX_SHADER);\n const fs = this.createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n\n // Create program\n this.program = gl.createProgram()!;\n gl.attachShader(this.program, vs);\n gl.attachShader(this.program, fs);\n gl.linkProgram(this.program);\n\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n throw new Error('Shader program link failed: ' + gl.getProgramInfoLog(this.program));\n }\n\n gl.useProgram(this.program);\n\n // Get uniform locations\n this.uniforms = {\n uTex: gl.getUniformLocation(this.program, 'uTex'),\n uRes: gl.getUniformLocation(this.program, 'uRes'),\n uWarp: gl.getUniformLocation(this.program, 'uWarp'),\n uScanHardness: gl.getUniformLocation(this.program, 'uScanHardness'),\n uScanOpacity: gl.getUniformLocation(this.program, 'uScanOpacity'),\n uMaskOpacity: gl.getUniformLocation(this.program, 'uMaskOpacity'),\n uEnableWarp: gl.getUniformLocation(this.program, 'uEnableWarp'),\n uEnableScanlines: gl.getUniformLocation(this.program, 'uEnableScanlines'),\n uEnableMask: gl.getUniformLocation(this.program, 'uEnableMask'),\n };\n\n gl.uniform1i(this.uniforms.uTex, 0);\n\n // Setup geometry (fullscreen triangle)\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n // Create texture\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n\n this.initialized = true;\n }\n\n private createShader(type: number, source: string): WebGLShader {\n const gl = this.gl!;\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error('Shader compile failed: ' + info);\n }\n\n return shader;\n }\n\n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized;\n }\n\n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.initialized || !this.gl || !this.canvas) {\n throw new Error('Renderer not initialized');\n }\n\n const gl = this.gl;\n const data = input instanceof ImageData ? input.data : input.data;\n const width = input.width;\n const height = input.height;\n\n const scale = Math.min(32, Math.max(2, options.scale ?? 3));\n const outWidth = width * scale;\n const outHeight = height * scale;\n\n // Resize canvas if needed\n if (this.currentCanvasSize.width !== outWidth || this.currentCanvasSize.height !== outHeight) {\n this.canvas.width = outWidth;\n this.canvas.height = outHeight;\n this.currentCanvasSize = { width: outWidth, height: outHeight };\n gl.viewport(0, 0, outWidth, outHeight);\n }\n\n // Update uniforms\n gl.uniform2f(this.uniforms.uRes, outWidth, outHeight);\n gl.uniform2f(this.uniforms.uWarp, options.warpX ?? 0.015, options.warpY ?? 0.02);\n gl.uniform1f(this.uniforms.uScanHardness, options.scanHardness ?? -4.0);\n gl.uniform1f(this.uniforms.uScanOpacity, options.scanOpacity ?? 0.5);\n gl.uniform1f(this.uniforms.uMaskOpacity, options.maskOpacity ?? 0.3);\n gl.uniform1i(this.uniforms.uEnableWarp, options.enableWarp !== false ? 1 : 0);\n gl.uniform1i(this.uniforms.uEnableScanlines, options.enableScanlines !== false ? 1 : 0);\n gl.uniform1i(this.uniforms.uEnableMask, options.enableMask !== false ? 1 : 0);\n\n // Update texture\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n if (this.currentTexSize.width !== width || this.currentTexSize.height !== height) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n this.currentTexSize = { width, height };\n } else {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n }\n\n // Render\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n // Read pixels\n const pixels = new Uint8ClampedArray(outWidth * outHeight * 4);\n gl.readPixels(0, 0, outWidth, outHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n\n return {\n data: pixels,\n width: outWidth,\n height: outHeight,\n };\n }\n\n /** Dispose resources */\n dispose(): void {\n if (this.gl) {\n if (this.texture) this.gl.deleteTexture(this.texture);\n if (this.program) this.gl.deleteProgram(this.program);\n this.gl = null;\n }\n this.canvas = null;\n this.initialized = false;\n }\n}\n\n/** CRT presets */\nexport const CRT_PRESETS: Record<string, Partial<CrtOptions>> = {\n default: {},\n authentic: {\n warpX: 0.02,\n warpY: 0.025,\n scanHardness: -6.0,\n scanOpacity: 0.6,\n maskOpacity: 0.4,\n },\n subtle: {\n warpX: 0.008,\n warpY: 0.01,\n scanHardness: -3.0,\n scanOpacity: 0.3,\n maskOpacity: 0.15,\n },\n flat: {\n warpX: 0,\n warpY: 0,\n enableWarp: false,\n scanHardness: -4.0,\n scanOpacity: 0.5,\n maskOpacity: 0.3,\n },\n};\n","/**\n * Hexagonal GPU Renderer using WebGL2\n * \n * High-performance hexagonal pixel grid transformation using fragment shaders.\n */\n\nimport type { HexOptions, HexOrientation, ImageInput, ImageOutput, Renderer } from './types';\n\n// Vertex shader\nconst VERTEX_SHADER = `#version 300 es\nlayout(location = 0) in vec2 position;\nout vec2 vUv;\n\nvoid main() {\n vUv = position * 0.5 + 0.5;\n gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\n// Fragment shader for hexagonal rendering\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D uTex;\nuniform vec2 uOutputRes;\nuniform vec2 uInputRes;\nuniform float uScale;\nuniform int uOrientation; // 0 = flat-top, 1 = pointy-top\nuniform int uDrawBorders;\nuniform vec4 uBorderColor;\nuniform float uBorderThickness;\nuniform vec4 uBackgroundColor;\n\nin vec2 vUv;\nout vec4 outColor;\n\nconst float SQRT3 = 1.732050808;\nconst float INV_SQRT3 = 0.577350269;\n\n// Convert output pixel to hex coordinate (flat-top)\nvec2 pixelToHexFlat(vec2 pos, float scale) {\n float hSpacing = scale * 1.5;\n float vSpacing = scale * SQRT3;\n \n float col = pos.x / hSpacing;\n int colInt = int(floor(col));\n \n // Check if odd column (offset)\n bool isOffset = (colInt & 1) == 1;\n float yOffset = isOffset ? vSpacing * 0.5 : 0.0;\n \n float row = (pos.y - yOffset) / vSpacing;\n int rowInt = int(floor(row));\n \n // Refine with corner detection\n float cellX = pos.x - float(colInt) * hSpacing;\n float cellY = pos.y - float(rowInt) * vSpacing - yOffset;\n \n float quarterW = scale * 0.5;\n float halfH = vSpacing * 0.5;\n \n if (cellX < quarterW) {\n float distFromCenter = abs(cellY - halfH);\n float edgeX = distFromCenter * INV_SQRT3;\n \n if (cellX < quarterW - edgeX) {\n if (cellY < halfH) {\n rowInt -= 1;\n }\n colInt -= 1;\n }\n }\n \n return vec2(float(colInt), float(rowInt));\n}\n\n// Convert output pixel to hex coordinate (pointy-top)\nvec2 pixelToHexPointy(vec2 pos, float scale) {\n float hSpacing = scale * SQRT3;\n float vSpacing = scale * 1.5;\n \n float row = pos.y / vSpacing;\n int rowInt = int(floor(row));\n \n // Check if odd row (offset)\n bool isOffset = (rowInt & 1) == 1;\n float xOffset = isOffset ? hSpacing * 0.5 : 0.0;\n \n float col = (pos.x - xOffset) / hSpacing;\n int colInt = int(floor(col));\n \n // Refine with corner detection\n float cellX = pos.x - float(colInt) * hSpacing - xOffset;\n float cellY = pos.y - float(rowInt) * vSpacing;\n \n float halfW = hSpacing * 0.5;\n float quarterH = scale * 0.5;\n \n if (cellY < quarterH) {\n float distFromCenter = abs(cellX - halfW);\n float edgeY = distFromCenter * SQRT3;\n \n if (cellY < edgeY) {\n if (cellX < halfW && isOffset) {\n colInt -= 1;\n }\n rowInt -= 1;\n }\n }\n \n return vec2(float(colInt), float(rowInt));\n}\n\n// Check if pixel is on hex border\nbool isBorderPixel(vec2 pos, float scale, int orientation, float thickness) {\n for (float dy = -thickness; dy <= thickness; dy += 1.0) {\n for (float dx = -thickness; dx <= thickness; dx += 1.0) {\n if (dx == 0.0 && dy == 0.0) continue;\n \n vec2 h1 = orientation == 0 \n ? pixelToHexFlat(pos, scale) \n : pixelToHexPointy(pos, scale);\n vec2 h2 = orientation == 0 \n ? pixelToHexFlat(pos + vec2(dx, dy), scale) \n : pixelToHexPointy(pos + vec2(dx, dy), scale);\n \n if (h1 != h2) return true;\n }\n }\n return false;\n}\n\nvoid main() {\n vec2 pixelPos = vUv * uOutputRes;\n \n // Get hex coordinate\n vec2 hexCoord = uOrientation == 0 \n ? pixelToHexFlat(pixelPos, uScale) \n : pixelToHexPointy(pixelPos, uScale);\n \n // Check bounds\n if (hexCoord.x < 0.0 || hexCoord.y < 0.0 || \n hexCoord.x >= uInputRes.x || hexCoord.y >= uInputRes.y) {\n outColor = uBackgroundColor;\n return;\n }\n \n // Check for border\n if (uDrawBorders == 1 && uBorderThickness > 0.0) {\n if (isBorderPixel(pixelPos, uScale, uOrientation, uBorderThickness)) {\n outColor = uBorderColor;\n return;\n }\n }\n \n // Sample source pixel (add 0.5 for pixel center)\n vec2 texCoord = (hexCoord + 0.5) / uInputRes;\n outColor = texture(uTex, texCoord);\n}`;\n\n/** Parse color from CSS string or number */\nfunction parseColor(color: string | number | undefined, defaultColor: [number, number, number, number]): [number, number, number, number] {\n if (color === undefined) return defaultColor;\n \n if (typeof color === 'number') {\n return [\n ((color >> 24) & 0xFF) / 255,\n ((color >> 16) & 0xFF) / 255,\n ((color >> 8) & 0xFF) / 255,\n (color & 0xFF) / 255,\n ];\n }\n \n // Parse CSS color\n if (color === 'transparent') return [0, 0, 0, 0];\n \n // Parse hex color\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 6) {\n return [\n parseInt(hex.slice(0, 2), 16) / 255,\n parseInt(hex.slice(2, 4), 16) / 255,\n parseInt(hex.slice(4, 6), 16) / 255,\n 1,\n ];\n }\n if (hex.length === 8) {\n return [\n parseInt(hex.slice(0, 2), 16) / 255,\n parseInt(hex.slice(2, 4), 16) / 255,\n parseInt(hex.slice(4, 6), 16) / 255,\n parseInt(hex.slice(6, 8), 16) / 255,\n ];\n }\n }\n \n return defaultColor;\n}\n\n/** Calculate output dimensions for hex rendering */\nexport function hexGetDimensions(\n srcWidth: number,\n srcHeight: number,\n scale: number,\n orientation: HexOrientation = 'flat-top'\n): { width: number; height: number } {\n const SQRT3 = 1.732050808;\n \n if (orientation === 'flat-top') {\n const hSpacing = scale * 1.5;\n const vSpacing = scale * SQRT3;\n const cellWidth = scale * 2;\n const cellHeight = scale * SQRT3;\n \n return {\n width: Math.ceil(srcWidth * hSpacing + cellWidth),\n height: Math.ceil(srcHeight * vSpacing + cellHeight),\n };\n } else {\n const hSpacing = scale * SQRT3;\n const vSpacing = scale * 1.5;\n const cellWidth = scale * SQRT3;\n const cellHeight = scale * 2;\n \n return {\n width: Math.ceil(srcWidth * hSpacing + cellWidth),\n height: Math.ceil(srcHeight * vSpacing + cellHeight),\n };\n }\n}\n\n/** HEX GPU Renderer */\nexport class HexGpuRenderer implements Renderer<HexOptions> {\n private gl: WebGL2RenderingContext | null = null;\n private canvas: OffscreenCanvas | null = null;\n private program: WebGLProgram | null = null;\n private texture: WebGLTexture | null = null;\n private uniforms: Record<string, WebGLUniformLocation | null> = {};\n private initialized = false;\n private currentCanvasSize = { width: 0, height: 0 };\n private currentTexSize = { width: 0, height: 0 };\n\n /** Create a new HEX GPU renderer */\n static create(): HexGpuRenderer {\n const renderer = new HexGpuRenderer();\n renderer.init();\n return renderer;\n }\n\n private init(): void {\n if (typeof OffscreenCanvas === 'undefined') {\n throw new Error('OffscreenCanvas not supported');\n }\n\n this.canvas = new OffscreenCanvas(1, 1);\n this.gl = this.canvas.getContext('webgl2', {\n alpha: true,\n premultipliedAlpha: false,\n desynchronized: true,\n powerPreference: 'high-performance',\n antialias: false,\n });\n\n if (!this.gl) {\n throw new Error('WebGL2 not supported');\n }\n\n const gl = this.gl;\n\n // Create shaders\n const vs = this.createShader(gl.VERTEX_SHADER, VERTEX_SHADER);\n const fs = this.createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n\n // Create program\n this.program = gl.createProgram()!;\n gl.attachShader(this.program, vs);\n gl.attachShader(this.program, fs);\n gl.linkProgram(this.program);\n\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n throw new Error('Shader program link failed: ' + gl.getProgramInfoLog(this.program));\n }\n\n gl.useProgram(this.program);\n\n // Get uniform locations\n this.uniforms = {\n uTex: gl.getUniformLocation(this.program, 'uTex'),\n uOutputRes: gl.getUniformLocation(this.program, 'uOutputRes'),\n uInputRes: gl.getUniformLocation(this.program, 'uInputRes'),\n uScale: gl.getUniformLocation(this.program, 'uScale'),\n uOrientation: gl.getUniformLocation(this.program, 'uOrientation'),\n uDrawBorders: gl.getUniformLocation(this.program, 'uDrawBorders'),\n uBorderColor: gl.getUniformLocation(this.program, 'uBorderColor'),\n uBorderThickness: gl.getUniformLocation(this.program, 'uBorderThickness'),\n uBackgroundColor: gl.getUniformLocation(this.program, 'uBackgroundColor'),\n };\n\n gl.uniform1i(this.uniforms.uTex, 0);\n\n // Setup geometry\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n // Create texture\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n\n this.initialized = true;\n }\n\n private createShader(type: number, source: string): WebGLShader {\n const gl = this.gl!;\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error('Shader compile failed: ' + info);\n }\n\n return shader;\n }\n\n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized;\n }\n\n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.initialized || !this.gl || !this.canvas) {\n throw new Error('Renderer not initialized');\n }\n\n const gl = this.gl;\n const data = input instanceof ImageData ? input.data : input.data;\n const width = input.width;\n const height = input.height;\n\n const scale = Math.min(32, Math.max(2, options.scale ?? 16));\n const orientation: HexOrientation = options.orientation ?? 'flat-top';\n const { width: outWidth, height: outHeight } = hexGetDimensions(width, height, scale, orientation);\n\n // Resize canvas if needed\n if (this.currentCanvasSize.width !== outWidth || this.currentCanvasSize.height !== outHeight) {\n this.canvas.width = outWidth;\n this.canvas.height = outHeight;\n this.currentCanvasSize = { width: outWidth, height: outHeight };\n gl.viewport(0, 0, outWidth, outHeight);\n }\n\n // Update uniforms\n gl.uniform2f(this.uniforms.uOutputRes, outWidth, outHeight);\n gl.uniform2f(this.uniforms.uInputRes, width, height);\n gl.uniform1f(this.uniforms.uScale, scale);\n gl.uniform1i(this.uniforms.uOrientation, orientation === 'flat-top' ? 0 : 1);\n gl.uniform1i(this.uniforms.uDrawBorders, options.drawBorders ? 1 : 0);\n gl.uniform1f(this.uniforms.uBorderThickness, options.borderThickness ?? 1);\n\n const borderColor = parseColor(options.borderColor, [0.16, 0.16, 0.16, 1]);\n gl.uniform4f(this.uniforms.uBorderColor, ...borderColor);\n\n const bgColor = parseColor(options.backgroundColor, [0, 0, 0, 0]);\n gl.uniform4f(this.uniforms.uBackgroundColor, ...bgColor);\n\n // Update texture\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n if (this.currentTexSize.width !== width || this.currentTexSize.height !== height) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n this.currentTexSize = { width, height };\n } else {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n }\n\n // Render\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n // Read pixels\n const pixels = new Uint8ClampedArray(outWidth * outHeight * 4);\n gl.readPixels(0, 0, outWidth, outHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n\n return {\n data: pixels,\n width: outWidth,\n height: outHeight,\n };\n }\n\n /** Dispose resources */\n dispose(): void {\n if (this.gl) {\n if (this.texture) this.gl.deleteTexture(this.texture);\n if (this.program) this.gl.deleteProgram(this.program);\n this.gl = null;\n }\n this.canvas = null;\n this.initialized = false;\n }\n}\n\n/** HEX presets */\nexport const HEX_PRESETS: Record<string, Partial<HexOptions>> = {\n default: {},\n bordered: {\n drawBorders: true,\n borderColor: '#282828',\n borderThickness: 1,\n },\n pointy: {\n orientation: 'pointy-top',\n drawBorders: false,\n },\n};\n","/**\n * WASM Module Loader\n * \n * Handles loading and initialization of the Rust WASM module.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// WASM module state - use 'any' to avoid complex typing issues\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet wasmModule: any = null;\nlet wasmMemory: WebAssembly.Memory | null = null;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet loadPromise: Promise<any> | null = null;\n\n/** Load WASM module */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadWasm(): Promise<any> {\n if (wasmModule) return wasmModule;\n \n if (loadPromise) return loadPromise;\n \n loadPromise = (async () => {\n try {\n // Dynamic import of WASM module\n const wasm = await import('../pkg/renderart_wasm.js');\n await wasm.default();\n wasmModule = wasm;\n wasmMemory = wasmModule.get_memory();\n return wasmModule;\n } catch (e) {\n throw new Error(`Failed to load WASM module: ${e}`);\n }\n })();\n \n return loadPromise;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasmModule !== null;\n}\n\n/** Get output data from WASM memory */\nfunction getOutputData(result: { ptr: number; len: number }): Uint8ClampedArray {\n if (!wasmMemory) throw new Error('WASM memory not available');\n \n const buffer = new Uint8Array(wasmMemory.buffer, result.ptr, result.len);\n return new Uint8ClampedArray(buffer.slice());\n}\n\n/** Convert input to Uint8Array */\nfunction toUint8Array(input: ImageInput | ImageData): Uint8Array {\n const data = input instanceof ImageData ? input.data : input.data;\n return data instanceof Uint8Array ? data : new Uint8Array(data);\n}\n\n/** Parse color to WASM format (0xRRGGBBAA) */\nfunction parseColorToU32(color: string | number | undefined, defaultVal: number): number {\n if (color === undefined) return defaultVal;\n if (typeof color === 'number') return color;\n \n if (color === 'transparent') return 0x00000000;\n \n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 6) {\n return (parseInt(hex, 16) << 8) | 0xFF;\n }\n if (hex.length === 8) {\n return parseInt(hex, 16);\n }\n }\n \n return defaultVal;\n}\n\n// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM */\nexport class CrtCpuRenderer {\n private ready = false;\n \n /** Create and initialize renderer */\n static async create(): Promise<CrtCpuRenderer> {\n const renderer = new CrtCpuRenderer();\n await renderer.init();\n return renderer;\n }\n \n private async init(): Promise<void> {\n await loadWasm();\n this.ready = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.ready;\n }\n \n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.ready || !wasmModule) {\n throw new Error('Renderer not initialized');\n }\n \n const data = toUint8Array(input);\n const width = input.width;\n const height = input.height;\n const scale = Math.min(32, Math.max(2, options.scale ?? 3));\n \n // Create config\n const config = new wasmModule.CrtConfig();\n config.warp_x = options.warpX ?? 0.015;\n config.warp_y = options.warpY ?? 0.02;\n config.scan_hardness = options.scanHardness ?? -4.0;\n config.scan_opacity = options.scanOpacity ?? 0.5;\n config.mask_opacity = options.maskOpacity ?? 0.3;\n config.enable_warp = options.enableWarp !== false;\n config.enable_scanlines = options.enableScanlines !== false;\n config.enable_mask = options.enableMask !== false;\n \n const result = wasmModule.crt_upscale_config(data, width, height, scale, config);\n \n return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================================================\n// HEX CPU Renderer\n// ============================================================================\n\n/** HEX CPU Renderer using WASM */\nexport class HexCpuRenderer {\n private ready = false;\n \n /** Create and initialize renderer */\n static async create(): Promise<HexCpuRenderer> {\n const renderer = new HexCpuRenderer();\n await renderer.init();\n return renderer;\n }\n \n private async init(): Promise<void> {\n await loadWasm();\n this.ready = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.ready;\n }\n \n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.ready || !wasmModule) {\n throw new Error('Renderer not initialized');\n }\n \n const data = toUint8Array(input);\n const width = input.width;\n const height = input.height;\n const scale = Math.min(32, Math.max(2, options.scale ?? 16));\n \n // Create config\n const config = new wasmModule.HexConfig();\n config.orientation = options.orientation === 'pointy-top' ? 1 : 0;\n config.draw_borders = options.drawBorders ?? false;\n config.border_color = parseColorToU32(options.borderColor, 0x282828FF);\n config.border_thickness = options.borderThickness ?? 1;\n config.background_color = parseColorToU32(options.backgroundColor, 0x00000000);\n \n const result = wasmModule.hex_upscale_config(data, width, height, scale, config);\n \n return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Get output dimensions */\n getDimensions(srcWidth: number, srcHeight: number, scale: number, orientation: HexOrientation = 'flat-top'): { width: number; height: number } {\n if (!this.ready || !wasmModule) {\n throw new Error('Renderer not initialized');\n }\n \n const dims = wasmModule.hex_get_dimensions(srcWidth, srcHeight, scale, orientation === 'pointy-top' ? 1 : 0);\n return { width: dims[0], height: dims[1] };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM */\nexport class XbrzCpuRenderer {\n private ready = false;\n \n /** Create and initialize renderer */\n static async create(): Promise<XbrzCpuRenderer> {\n const renderer = new XbrzCpuRenderer();\n await renderer.init();\n return renderer;\n }\n \n private async init(): Promise<void> {\n await loadWasm();\n this.ready = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.ready;\n }\n \n /** Render xBRZ scaling */\n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n if (!this.ready || !wasmModule) {\n throw new Error('Renderer not initialized');\n }\n \n const data = toUint8Array(input);\n const width = input.width;\n const height = input.height;\n const scale = Math.min(6, Math.max(2, options.scale ?? 2));\n \n // Create config\n const config = new wasmModule.XbrzConfig();\n config.luminance_weight = options.luminanceWeight ?? 1.0;\n config.equal_color_tolerance = options.equalColorTolerance ?? 30;\n config.dominant_direction_threshold = options.dominantDirectionThreshold ?? 4.4;\n config.steep_direction_threshold = options.steepDirectionThreshold ?? 2.2;\n \n const result = wasmModule.xbrz_upscale_config(data, width, height, scale, config);\n \n return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.ready = false;\n }\n}\n\n/** XBRZ presets */\nexport const XBRZ_PRESETS: Record<string, Partial<XbrzOptions>> = {\n default: {},\n sharp: {\n luminanceWeight: 1.0,\n equalColorTolerance: 20,\n dominantDirectionThreshold: 4.4,\n steepDirectionThreshold: 2.2,\n },\n smooth: {\n luminanceWeight: 0.8,\n equalColorTolerance: 35,\n dominantDirectionThreshold: 5.0,\n steepDirectionThreshold: 2.5,\n },\n};\n","/**\n * RenderArt - Unified Pixel Art Rendering Engine\n * \n * Provides a unified API for all rendering engines (CRT, HEX, XBRZ)\n * with automatic backend selection (GPU/CPU).\n */\n\nimport type {\n Backend,\n CrtOptions,\n CrtPreset,\n HexOptions,\n HexPreset,\n XbrzOptions,\n XbrzPreset,\n ImageInput,\n ImageOutput,\n RendererCapabilities,\n RenderStats,\n} from './types';\n\nimport { CrtGpuRenderer, CRT_PRESETS } from './crt-gpu';\nimport { HexGpuRenderer, HEX_PRESETS, hexGetDimensions } from './hex-gpu';\nimport { \n CrtCpuRenderer, \n HexCpuRenderer, \n XbrzCpuRenderer,\n XBRZ_PRESETS,\n loadWasm,\n isWasmLoaded,\n} from './wasm-loader';\n\n/** Check if WebGL2 is available */\nfunction checkWebGL2(): boolean {\n if (typeof OffscreenCanvas === 'undefined') return false;\n try {\n const canvas = new OffscreenCanvas(1, 1);\n return !!canvas.getContext('webgl2');\n } catch {\n return false;\n }\n}\n\n/** Get WebGL2 max texture size */\nfunction getMaxTextureSize(): number {\n if (!checkWebGL2()) return 0;\n try {\n const canvas = new OffscreenCanvas(1, 1);\n const gl = canvas.getContext('webgl2');\n return gl?.getParameter(gl.MAX_TEXTURE_SIZE) ?? 0;\n } catch {\n return 0;\n }\n}\n\n// ============================================================================\n// CRT Engine\n// ============================================================================\n\n/** CRT rendering engine with GPU/CPU backend support */\nexport class CrtEngine {\n private gpuRenderer: CrtGpuRenderer | null = null;\n private cpuRenderer: CrtCpuRenderer | null = null;\n private gpuAvailable: boolean;\n private cpuAvailable: boolean;\n\n constructor(gpuAvailable: boolean, cpuAvailable: boolean) {\n this.gpuAvailable = gpuAvailable;\n this.cpuAvailable = cpuAvailable;\n }\n\n /** Initialize GPU renderer */\n private ensureGpu(): CrtGpuRenderer {\n if (!this.gpuRenderer && this.gpuAvailable) {\n this.gpuRenderer = CrtGpuRenderer.create();\n }\n if (!this.gpuRenderer) throw new Error('GPU renderer not available');\n return this.gpuRenderer;\n }\n\n /** Initialize CPU renderer */\n private async ensureCpu(): Promise<CrtCpuRenderer> {\n if (!this.cpuRenderer && this.cpuAvailable) {\n this.cpuRenderer = await CrtCpuRenderer.create();\n }\n if (!this.cpuRenderer) throw new Error('CPU renderer not available');\n return this.cpuRenderer;\n }\n\n /** Render with automatic backend selection */\n async render(input: ImageInput | ImageData, options?: CrtOptions): Promise<ImageOutput>;\n /** Render with preset */\n async render(input: ImageInput | ImageData, preset: CrtPreset, overrides?: Partial<CrtOptions>): Promise<ImageOutput>;\n async render(\n input: ImageInput | ImageData,\n optionsOrPreset?: CrtOptions | CrtPreset,\n overrides?: Partial<CrtOptions>\n ): Promise<ImageOutput> {\n // Resolve preset\n let options: CrtOptions = {};\n if (typeof optionsOrPreset === 'string') {\n options = { ...CRT_PRESETS[optionsOrPreset], ...overrides };\n } else if (optionsOrPreset) {\n options = optionsOrPreset;\n }\n\n const backend = options.backend ?? 'auto';\n\n // Select backend\n if (backend === 'gpu' || (backend === 'auto' && this.gpuAvailable)) {\n try {\n return this.ensureGpu().render(input, options);\n } catch (e) {\n if (backend === 'gpu') throw e;\n // Fallback to CPU\n }\n }\n\n // CPU fallback\n const cpu = await this.ensureCpu();\n return cpu.render(input, options);\n }\n\n /** Render synchronously (GPU only) */\n renderSync(input: ImageInput | ImageData, options?: CrtOptions): ImageOutput {\n return this.ensureGpu().render(input, options ?? {});\n }\n\n /** Dispose resources */\n dispose(): void {\n this.gpuRenderer?.dispose();\n this.cpuRenderer?.dispose();\n this.gpuRenderer = null;\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// HEX Engine\n// ============================================================================\n\n/** HEX rendering engine with GPU/CPU backend support */\nexport class HexEngine {\n private gpuRenderer: HexGpuRenderer | null = null;\n private cpuRenderer: HexCpuRenderer | null = null;\n private gpuAvailable: boolean;\n private cpuAvailable: boolean;\n\n constructor(gpuAvailable: boolean, cpuAvailable: boolean) {\n this.gpuAvailable = gpuAvailable;\n this.cpuAvailable = cpuAvailable;\n }\n\n private ensureGpu(): HexGpuRenderer {\n if (!this.gpuRenderer && this.gpuAvailable) {\n this.gpuRenderer = HexGpuRenderer.create();\n }\n if (!this.gpuRenderer) throw new Error('GPU renderer not available');\n return this.gpuRenderer;\n }\n\n private async ensureCpu(): Promise<HexCpuRenderer> {\n if (!this.cpuRenderer && this.cpuAvailable) {\n this.cpuRenderer = await HexCpuRenderer.create();\n }\n if (!this.cpuRenderer) throw new Error('CPU renderer not available');\n return this.cpuRenderer;\n }\n\n /** Render with automatic backend selection */\n async render(input: ImageInput | ImageData, options?: HexOptions): Promise<ImageOutput>;\n /** Render with preset */\n async render(input: ImageInput | ImageData, preset: HexPreset, overrides?: Partial<HexOptions>): Promise<ImageOutput>;\n async render(\n input: ImageInput | ImageData,\n optionsOrPreset?: HexOptions | HexPreset,\n overrides?: Partial<HexOptions>\n ): Promise<ImageOutput> {\n let options: HexOptions = {};\n if (typeof optionsOrPreset === 'string') {\n options = { ...HEX_PRESETS[optionsOrPreset], ...overrides };\n } else if (optionsOrPreset) {\n options = optionsOrPreset;\n }\n\n const backend = options.backend ?? 'auto';\n\n if (backend === 'gpu' || (backend === 'auto' && this.gpuAvailable)) {\n try {\n return this.ensureGpu().render(input, options);\n } catch (e) {\n if (backend === 'gpu') throw e;\n }\n }\n\n const cpu = await this.ensureCpu();\n return cpu.render(input, options);\n }\n\n /** Render synchronously (GPU only) */\n renderSync(input: ImageInput | ImageData, options?: HexOptions): ImageOutput {\n return this.ensureGpu().render(input, options ?? {});\n }\n\n /** Get output dimensions */\n getDimensions(srcWidth: number, srcHeight: number, options?: HexOptions): { width: number; height: number } {\n const scale = options?.scale ?? 16;\n const orientation = options?.orientation ?? 'flat-top';\n return hexGetDimensions(srcWidth, srcHeight, scale, orientation);\n }\n\n dispose(): void {\n this.gpuRenderer?.dispose();\n this.cpuRenderer?.dispose();\n this.gpuRenderer = null;\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// XBRZ Engine\n// ============================================================================\n\n/** XBRZ rendering engine (CPU only - algorithm too complex for efficient GPU) */\nexport class XbrzEngine {\n private cpuRenderer: XbrzCpuRenderer | null = null;\n private cpuAvailable: boolean;\n\n constructor(cpuAvailable: boolean) {\n this.cpuAvailable = cpuAvailable;\n }\n\n private async ensureCpu(): Promise<XbrzCpuRenderer> {\n if (!this.cpuRenderer && this.cpuAvailable) {\n this.cpuRenderer = await XbrzCpuRenderer.create();\n }\n if (!this.cpuRenderer) throw new Error('CPU renderer not available');\n return this.cpuRenderer;\n }\n\n /** Render xBRZ scaling */\n async render(input: ImageInput | ImageData, options?: XbrzOptions): Promise<ImageOutput>;\n /** Render with preset */\n async render(input: ImageInput | ImageData, preset: XbrzPreset, overrides?: Partial<XbrzOptions>): Promise<ImageOutput>;\n async render(\n input: ImageInput | ImageData,\n optionsOrPreset?: XbrzOptions | XbrzPreset,\n overrides?: Partial<XbrzOptions>\n ): Promise<ImageOutput> {\n let options: XbrzOptions = {};\n if (typeof optionsOrPreset === 'string') {\n options = { ...XBRZ_PRESETS[optionsOrPreset], ...overrides };\n } else if (optionsOrPreset) {\n options = optionsOrPreset;\n }\n\n const cpu = await this.ensureCpu();\n return cpu.render(input, options);\n }\n\n /** Get output dimensions */\n getDimensions(srcWidth: number, srcHeight: number, scale: number = 2): { width: number; height: number } {\n const s = Math.min(6, Math.max(2, scale));\n return { width: srcWidth * s, height: srcHeight * s };\n }\n\n dispose(): void {\n this.cpuRenderer?.dispose();\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// Main RenderArt Class\n// ============================================================================\n\n/** RenderArt - Unified Pixel Art Rendering Engine */\nexport class RenderArt {\n /** CRT effect renderer */\n readonly crt: CrtEngine;\n /** Hexagonal pixel renderer */\n readonly hex: HexEngine;\n /** xBRZ scaling renderer */\n readonly xbrz: XbrzEngine;\n\n private _capabilities: RendererCapabilities;\n\n private constructor(gpuAvailable: boolean, cpuAvailable: boolean) {\n this.crt = new CrtEngine(gpuAvailable, cpuAvailable);\n this.hex = new HexEngine(gpuAvailable, cpuAvailable);\n this.xbrz = new XbrzEngine(cpuAvailable);\n\n const maxTextureSize = gpuAvailable ? getMaxTextureSize() : 0;\n\n this._capabilities = {\n gpu: gpuAvailable,\n cpu: cpuAvailable,\n maxTextureSize,\n recommendedBackend: gpuAvailable ? 'gpu' : cpuAvailable ? 'cpu' : 'auto',\n };\n }\n\n /** Create and initialize RenderArt instance */\n static async create(): Promise<RenderArt> {\n const gpuAvailable = checkWebGL2();\n let cpuAvailable = false;\n\n // Try to load WASM\n try {\n await loadWasm();\n cpuAvailable = isWasmLoaded();\n } catch {\n // WASM not available\n }\n\n if (!gpuAvailable && !cpuAvailable) {\n throw new Error('No rendering backend available. WebGL2 or WASM required.');\n }\n\n return new RenderArt(gpuAvailable, cpuAvailable);\n }\n\n /** Get renderer capabilities */\n get capabilities(): RendererCapabilities {\n return { ...this._capabilities };\n }\n\n /** Dispose all resources */\n dispose(): void {\n this.crt.dispose();\n this.hex.dispose();\n this.xbrz.dispose();\n }\n}\n\n// Export presets\nexport { CRT_PRESETS } from './crt-gpu';\nexport { HEX_PRESETS } from './hex-gpu';\nexport { XBRZ_PRESETS } from './wasm-loader';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/crt-gpu.ts","../src/hex-gpu.ts","../src/wasm-loader.ts","../src/renderart.ts"],"names":["VERTEX_SHADER","FRAGMENT_SHADER","wasmUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CRT GPU Renderer using WebGL2\n * \n * High-performance CRT effect rendering using fragment shaders.\n */\n\nimport type { CrtOptions, ImageInput, ImageOutput, Renderer } from './types';\n\n// Vertex shader\nconst VERTEX_SHADER = `#version 300 es\nlayout(location = 0) in vec2 position;\nout vec2 vUv;\n\nvoid main() {\n vUv = position * 0.5 + 0.5;\n gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\n// Fragment shader with configurable CRT effects\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D uTex;\nuniform vec2 uRes;\nuniform vec2 uWarp;\nuniform float uScanHardness;\nuniform float uScanOpacity;\nuniform float uMaskOpacity;\nuniform int uEnableWarp;\nuniform int uEnableScanlines;\nuniform int uEnableMask;\n\nin vec2 vUv;\nout vec4 outColor;\n\n// Gamma 2.0 approximation\nvec3 toLinear(vec3 c) { return c * c; }\nvec3 toSrgb(vec3 c) { return sqrt(c); }\n\nvec2 warp(vec2 uv) {\n if (uEnableWarp == 0) return uv;\n vec2 dc = abs(0.5 - uv);\n vec2 dc2 = dc * dc;\n uv.x -= 0.5; uv.x *= 1.0 + (dc2.y * (0.3 * uWarp.x)); uv.x += 0.5;\n uv.y -= 0.5; uv.y *= 1.0 + (dc2.x * (0.4 * uWarp.y)); uv.y += 0.5;\n return uv;\n}\n\nfloat scanline(float y, float sourceHeight) {\n if (uEnableScanlines == 0) return 1.0;\n float v = fract(y * sourceHeight);\n float d = abs(v - 0.5);\n float line = exp(d * d * uScanHardness);\n return mix(1.0, line, uScanOpacity);\n}\n\nvec3 mask(vec2 pos) {\n if (uEnableMask == 0) return vec3(1.0);\n float x = fract(pos.x / 6.0);\n vec3 m = vec3(1.0);\n float step1 = 0.333;\n float step2 = 0.666;\n \n m.r = step(0.0, x) - step(step1, x);\n m.g = step(step1, x) - step(step2, x);\n m.b = step(step2, x) - step(1.0, x);\n \n return mix(vec3(1.0), m, uMaskOpacity);\n}\n\nvoid main() {\n // 1. Geometry\n vec2 uv = warp(vUv);\n \n // 2. Bounds Check\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n outColor = vec4(0.0); \n return;\n }\n\n // 3. Texture Sample\n vec4 texSample = texture(uTex, uv);\n \n if (texSample.a == 0.0) {\n outColor = vec4(0.0);\n return;\n }\n\n vec3 linearColor = toLinear(texSample.rgb);\n \n // 4. CRT Effects\n ivec2 texSize = textureSize(uTex, 0);\n \n // Smart Bloom\n float luma = dot(linearColor, vec3(0.299, 0.587, 0.114));\n float bloom = luma * 0.7;\n\n // Calculate patterns\n float scan = scanline(uv.y, float(texSize.y));\n vec3 m = mask(gl_FragCoord.xy);\n \n // Apply effects\n vec3 effects = m * scan;\n vec3 finalRGB = linearColor * mix(effects, vec3(1.0), bloom);\n\n // 5. Output\n outColor = vec4(toSrgb(finalRGB), texSample.a);\n}`;\n\n/** CRT GPU Renderer */\nexport class CrtGpuRenderer implements Renderer<CrtOptions> {\n private gl: WebGL2RenderingContext | null = null;\n private canvas: OffscreenCanvas | null = null;\n private program: WebGLProgram | null = null;\n private texture: WebGLTexture | null = null;\n private uniforms: Record<string, WebGLUniformLocation | null> = {};\n private initialized = false;\n private currentCanvasSize = { width: 0, height: 0 };\n private currentTexSize = { width: 0, height: 0 };\n\n /** Create a new CRT GPU renderer */\n static create(): CrtGpuRenderer {\n const renderer = new CrtGpuRenderer();\n renderer.init();\n return renderer;\n }\n\n private init(): void {\n if (typeof OffscreenCanvas === 'undefined') {\n throw new Error('OffscreenCanvas not supported');\n }\n\n this.canvas = new OffscreenCanvas(1, 1);\n this.gl = this.canvas.getContext('webgl2', {\n alpha: true,\n premultipliedAlpha: false,\n desynchronized: true,\n powerPreference: 'high-performance',\n antialias: false,\n });\n\n if (!this.gl) {\n throw new Error('WebGL2 not supported');\n }\n\n const gl = this.gl;\n\n // Create shaders\n const vs = this.createShader(gl.VERTEX_SHADER, VERTEX_SHADER);\n const fs = this.createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n\n // Create program\n this.program = gl.createProgram()!;\n gl.attachShader(this.program, vs);\n gl.attachShader(this.program, fs);\n gl.linkProgram(this.program);\n\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n throw new Error('Shader program link failed: ' + gl.getProgramInfoLog(this.program));\n }\n\n gl.useProgram(this.program);\n\n // Get uniform locations\n this.uniforms = {\n uTex: gl.getUniformLocation(this.program, 'uTex'),\n uRes: gl.getUniformLocation(this.program, 'uRes'),\n uWarp: gl.getUniformLocation(this.program, 'uWarp'),\n uScanHardness: gl.getUniformLocation(this.program, 'uScanHardness'),\n uScanOpacity: gl.getUniformLocation(this.program, 'uScanOpacity'),\n uMaskOpacity: gl.getUniformLocation(this.program, 'uMaskOpacity'),\n uEnableWarp: gl.getUniformLocation(this.program, 'uEnableWarp'),\n uEnableScanlines: gl.getUniformLocation(this.program, 'uEnableScanlines'),\n uEnableMask: gl.getUniformLocation(this.program, 'uEnableMask'),\n };\n\n gl.uniform1i(this.uniforms.uTex, 0);\n\n // Setup geometry (fullscreen triangle)\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n // Create texture\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n\n this.initialized = true;\n }\n\n private createShader(type: number, source: string): WebGLShader {\n const gl = this.gl!;\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error('Shader compile failed: ' + info);\n }\n\n return shader;\n }\n\n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized;\n }\n\n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.initialized || !this.gl || !this.canvas) {\n throw new Error('Renderer not initialized');\n }\n\n const gl = this.gl;\n const data = input instanceof ImageData ? input.data : input.data;\n const width = input.width;\n const height = input.height;\n\n const scale = Math.min(32, Math.max(2, options.scale ?? 3));\n const outWidth = width * scale;\n const outHeight = height * scale;\n\n // Resize canvas if needed\n if (this.currentCanvasSize.width !== outWidth || this.currentCanvasSize.height !== outHeight) {\n this.canvas.width = outWidth;\n this.canvas.height = outHeight;\n this.currentCanvasSize = { width: outWidth, height: outHeight };\n gl.viewport(0, 0, outWidth, outHeight);\n }\n\n // Update uniforms\n gl.uniform2f(this.uniforms.uRes, outWidth, outHeight);\n gl.uniform2f(this.uniforms.uWarp, options.warpX ?? 0.015, options.warpY ?? 0.02);\n gl.uniform1f(this.uniforms.uScanHardness, options.scanHardness ?? -4.0);\n gl.uniform1f(this.uniforms.uScanOpacity, options.scanOpacity ?? 0.5);\n gl.uniform1f(this.uniforms.uMaskOpacity, options.maskOpacity ?? 0.3);\n gl.uniform1i(this.uniforms.uEnableWarp, options.enableWarp !== false ? 1 : 0);\n gl.uniform1i(this.uniforms.uEnableScanlines, options.enableScanlines !== false ? 1 : 0);\n gl.uniform1i(this.uniforms.uEnableMask, options.enableMask !== false ? 1 : 0);\n\n // Update texture\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n if (this.currentTexSize.width !== width || this.currentTexSize.height !== height) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n this.currentTexSize = { width, height };\n } else {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n }\n\n // Render\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n // Read pixels\n const pixels = new Uint8ClampedArray(outWidth * outHeight * 4);\n gl.readPixels(0, 0, outWidth, outHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n\n return {\n data: pixels,\n width: outWidth,\n height: outHeight,\n };\n }\n\n /** Dispose resources */\n dispose(): void {\n if (this.gl) {\n if (this.texture) this.gl.deleteTexture(this.texture);\n if (this.program) this.gl.deleteProgram(this.program);\n this.gl = null;\n }\n this.canvas = null;\n this.initialized = false;\n }\n}\n\n/** CRT presets */\nexport const CRT_PRESETS: Record<string, Partial<CrtOptions>> = {\n default: {},\n authentic: {\n warpX: 0.02,\n warpY: 0.025,\n scanHardness: -6.0,\n scanOpacity: 0.6,\n maskOpacity: 0.4,\n },\n subtle: {\n warpX: 0.008,\n warpY: 0.01,\n scanHardness: -3.0,\n scanOpacity: 0.3,\n maskOpacity: 0.15,\n },\n flat: {\n warpX: 0,\n warpY: 0,\n enableWarp: false,\n scanHardness: -4.0,\n scanOpacity: 0.5,\n maskOpacity: 0.3,\n },\n};\n","/**\n * Hexagonal GPU Renderer using WebGL2\n * \n * High-performance hexagonal pixel grid transformation using fragment shaders.\n */\n\nimport type { HexOptions, HexOrientation, ImageInput, ImageOutput, Renderer } from './types';\n\n// Vertex shader\nconst VERTEX_SHADER = `#version 300 es\nlayout(location = 0) in vec2 position;\nout vec2 vUv;\n\nvoid main() {\n vUv = position * 0.5 + 0.5;\n gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\n// Fragment shader for hexagonal rendering\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D uTex;\nuniform vec2 uOutputRes;\nuniform vec2 uInputRes;\nuniform float uScale;\nuniform int uOrientation; // 0 = flat-top, 1 = pointy-top\nuniform int uDrawBorders;\nuniform vec4 uBorderColor;\nuniform float uBorderThickness;\nuniform vec4 uBackgroundColor;\n\nin vec2 vUv;\nout vec4 outColor;\n\nconst float SQRT3 = 1.732050808;\nconst float INV_SQRT3 = 0.577350269;\n\n// Convert output pixel to hex coordinate (flat-top)\nvec2 pixelToHexFlat(vec2 pos, float scale) {\n float hSpacing = scale * 1.5;\n float vSpacing = scale * SQRT3;\n \n float col = pos.x / hSpacing;\n int colInt = int(floor(col));\n \n // Check if odd column (offset)\n bool isOffset = (colInt & 1) == 1;\n float yOffset = isOffset ? vSpacing * 0.5 : 0.0;\n \n float row = (pos.y - yOffset) / vSpacing;\n int rowInt = int(floor(row));\n \n // Refine with corner detection\n float cellX = pos.x - float(colInt) * hSpacing;\n float cellY = pos.y - float(rowInt) * vSpacing - yOffset;\n \n float quarterW = scale * 0.5;\n float halfH = vSpacing * 0.5;\n \n if (cellX < quarterW) {\n float distFromCenter = abs(cellY - halfH);\n float edgeX = distFromCenter * INV_SQRT3;\n \n if (cellX < quarterW - edgeX) {\n if (cellY < halfH) {\n rowInt -= 1;\n }\n colInt -= 1;\n }\n }\n \n return vec2(float(colInt), float(rowInt));\n}\n\n// Convert output pixel to hex coordinate (pointy-top)\nvec2 pixelToHexPointy(vec2 pos, float scale) {\n float hSpacing = scale * SQRT3;\n float vSpacing = scale * 1.5;\n \n float row = pos.y / vSpacing;\n int rowInt = int(floor(row));\n \n // Check if odd row (offset)\n bool isOffset = (rowInt & 1) == 1;\n float xOffset = isOffset ? hSpacing * 0.5 : 0.0;\n \n float col = (pos.x - xOffset) / hSpacing;\n int colInt = int(floor(col));\n \n // Refine with corner detection\n float cellX = pos.x - float(colInt) * hSpacing - xOffset;\n float cellY = pos.y - float(rowInt) * vSpacing;\n \n float halfW = hSpacing * 0.5;\n float quarterH = scale * 0.5;\n \n if (cellY < quarterH) {\n float distFromCenter = abs(cellX - halfW);\n float edgeY = distFromCenter * SQRT3;\n \n if (cellY < edgeY) {\n if (cellX < halfW && isOffset) {\n colInt -= 1;\n }\n rowInt -= 1;\n }\n }\n \n return vec2(float(colInt), float(rowInt));\n}\n\n// Check if pixel is on hex border\nbool isBorderPixel(vec2 pos, float scale, int orientation, float thickness) {\n for (float dy = -thickness; dy <= thickness; dy += 1.0) {\n for (float dx = -thickness; dx <= thickness; dx += 1.0) {\n if (dx == 0.0 && dy == 0.0) continue;\n \n vec2 h1 = orientation == 0 \n ? pixelToHexFlat(pos, scale) \n : pixelToHexPointy(pos, scale);\n vec2 h2 = orientation == 0 \n ? pixelToHexFlat(pos + vec2(dx, dy), scale) \n : pixelToHexPointy(pos + vec2(dx, dy), scale);\n \n if (h1 != h2) return true;\n }\n }\n return false;\n}\n\nvoid main() {\n vec2 pixelPos = vUv * uOutputRes;\n \n // Get hex coordinate\n vec2 hexCoord = uOrientation == 0 \n ? pixelToHexFlat(pixelPos, uScale) \n : pixelToHexPointy(pixelPos, uScale);\n \n // Check bounds\n if (hexCoord.x < 0.0 || hexCoord.y < 0.0 || \n hexCoord.x >= uInputRes.x || hexCoord.y >= uInputRes.y) {\n outColor = uBackgroundColor;\n return;\n }\n \n // Check for border\n if (uDrawBorders == 1 && uBorderThickness > 0.0) {\n if (isBorderPixel(pixelPos, uScale, uOrientation, uBorderThickness)) {\n outColor = uBorderColor;\n return;\n }\n }\n \n // Sample source pixel (add 0.5 for pixel center)\n vec2 texCoord = (hexCoord + 0.5) / uInputRes;\n outColor = texture(uTex, texCoord);\n}`;\n\n/** Parse color from CSS string or number */\nfunction parseColor(color: string | number | undefined, defaultColor: [number, number, number, number]): [number, number, number, number] {\n if (color === undefined) return defaultColor;\n \n if (typeof color === 'number') {\n return [\n ((color >> 24) & 0xFF) / 255,\n ((color >> 16) & 0xFF) / 255,\n ((color >> 8) & 0xFF) / 255,\n (color & 0xFF) / 255,\n ];\n }\n \n // Parse CSS color\n if (color === 'transparent') return [0, 0, 0, 0];\n \n // Parse hex color\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 6) {\n return [\n parseInt(hex.slice(0, 2), 16) / 255,\n parseInt(hex.slice(2, 4), 16) / 255,\n parseInt(hex.slice(4, 6), 16) / 255,\n 1,\n ];\n }\n if (hex.length === 8) {\n return [\n parseInt(hex.slice(0, 2), 16) / 255,\n parseInt(hex.slice(2, 4), 16) / 255,\n parseInt(hex.slice(4, 6), 16) / 255,\n parseInt(hex.slice(6, 8), 16) / 255,\n ];\n }\n }\n \n return defaultColor;\n}\n\n/** Calculate output dimensions for hex rendering */\nexport function hexGetDimensions(\n srcWidth: number,\n srcHeight: number,\n scale: number,\n orientation: HexOrientation = 'flat-top'\n): { width: number; height: number } {\n const SQRT3 = 1.732050808;\n \n if (orientation === 'flat-top') {\n const hSpacing = scale * 1.5;\n const vSpacing = scale * SQRT3;\n const cellWidth = scale * 2;\n const cellHeight = scale * SQRT3;\n \n return {\n width: Math.ceil(srcWidth * hSpacing + cellWidth),\n height: Math.ceil(srcHeight * vSpacing + cellHeight),\n };\n } else {\n const hSpacing = scale * SQRT3;\n const vSpacing = scale * 1.5;\n const cellWidth = scale * SQRT3;\n const cellHeight = scale * 2;\n \n return {\n width: Math.ceil(srcWidth * hSpacing + cellWidth),\n height: Math.ceil(srcHeight * vSpacing + cellHeight),\n };\n }\n}\n\n/** HEX GPU Renderer */\nexport class HexGpuRenderer implements Renderer<HexOptions> {\n private gl: WebGL2RenderingContext | null = null;\n private canvas: OffscreenCanvas | null = null;\n private program: WebGLProgram | null = null;\n private texture: WebGLTexture | null = null;\n private uniforms: Record<string, WebGLUniformLocation | null> = {};\n private initialized = false;\n private currentCanvasSize = { width: 0, height: 0 };\n private currentTexSize = { width: 0, height: 0 };\n\n /** Create a new HEX GPU renderer */\n static create(): HexGpuRenderer {\n const renderer = new HexGpuRenderer();\n renderer.init();\n return renderer;\n }\n\n private init(): void {\n if (typeof OffscreenCanvas === 'undefined') {\n throw new Error('OffscreenCanvas not supported');\n }\n\n this.canvas = new OffscreenCanvas(1, 1);\n this.gl = this.canvas.getContext('webgl2', {\n alpha: true,\n premultipliedAlpha: false,\n desynchronized: true,\n powerPreference: 'high-performance',\n antialias: false,\n });\n\n if (!this.gl) {\n throw new Error('WebGL2 not supported');\n }\n\n const gl = this.gl;\n\n // Create shaders\n const vs = this.createShader(gl.VERTEX_SHADER, VERTEX_SHADER);\n const fs = this.createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n\n // Create program\n this.program = gl.createProgram()!;\n gl.attachShader(this.program, vs);\n gl.attachShader(this.program, fs);\n gl.linkProgram(this.program);\n\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n throw new Error('Shader program link failed: ' + gl.getProgramInfoLog(this.program));\n }\n\n gl.useProgram(this.program);\n\n // Get uniform locations\n this.uniforms = {\n uTex: gl.getUniformLocation(this.program, 'uTex'),\n uOutputRes: gl.getUniformLocation(this.program, 'uOutputRes'),\n uInputRes: gl.getUniformLocation(this.program, 'uInputRes'),\n uScale: gl.getUniformLocation(this.program, 'uScale'),\n uOrientation: gl.getUniformLocation(this.program, 'uOrientation'),\n uDrawBorders: gl.getUniformLocation(this.program, 'uDrawBorders'),\n uBorderColor: gl.getUniformLocation(this.program, 'uBorderColor'),\n uBorderThickness: gl.getUniformLocation(this.program, 'uBorderThickness'),\n uBackgroundColor: gl.getUniformLocation(this.program, 'uBackgroundColor'),\n };\n\n gl.uniform1i(this.uniforms.uTex, 0);\n\n // Setup geometry\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n // Create texture\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n\n this.initialized = true;\n }\n\n private createShader(type: number, source: string): WebGLShader {\n const gl = this.gl!;\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error('Shader compile failed: ' + info);\n }\n\n return shader;\n }\n\n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized;\n }\n\n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.initialized || !this.gl || !this.canvas) {\n throw new Error('Renderer not initialized');\n }\n\n const gl = this.gl;\n const data = input instanceof ImageData ? input.data : input.data;\n const width = input.width;\n const height = input.height;\n\n const scale = Math.min(32, Math.max(2, options.scale ?? 16));\n const orientation: HexOrientation = options.orientation ?? 'flat-top';\n const { width: outWidth, height: outHeight } = hexGetDimensions(width, height, scale, orientation);\n\n // Resize canvas if needed\n if (this.currentCanvasSize.width !== outWidth || this.currentCanvasSize.height !== outHeight) {\n this.canvas.width = outWidth;\n this.canvas.height = outHeight;\n this.currentCanvasSize = { width: outWidth, height: outHeight };\n gl.viewport(0, 0, outWidth, outHeight);\n }\n\n // Update uniforms\n gl.uniform2f(this.uniforms.uOutputRes, outWidth, outHeight);\n gl.uniform2f(this.uniforms.uInputRes, width, height);\n gl.uniform1f(this.uniforms.uScale, scale);\n gl.uniform1i(this.uniforms.uOrientation, orientation === 'flat-top' ? 0 : 1);\n gl.uniform1i(this.uniforms.uDrawBorders, options.drawBorders ? 1 : 0);\n gl.uniform1f(this.uniforms.uBorderThickness, options.borderThickness ?? 1);\n\n const borderColor = parseColor(options.borderColor, [0.16, 0.16, 0.16, 1]);\n gl.uniform4f(this.uniforms.uBorderColor, ...borderColor);\n\n const bgColor = parseColor(options.backgroundColor, [0, 0, 0, 0]);\n gl.uniform4f(this.uniforms.uBackgroundColor, ...bgColor);\n\n // Update texture\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n if (this.currentTexSize.width !== width || this.currentTexSize.height !== height) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n this.currentTexSize = { width, height };\n } else {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n }\n\n // Render\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n // Read pixels\n const pixels = new Uint8ClampedArray(outWidth * outHeight * 4);\n gl.readPixels(0, 0, outWidth, outHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n\n return {\n data: pixels,\n width: outWidth,\n height: outHeight,\n };\n }\n\n /** Dispose resources */\n dispose(): void {\n if (this.gl) {\n if (this.texture) this.gl.deleteTexture(this.texture);\n if (this.program) this.gl.deleteProgram(this.program);\n this.gl = null;\n }\n this.canvas = null;\n this.initialized = false;\n }\n}\n\n/** HEX presets */\nexport const HEX_PRESETS: Record<string, Partial<HexOptions>> = {\n default: {},\n bordered: {\n drawBorders: true,\n borderColor: '#282828',\n borderThickness: 1,\n },\n pointy: {\n orientation: 'pointy-top',\n drawBorders: false,\n },\n};\n","/**\n * WASM Module Loader\n * \n * Auto-initializes WASM from URL. Works with any bundler.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// ============================================================================\n// WASM Runtime (minimal wasm-bindgen glue)\n// ============================================================================\n\nlet wasm: any = null;\nlet wasmMemory: WebAssembly.Memory | null = null;\nlet initPromise: Promise<void> | null = null;\nlet wasmUrl: string = '';\n\n// Heap and memory management\nlet cachedUint8Memory: Uint8Array | null = null;\nlet cachedInt32Memory: Int32Array | null = null;\nlet WASM_VECTOR_LEN = 0;\n\nfunction getUint8Memory(): Uint8Array {\n if (cachedUint8Memory === null || cachedUint8Memory.byteLength === 0) {\n cachedUint8Memory = new Uint8Array(wasmMemory!.buffer);\n }\n return cachedUint8Memory;\n}\n\nfunction getInt32Memory(): Int32Array {\n if (cachedInt32Memory === null || cachedInt32Memory.byteLength === 0) {\n cachedInt32Memory = new Int32Array(wasmMemory!.buffer);\n }\n return cachedInt32Memory;\n}\n\nfunction passArray8ToWasm(arg: Uint8Array): number {\n const ptr = wasm.__wbindgen_malloc(arg.length);\n getUint8Memory().set(arg, ptr);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Configure WASM loading path\n * Call this before using any CPU renderer if you need a custom path.\n * \n * @param url - URL to the renderart_wasm_bg.wasm file\n * \n * @example\n * ```typescript\n * setWasmUrl('/static/wasm/renderart_wasm_bg.wasm');\n * ```\n */\nexport function setWasmUrl(url: string): void {\n wasmUrl = url;\n}\n\n/**\n * Get default WASM URL based on environment\n */\nfunction getDefaultWasmUrl(): string {\n if (wasmUrl) return wasmUrl;\n \n // Try common paths\n const paths = [\n '/renderart_wasm_bg.wasm',\n '/wasm/renderart_wasm_bg.wasm', \n '/static/wasm/renderart_wasm_bg.wasm',\n '/assets/wasm/renderart_wasm_bg.wasm',\n ];\n \n return paths[0]; // Default to root\n}\n\n// ============================================================================\n// WASM Initialization\n// ============================================================================\n\n/**\n * Initialize WASM module\n * Called automatically on first CPU renderer use.\n * Can be called manually for preloading.\n */\nexport async function initWasm(customUrl?: string): Promise<void> {\n if (wasm) return;\n if (initPromise) return initPromise;\n \n const url = customUrl || getDefaultWasmUrl();\n \n initPromise = (async () => {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status} ${response.statusText}`);\n }\n \n const bytes = await response.arrayBuffer();\n \n // Import object for WASM instantiation\n const imports = {\n __wbindgen_placeholder__: {\n __wbindgen_throw: (ptr: number, len: number) => {\n const msg = new TextDecoder().decode(getUint8Memory().subarray(ptr, ptr + len));\n throw new Error(msg);\n },\n },\n wbg: {\n __wbindgen_throw: (ptr: number, len: number) => {\n const msg = new TextDecoder().decode(getUint8Memory().subarray(ptr, ptr + len));\n throw new Error(msg);\n },\n },\n };\n \n const { instance } = await WebAssembly.instantiate(bytes, imports);\n wasm = instance.exports;\n wasmMemory = wasm.memory as WebAssembly.Memory;\n \n // Call wasm init if it exists\n if (wasm.__wbindgen_start) {\n wasm.__wbindgen_start();\n }\n } catch (e) {\n initPromise = null;\n throw new Error(`Failed to initialize WASM: ${e}. Make sure the .wasm file is served at: ${url}`);\n }\n })();\n \n return initPromise;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasm !== null;\n}\n\n/** Ensure WASM is loaded, auto-init if needed */\nasync function ensureWasm(): Promise<void> {\n if (!wasm) {\n await initWasm();\n }\n}\n\n// ============================================================================\n// Output helpers\n// ============================================================================\n\nfunction getOutputData(ptr: number, len: number): Uint8ClampedArray {\n const buffer = getUint8Memory().subarray(ptr, ptr + len);\n return new Uint8ClampedArray(buffer.slice());\n}\n\nfunction toUint8Array(input: ImageInput | ImageData): Uint8Array {\n const data = input instanceof ImageData ? input.data : input.data;\n return data instanceof Uint8Array ? data : new Uint8Array(data);\n}\n\nfunction parseColorToU32(color: string | number | undefined, defaultVal: number): number {\n if (color === undefined) return defaultVal;\n if (typeof color === 'number') return color;\n \n if (color === 'transparent') return 0x00000000;\n \n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 6) {\n return (parseInt(hex, 16) << 8) | 0xFF;\n }\n if (hex.length === 8) {\n return parseInt(hex, 16);\n }\n }\n \n return defaultVal;\n}\n\n// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM */\nexport class CrtCpuRenderer {\n private ready = false;\n \n /** Create and initialize renderer (auto-loads WASM) */\n static async create(): Promise<CrtCpuRenderer> {\n await ensureWasm();\n const renderer = new CrtCpuRenderer();\n renderer.ready = true;\n return renderer;\n }\n \n isReady(): boolean {\n return this.ready && isWasmLoaded();\n }\n \n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.ready || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const data = toUint8Array(input);\n const width = input.width;\n const height = input.height;\n const scale = Math.min(32, Math.max(2, options.scale ?? 3));\n \n const ptr = passArray8ToWasm(data);\n \n const resultPtr = wasm.crt_upscale_raw(\n ptr, WASM_VECTOR_LEN, width, height, scale,\n options.warpX ?? 0.015,\n options.warpY ?? 0.02,\n options.scanHardness ?? -4.0,\n options.scanOpacity ?? 0.5,\n options.maskOpacity ?? 0.3,\n options.enableWarp !== false ? 1 : 0,\n options.enableScanlines !== false ? 1 : 0,\n options.enableMask !== false ? 1 : 0\n );\n \n const outWidth = width * scale;\n const outHeight = height * scale;\n const outLen = outWidth * outHeight * 4;\n \n return {\n data: getOutputData(resultPtr, outLen),\n width: outWidth,\n height: outHeight,\n };\n }\n \n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================================================\n// HEX CPU Renderer\n// ============================================================================\n\n/** HEX CPU Renderer using WASM */\nexport class HexCpuRenderer {\n private ready = false;\n \n static async create(): Promise<HexCpuRenderer> {\n await ensureWasm();\n const renderer = new HexCpuRenderer();\n renderer.ready = true;\n return renderer;\n }\n \n isReady(): boolean {\n return this.ready && isWasmLoaded();\n }\n \n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.ready || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const data = toUint8Array(input);\n const width = input.width;\n const height = input.height;\n const scale = Math.min(32, Math.max(2, options.scale ?? 16));\n const orientation = options.orientation === 'pointy-top' ? 1 : 0;\n \n const ptr = passArray8ToWasm(data);\n \n const resultPtr = wasm.hex_upscale_raw(\n ptr, WASM_VECTOR_LEN, width, height, scale, orientation,\n options.drawBorders ? 1 : 0,\n parseColorToU32(options.borderColor, 0x282828FF),\n options.borderThickness ?? 1,\n parseColorToU32(options.backgroundColor, 0x00000000)\n );\n \n // Get dimensions\n const dims = this.getDimensions(width, height, scale, options.orientation);\n const outLen = dims.width * dims.height * 4;\n \n return {\n data: getOutputData(resultPtr, outLen),\n width: dims.width,\n height: dims.height,\n };\n }\n \n getDimensions(srcWidth: number, srcHeight: number, scale: number, orientation: HexOrientation = 'flat-top'): { width: number; height: number } {\n const SQRT3 = 1.732050808;\n scale = Math.min(32, Math.max(2, scale));\n \n if (orientation === 'flat-top') {\n const hSpacing = scale * 1.5;\n const vSpacing = scale * SQRT3;\n const cellWidth = scale * 2;\n const cellHeight = scale * SQRT3;\n return {\n width: Math.ceil(srcWidth * hSpacing + cellWidth),\n height: Math.ceil(srcHeight * vSpacing + cellHeight),\n };\n } else {\n const hSpacing = scale * SQRT3;\n const vSpacing = scale * 1.5;\n const cellWidth = scale * SQRT3;\n const cellHeight = scale * 2;\n return {\n width: Math.ceil(srcWidth * hSpacing + cellWidth),\n height: Math.ceil(srcHeight * vSpacing + cellHeight),\n };\n }\n }\n \n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM */\nexport class XbrzCpuRenderer {\n private ready = false;\n \n static async create(): Promise<XbrzCpuRenderer> {\n await ensureWasm();\n const renderer = new XbrzCpuRenderer();\n renderer.ready = true;\n return renderer;\n }\n \n isReady(): boolean {\n return this.ready && isWasmLoaded();\n }\n \n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n if (!this.ready || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const data = toUint8Array(input);\n const width = input.width;\n const height = input.height;\n const scale = Math.min(6, Math.max(2, options.scale ?? 2));\n \n const ptr = passArray8ToWasm(data);\n \n const resultPtr = wasm.xbrz_upscale_raw(\n ptr, WASM_VECTOR_LEN, width, height, scale,\n options.luminanceWeight ?? 1.0,\n options.equalColorTolerance ?? 30,\n options.dominantDirectionThreshold ?? 4.4,\n options.steepDirectionThreshold ?? 2.2\n );\n \n const outWidth = width * scale;\n const outHeight = height * scale;\n const outLen = outWidth * outHeight * 4;\n \n return {\n data: getOutputData(resultPtr, outLen),\n width: outWidth,\n height: outHeight,\n };\n }\n \n dispose(): void {\n this.ready = false;\n }\n}\n\n/** XBRZ presets */\nexport const XBRZ_PRESETS: Record<string, Partial<XbrzOptions>> = {\n default: {},\n sharp: {\n luminanceWeight: 1.0,\n equalColorTolerance: 20,\n dominantDirectionThreshold: 4.4,\n steepDirectionThreshold: 2.2,\n },\n smooth: {\n luminanceWeight: 0.8,\n equalColorTolerance: 35,\n dominantDirectionThreshold: 5.0,\n steepDirectionThreshold: 2.5,\n },\n};\n","/**\n * RenderArt - Unified Pixel Art Rendering Engine\n * \n * GPU renderers work standalone. CPU renderers auto-initialize WASM.\n */\n\nimport type {\n Backend,\n CrtOptions,\n CrtPreset,\n HexOptions,\n HexPreset,\n XbrzOptions,\n XbrzPreset,\n ImageInput,\n ImageOutput,\n RendererCapabilities,\n} from './types';\n\nimport { CrtGpuRenderer, CRT_PRESETS } from './crt-gpu';\nimport { HexGpuRenderer, HEX_PRESETS, hexGetDimensions } from './hex-gpu';\nimport { \n CrtCpuRenderer, \n HexCpuRenderer, \n XbrzCpuRenderer,\n XBRZ_PRESETS,\n isWasmLoaded,\n initWasm,\n} from './wasm-loader';\n\n/** Check if WebGL2 is available */\nfunction checkWebGL2(): boolean {\n if (typeof OffscreenCanvas === 'undefined') return false;\n try {\n const canvas = new OffscreenCanvas(1, 1);\n return !!canvas.getContext('webgl2');\n } catch {\n return false;\n }\n}\n\n/** Get WebGL2 max texture size */\nfunction getMaxTextureSize(): number {\n if (!checkWebGL2()) return 0;\n try {\n const canvas = new OffscreenCanvas(1, 1);\n const gl = canvas.getContext('webgl2');\n return gl?.getParameter(gl.MAX_TEXTURE_SIZE) ?? 0;\n } catch {\n return 0;\n }\n}\n\n// ============================================================================\n// CRT Engine\n// ============================================================================\n\n/** CRT rendering engine */\nexport class CrtEngine {\n private gpuRenderer: CrtGpuRenderer | null = null;\n private cpuRenderer: CrtCpuRenderer | null = null;\n private gpuAvailable: boolean;\n\n constructor(gpuAvailable: boolean) {\n this.gpuAvailable = gpuAvailable;\n }\n\n private ensureGpu(): CrtGpuRenderer {\n if (!this.gpuRenderer && this.gpuAvailable) {\n this.gpuRenderer = CrtGpuRenderer.create();\n }\n if (!this.gpuRenderer) throw new Error('GPU renderer not available');\n return this.gpuRenderer;\n }\n\n private async ensureCpu(): Promise<CrtCpuRenderer> {\n if (!this.cpuRenderer) {\n this.cpuRenderer = await CrtCpuRenderer.create();\n }\n return this.cpuRenderer;\n }\n\n /** Render with automatic backend selection */\n async render(input: ImageInput | ImageData, options?: CrtOptions): Promise<ImageOutput>;\n async render(input: ImageInput | ImageData, preset: CrtPreset, overrides?: Partial<CrtOptions>): Promise<ImageOutput>;\n async render(\n input: ImageInput | ImageData,\n optionsOrPreset?: CrtOptions | CrtPreset,\n overrides?: Partial<CrtOptions>\n ): Promise<ImageOutput> {\n let options: CrtOptions = {};\n if (typeof optionsOrPreset === 'string') {\n options = { ...CRT_PRESETS[optionsOrPreset], ...overrides };\n } else if (optionsOrPreset) {\n options = optionsOrPreset;\n }\n\n const backend = options.backend ?? 'auto';\n\n if (backend === 'gpu' || (backend === 'auto' && this.gpuAvailable)) {\n try {\n return this.ensureGpu().render(input, options);\n } catch (e) {\n if (backend === 'gpu') throw e;\n }\n }\n\n const cpu = await this.ensureCpu();\n return cpu.render(input, options);\n }\n\n /** Render synchronously (GPU only) */\n renderSync(input: ImageInput | ImageData, options?: CrtOptions): ImageOutput {\n return this.ensureGpu().render(input, options ?? {});\n }\n\n dispose(): void {\n this.gpuRenderer?.dispose();\n this.cpuRenderer?.dispose();\n this.gpuRenderer = null;\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// HEX Engine\n// ============================================================================\n\n/** HEX rendering engine */\nexport class HexEngine {\n private gpuRenderer: HexGpuRenderer | null = null;\n private cpuRenderer: HexCpuRenderer | null = null;\n private gpuAvailable: boolean;\n\n constructor(gpuAvailable: boolean) {\n this.gpuAvailable = gpuAvailable;\n }\n\n private ensureGpu(): HexGpuRenderer {\n if (!this.gpuRenderer && this.gpuAvailable) {\n this.gpuRenderer = HexGpuRenderer.create();\n }\n if (!this.gpuRenderer) throw new Error('GPU renderer not available');\n return this.gpuRenderer;\n }\n\n private async ensureCpu(): Promise<HexCpuRenderer> {\n if (!this.cpuRenderer) {\n this.cpuRenderer = await HexCpuRenderer.create();\n }\n return this.cpuRenderer;\n }\n\n async render(input: ImageInput | ImageData, options?: HexOptions): Promise<ImageOutput>;\n async render(input: ImageInput | ImageData, preset: HexPreset, overrides?: Partial<HexOptions>): Promise<ImageOutput>;\n async render(\n input: ImageInput | ImageData,\n optionsOrPreset?: HexOptions | HexPreset,\n overrides?: Partial<HexOptions>\n ): Promise<ImageOutput> {\n let options: HexOptions = {};\n if (typeof optionsOrPreset === 'string') {\n options = { ...HEX_PRESETS[optionsOrPreset], ...overrides };\n } else if (optionsOrPreset) {\n options = optionsOrPreset;\n }\n\n const backend = options.backend ?? 'auto';\n\n if (backend === 'gpu' || (backend === 'auto' && this.gpuAvailable)) {\n try {\n return this.ensureGpu().render(input, options);\n } catch (e) {\n if (backend === 'gpu') throw e;\n }\n }\n\n const cpu = await this.ensureCpu();\n return cpu.render(input, options);\n }\n\n renderSync(input: ImageInput | ImageData, options?: HexOptions): ImageOutput {\n return this.ensureGpu().render(input, options ?? {});\n }\n\n getDimensions(srcWidth: number, srcHeight: number, options?: HexOptions): { width: number; height: number } {\n const scale = options?.scale ?? 16;\n const orientation = options?.orientation ?? 'flat-top';\n return hexGetDimensions(srcWidth, srcHeight, scale, orientation);\n }\n\n dispose(): void {\n this.gpuRenderer?.dispose();\n this.cpuRenderer?.dispose();\n this.gpuRenderer = null;\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// XBRZ Engine\n// ============================================================================\n\n/** XBRZ rendering engine (CPU only) */\nexport class XbrzEngine {\n private cpuRenderer: XbrzCpuRenderer | null = null;\n\n private async ensureCpu(): Promise<XbrzCpuRenderer> {\n if (!this.cpuRenderer) {\n this.cpuRenderer = await XbrzCpuRenderer.create();\n }\n return this.cpuRenderer;\n }\n\n async render(input: ImageInput | ImageData, options?: XbrzOptions): Promise<ImageOutput>;\n async render(input: ImageInput | ImageData, preset: XbrzPreset, overrides?: Partial<XbrzOptions>): Promise<ImageOutput>;\n async render(\n input: ImageInput | ImageData,\n optionsOrPreset?: XbrzOptions | XbrzPreset,\n overrides?: Partial<XbrzOptions>\n ): Promise<ImageOutput> {\n let options: XbrzOptions = {};\n if (typeof optionsOrPreset === 'string') {\n options = { ...XBRZ_PRESETS[optionsOrPreset], ...overrides };\n } else if (optionsOrPreset) {\n options = optionsOrPreset;\n }\n\n const cpu = await this.ensureCpu();\n return cpu.render(input, options);\n }\n\n getDimensions(srcWidth: number, srcHeight: number, scale: number = 2): { width: number; height: number } {\n const s = Math.min(6, Math.max(2, scale));\n return { width: srcWidth * s, height: srcHeight * s };\n }\n\n dispose(): void {\n this.cpuRenderer?.dispose();\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// Main RenderArt Class\n// ============================================================================\n\n/** RenderArt - Unified Pixel Art Rendering Engine */\nexport class RenderArt {\n readonly crt: CrtEngine;\n readonly hex: HexEngine;\n readonly xbrz: XbrzEngine;\n\n private _capabilities: RendererCapabilities;\n\n private constructor(gpuAvailable: boolean) {\n this.crt = new CrtEngine(gpuAvailable);\n this.hex = new HexEngine(gpuAvailable);\n this.xbrz = new XbrzEngine();\n\n const maxTextureSize = gpuAvailable ? getMaxTextureSize() : 0;\n\n this._capabilities = {\n gpu: gpuAvailable,\n cpu: true, // Always potentially available via async init\n maxTextureSize,\n recommendedBackend: gpuAvailable ? 'gpu' : 'cpu',\n };\n }\n\n /** Create RenderArt instance */\n static create(): RenderArt {\n const gpuAvailable = checkWebGL2();\n return new RenderArt(gpuAvailable);\n }\n\n /** Create GPU-only instance */\n static createGpuOnly(): RenderArt {\n if (!checkWebGL2()) {\n throw new Error('WebGL2 not supported');\n }\n return new RenderArt(true);\n }\n\n /** Pre-initialize WASM for faster first CPU render */\n async preloadWasm(wasmUrl?: string): Promise<void> {\n await initWasm(wasmUrl);\n }\n\n get capabilities(): RendererCapabilities {\n return { ...this._capabilities };\n }\n\n dispose(): void {\n this.crt.dispose();\n this.hex.dispose();\n this.xbrz.dispose();\n }\n}\n\nexport { CRT_PRESETS } from './crt-gpu';\nexport { HEX_PRESETS } from './hex-gpu';\nexport { XBRZ_PRESETS } from './wasm-loader';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixagram/renderart",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "High-performance pixel art rendering engines (CRT, HEX, XBRZ) with GPU and CPU support",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -11,33 +11,21 @@
|
|
|
11
11
|
"require": "./dist/index.js",
|
|
12
12
|
"types": "./dist/index.d.ts"
|
|
13
13
|
},
|
|
14
|
-
"
|
|
15
|
-
"import": "./dist/index.mjs",
|
|
16
|
-
"require": "./dist/index.js",
|
|
17
|
-
"types": "./dist/index.d.ts"
|
|
18
|
-
},
|
|
19
|
-
"./dist/*": {
|
|
14
|
+
"./*": {
|
|
20
15
|
"import": "./dist/*",
|
|
21
16
|
"require": "./dist/*"
|
|
22
|
-
}
|
|
23
|
-
"./wasm": {
|
|
24
|
-
"import": "./dist/wasm/renderart_wasm.js",
|
|
25
|
-
"types": "./dist/wasm/renderart_wasm.d.ts"
|
|
26
|
-
},
|
|
27
|
-
"./pkg/*": "./pkg/*"
|
|
17
|
+
}
|
|
28
18
|
},
|
|
29
19
|
"files": [
|
|
30
20
|
"dist",
|
|
31
|
-
"
|
|
21
|
+
"wasm",
|
|
32
22
|
"README.md",
|
|
33
23
|
"LICENSE"
|
|
34
24
|
],
|
|
35
25
|
"scripts": {
|
|
36
|
-
"build:wasm": "
|
|
26
|
+
"build:wasm": "cargo build --target wasm32-unknown-unknown --release && mkdir -p wasm && cp target/wasm32-unknown-unknown/release/renderart_wasm.wasm wasm/",
|
|
37
27
|
"build:ts": "tsup",
|
|
38
|
-
"build
|
|
39
|
-
"build": "npm run build:wasm && npm run build:ts && npm run postbuild",
|
|
40
|
-
"postbuild": "node scripts/postbuild.js",
|
|
28
|
+
"build": "npm run build:ts",
|
|
41
29
|
"test": "cargo test",
|
|
42
30
|
"prepublishOnly": "npm run build"
|
|
43
31
|
},
|
|
@@ -59,10 +47,6 @@
|
|
|
59
47
|
"type": "git",
|
|
60
48
|
"url": "https://github.com/pixagram/renderart.git"
|
|
61
49
|
},
|
|
62
|
-
"bugs": {
|
|
63
|
-
"url": "https://github.com/pixagram/renderart/issues"
|
|
64
|
-
},
|
|
65
|
-
"homepage": "https://github.com/pixagram/renderart#readme",
|
|
66
50
|
"devDependencies": {
|
|
67
51
|
"@types/node": "^20.10.0",
|
|
68
52
|
"tsup": "^8.5.1",
|