@pixagram/renderart 0.3.3 → 0.4.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/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
4
3
  // src/crt-gpu.ts
5
4
  var VERTEX_SHADER = `#version 300 es
6
5
  layout(location = 0) in vec2 position;
@@ -631,16 +630,13 @@ async function initWasm(wasmUrl) {
631
630
  if (initPromise) return initPromise;
632
631
  initPromise = (async () => {
633
632
  try {
634
- const wasmModule = await import('./renderart_wasm.js');
635
- let url = wasmUrl;
636
- if (!url) {
637
- try {
638
- url = new URL("./renderart_wasm_bg.wasm", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href))).href;
639
- } catch {
640
- url = "renderart_wasm_bg.wasm";
641
- }
633
+ const wasmModule = await import('./renderart_wasm_bg.js');
634
+ const init = wasmModule.default;
635
+ if (typeof init !== "function") {
636
+ console.error("WASM module exports:", Object.keys(wasmModule));
637
+ throw new Error("WASM init is not a function: " + typeof init);
642
638
  }
643
- await wasmModule.default(url);
639
+ await init();
644
640
  wasm = wasmModule;
645
641
  wasmReady = true;
646
642
  } catch (e) {
@@ -1042,7 +1038,7 @@ var RenderArt = class _RenderArt {
1042
1038
  }
1043
1039
  /** Pre-initialize WASM for faster first CPU render */
1044
1040
  async preloadWasm(wasmUrl) {
1045
- await initWasm(wasmUrl);
1041
+ await initWasm();
1046
1042
  }
1047
1043
  get capabilities() {
1048
1044
  return { ...this._capabilities };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/crt-gpu.ts","../src/hex-gpu.ts","../src/wasm-loader.ts","../src/renderart.ts"],"names":["VERTEX_SHADER","FRAGMENT_SHADER"],"mappings":"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","file":"index.js","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 * Handles loading and initialization of the Rust WASM module.\n * Auto-initializes on first use.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// WASM module reference (loaded dynamically)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet wasm: any = null;\n\n// Track initialization state\nlet wasmReady = false;\nlet initPromise: Promise<void> | null = null;\nlet initError: Error | null = null;\n\n/**\n * Initialize WASM module (auto-called on first use)\n * Can be called manually to pre-load WASM.\n * \n * @param wasmUrl - Optional URL to the .wasm file.\n */\nexport async function initWasm(wasmUrl?: string): Promise<void> {\n if (wasmReady) return;\n if (initError) throw initError;\n \n if (initPromise) return initPromise;\n \n initPromise = (async () => {\n try {\n // Dynamic import of the WASM glue code\n // After build, renderart_wasm.js is copied to dist/ by postbuild script\n // @ts-ignore - dynamic import types are complex\n const wasmModule = await import('./renderart_wasm.js');\n \n // Resolve WASM URL - the .wasm file is in the same directory\n let url = wasmUrl;\n if (!url) {\n try {\n url = new URL('./renderart_wasm_bg.wasm', import.meta.url).href;\n } catch {\n url = 'renderart_wasm_bg.wasm';\n }\n }\n \n // Initialize - the default export is the init function\n // @ts-ignore\n await wasmModule.default(url);\n \n wasm = wasmModule;\n wasmReady = true;\n } catch (e) {\n initError = new Error(`Failed to initialize WASM: ${e}`);\n initPromise = null;\n throw initError;\n }\n })();\n \n return initPromise;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasmReady;\n}\n\n/** Check if WASM loading failed */\nexport function hasWasmError(): boolean {\n return initError !== null;\n}\n\n/** Get WASM loading error if any */\nexport function getWasmError(): Error | null {\n return initError;\n}\n\n/** Ensure WASM is loaded, auto-init if needed */\nasync function ensureWasm(): Promise<void> {\n if (!wasmReady) {\n await initWasm();\n }\n}\n\n/** Get output data from WASM memory */\nfunction getOutputData(result: { ptr: number; len: number }): Uint8ClampedArray {\n const memory = wasm.get_memory();\n const buffer = new Uint8Array(memory.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// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM (auto-initializes) */\nexport class CrtCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use CrtCpuRenderer.create()');\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 result = wasm.crt_upscale_config(\n data, 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,\n options.enableScanlines !== false,\n options.enableMask !== false\n );\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.initialized = false;\n }\n}\n\n// ============================================================================\n// HEX CPU Renderer\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/** HEX CPU Renderer using WASM (auto-initializes) */\nexport class HexCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use HexCpuRenderer.create()');\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 const result = wasm.hex_upscale_config(\n data, width, height, scale,\n options.orientation === 'pointy-top' ? 1 : 0,\n options.drawBorders ?? false,\n parseColorToU32(options.borderColor, 0x282828FF),\n options.borderThickness ?? 1,\n parseColorToU32(options.backgroundColor, 0x00000000)\n );\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.initialized || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const dims = wasm.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.initialized = false;\n }\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM (auto-initializes) */\nexport class XbrzCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render xBRZ scaling */\n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use XbrzCpuRenderer.create()');\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 result = wasm.xbrz_upscale_config(\n data, 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 return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.initialized = 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"]}
1
+ {"version":3,"sources":["../src/crt-gpu.ts","../src/hex-gpu.ts","../src/wasm-loader.ts","../src/renderart.ts"],"names":["VERTEX_SHADER","FRAGMENT_SHADER"],"mappings":"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","file":"index.js","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 * Handles loading and initialization of the Rust WASM module.\n * Auto-initializes on first use.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// WASM module reference (loaded dynamically)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet wasm: any = null;\n\n// Track initialization state\nlet wasmReady = false;\nlet initPromise: Promise<void> | null = null;\nlet initError: Error | null = null;\n\n/**\n * Initialize WASM module (auto-called on first use)\n * Can be called manually to pre-load WASM.\n * \n * @param wasmUrl - Optional URL to the .wasm file.\n */\nexport async function initWasm(wasmUrl?: string): Promise<void> {\n if (wasmReady) return;\n if (initError) throw initError;\n \n if (initPromise) return initPromise;\n \n initPromise = (async () => {\n try {\n // Dynamic import of the WASM glue code directly\n // @ts-ignore\n const wasmModule = await import('./renderart_wasm_bg.js');\n \n // The default export from _bg.js is __wbg_init\n // @ts-ignore\n const init = wasmModule.default;\n \n if (typeof init !== 'function') {\n console.error('WASM module exports:', Object.keys(wasmModule));\n throw new Error('WASM init is not a function: ' + typeof init);\n }\n \n await init();\n \n wasm = wasmModule;\n wasmReady = true;\n } catch (e) {\n initError = new Error(`Failed to initialize WASM: ${e}`);\n initPromise = null;\n throw initError;\n }\n })();\n \n return initPromise;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasmReady;\n}\n\n/** Check if WASM loading failed */\nexport function hasWasmError(): boolean {\n return initError !== null;\n}\n\n/** Get WASM loading error if any */\nexport function getWasmError(): Error | null {\n return initError;\n}\n\n/** Ensure WASM is loaded, auto-init if needed */\nasync function ensureWasm(): Promise<void> {\n if (!wasmReady) {\n await initWasm();\n }\n}\n\n/** Get output data from WASM memory */\nfunction getOutputData(result: { ptr: number; len: number }): Uint8ClampedArray {\n const memory = wasm.get_memory();\n const buffer = new Uint8Array(memory.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// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM (auto-initializes) */\nexport class CrtCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use CrtCpuRenderer.create()');\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 result = wasm.crt_upscale_config(\n data, 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,\n options.enableScanlines !== false,\n options.enableMask !== false\n );\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.initialized = false;\n }\n}\n\n// ============================================================================\n// HEX CPU Renderer\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/** HEX CPU Renderer using WASM (auto-initializes) */\nexport class HexCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use HexCpuRenderer.create()');\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 const result = wasm.hex_upscale_config(\n data, width, height, scale,\n options.orientation === 'pointy-top' ? 1 : 0,\n options.drawBorders ?? false,\n parseColorToU32(options.borderColor, 0x282828FF),\n options.borderThickness ?? 1,\n parseColorToU32(options.backgroundColor, 0x00000000)\n );\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.initialized || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const dims = wasm.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.initialized = false;\n }\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM (auto-initializes) */\nexport class XbrzCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render xBRZ scaling */\n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use XbrzCpuRenderer.create()');\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 result = wasm.xbrz_upscale_config(\n data, 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 return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.initialized = 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/dist/index.mjs CHANGED
@@ -628,16 +628,13 @@ async function initWasm(wasmUrl) {
628
628
  if (initPromise) return initPromise;
629
629
  initPromise = (async () => {
630
630
  try {
631
- const wasmModule = await import('./renderart_wasm.js');
632
- let url = wasmUrl;
633
- if (!url) {
634
- try {
635
- url = new URL("./renderart_wasm_bg.wasm", import.meta.url).href;
636
- } catch {
637
- url = "renderart_wasm_bg.wasm";
638
- }
631
+ const wasmModule = await import('./renderart_wasm_bg.js');
632
+ const init = wasmModule.default;
633
+ if (typeof init !== "function") {
634
+ console.error("WASM module exports:", Object.keys(wasmModule));
635
+ throw new Error("WASM init is not a function: " + typeof init);
639
636
  }
640
- await wasmModule.default(url);
637
+ await init();
641
638
  wasm = wasmModule;
642
639
  wasmReady = true;
643
640
  } catch (e) {
@@ -1039,7 +1036,7 @@ var RenderArt = class _RenderArt {
1039
1036
  }
1040
1037
  /** Pre-initialize WASM for faster first CPU render */
1041
1038
  async preloadWasm(wasmUrl) {
1042
- await initWasm(wasmUrl);
1039
+ await initWasm();
1043
1040
  }
1044
1041
  get capabilities() {
1045
1042
  return { ...this._capabilities };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/crt-gpu.ts","../src/hex-gpu.ts","../src/wasm-loader.ts","../src/renderart.ts"],"names":["VERTEX_SHADER","FRAGMENT_SHADER"],"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 * Handles loading and initialization of the Rust WASM module.\n * Auto-initializes on first use.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// WASM module reference (loaded dynamically)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet wasm: any = null;\n\n// Track initialization state\nlet wasmReady = false;\nlet initPromise: Promise<void> | null = null;\nlet initError: Error | null = null;\n\n/**\n * Initialize WASM module (auto-called on first use)\n * Can be called manually to pre-load WASM.\n * \n * @param wasmUrl - Optional URL to the .wasm file.\n */\nexport async function initWasm(wasmUrl?: string): Promise<void> {\n if (wasmReady) return;\n if (initError) throw initError;\n \n if (initPromise) return initPromise;\n \n initPromise = (async () => {\n try {\n // Dynamic import of the WASM glue code\n // After build, renderart_wasm.js is copied to dist/ by postbuild script\n // @ts-ignore - dynamic import types are complex\n const wasmModule = await import('./renderart_wasm.js');\n \n // Resolve WASM URL - the .wasm file is in the same directory\n let url = wasmUrl;\n if (!url) {\n try {\n url = new URL('./renderart_wasm_bg.wasm', import.meta.url).href;\n } catch {\n url = 'renderart_wasm_bg.wasm';\n }\n }\n \n // Initialize - the default export is the init function\n // @ts-ignore\n await wasmModule.default(url);\n \n wasm = wasmModule;\n wasmReady = true;\n } catch (e) {\n initError = new Error(`Failed to initialize WASM: ${e}`);\n initPromise = null;\n throw initError;\n }\n })();\n \n return initPromise;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasmReady;\n}\n\n/** Check if WASM loading failed */\nexport function hasWasmError(): boolean {\n return initError !== null;\n}\n\n/** Get WASM loading error if any */\nexport function getWasmError(): Error | null {\n return initError;\n}\n\n/** Ensure WASM is loaded, auto-init if needed */\nasync function ensureWasm(): Promise<void> {\n if (!wasmReady) {\n await initWasm();\n }\n}\n\n/** Get output data from WASM memory */\nfunction getOutputData(result: { ptr: number; len: number }): Uint8ClampedArray {\n const memory = wasm.get_memory();\n const buffer = new Uint8Array(memory.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// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM (auto-initializes) */\nexport class CrtCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use CrtCpuRenderer.create()');\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 result = wasm.crt_upscale_config(\n data, 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,\n options.enableScanlines !== false,\n options.enableMask !== false\n );\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.initialized = false;\n }\n}\n\n// ============================================================================\n// HEX CPU Renderer\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/** HEX CPU Renderer using WASM (auto-initializes) */\nexport class HexCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use HexCpuRenderer.create()');\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 const result = wasm.hex_upscale_config(\n data, width, height, scale,\n options.orientation === 'pointy-top' ? 1 : 0,\n options.drawBorders ?? false,\n parseColorToU32(options.borderColor, 0x282828FF),\n options.borderThickness ?? 1,\n parseColorToU32(options.backgroundColor, 0x00000000)\n );\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.initialized || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const dims = wasm.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.initialized = false;\n }\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM (auto-initializes) */\nexport class XbrzCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render xBRZ scaling */\n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use XbrzCpuRenderer.create()');\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 result = wasm.xbrz_upscale_config(\n data, 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 return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.initialized = 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"]}
1
+ {"version":3,"sources":["../src/crt-gpu.ts","../src/hex-gpu.ts","../src/wasm-loader.ts","../src/renderart.ts"],"names":["VERTEX_SHADER","FRAGMENT_SHADER"],"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 * Handles loading and initialization of the Rust WASM module.\n * Auto-initializes on first use.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// WASM module reference (loaded dynamically)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet wasm: any = null;\n\n// Track initialization state\nlet wasmReady = false;\nlet initPromise: Promise<void> | null = null;\nlet initError: Error | null = null;\n\n/**\n * Initialize WASM module (auto-called on first use)\n * Can be called manually to pre-load WASM.\n * \n * @param wasmUrl - Optional URL to the .wasm file.\n */\nexport async function initWasm(wasmUrl?: string): Promise<void> {\n if (wasmReady) return;\n if (initError) throw initError;\n \n if (initPromise) return initPromise;\n \n initPromise = (async () => {\n try {\n // Dynamic import of the WASM glue code directly\n // @ts-ignore\n const wasmModule = await import('./renderart_wasm_bg.js');\n \n // The default export from _bg.js is __wbg_init\n // @ts-ignore\n const init = wasmModule.default;\n \n if (typeof init !== 'function') {\n console.error('WASM module exports:', Object.keys(wasmModule));\n throw new Error('WASM init is not a function: ' + typeof init);\n }\n \n await init();\n \n wasm = wasmModule;\n wasmReady = true;\n } catch (e) {\n initError = new Error(`Failed to initialize WASM: ${e}`);\n initPromise = null;\n throw initError;\n }\n })();\n \n return initPromise;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasmReady;\n}\n\n/** Check if WASM loading failed */\nexport function hasWasmError(): boolean {\n return initError !== null;\n}\n\n/** Get WASM loading error if any */\nexport function getWasmError(): Error | null {\n return initError;\n}\n\n/** Ensure WASM is loaded, auto-init if needed */\nasync function ensureWasm(): Promise<void> {\n if (!wasmReady) {\n await initWasm();\n }\n}\n\n/** Get output data from WASM memory */\nfunction getOutputData(result: { ptr: number; len: number }): Uint8ClampedArray {\n const memory = wasm.get_memory();\n const buffer = new Uint8Array(memory.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// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM (auto-initializes) */\nexport class CrtCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use CrtCpuRenderer.create()');\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 result = wasm.crt_upscale_config(\n data, 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,\n options.enableScanlines !== false,\n options.enableMask !== false\n );\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.initialized = false;\n }\n}\n\n// ============================================================================\n// HEX CPU Renderer\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/** HEX CPU Renderer using WASM (auto-initializes) */\nexport class HexCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render hexagonal effect */\n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use HexCpuRenderer.create()');\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 const result = wasm.hex_upscale_config(\n data, width, height, scale,\n options.orientation === 'pointy-top' ? 1 : 0,\n options.drawBorders ?? false,\n parseColorToU32(options.borderColor, 0x282828FF),\n options.borderThickness ?? 1,\n parseColorToU32(options.backgroundColor, 0x00000000)\n );\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.initialized || !wasm) {\n throw new Error('Renderer not initialized');\n }\n \n const dims = wasm.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.initialized = false;\n }\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM (auto-initializes) */\nexport class XbrzCpuRenderer {\n private initialized = 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 /** Initialize (loads WASM if needed) */\n async init(): Promise<void> {\n await ensureWasm();\n this.initialized = true;\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return this.initialized && wasmReady;\n }\n \n /** Render xBRZ scaling */\n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n if (!this.initialized || !wasm) {\n throw new Error('Renderer not initialized. Call init() first or use XbrzCpuRenderer.create()');\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 result = wasm.xbrz_upscale_config(\n data, 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 return {\n data: getOutputData(result),\n width: result.width,\n height: result.height,\n };\n }\n \n /** Dispose resources */\n dispose(): void {\n this.initialized = 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.3.3",
3
+ "version": "0.4.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",