@pixagram/renderart 0.4.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +171 -67
  3. package/dist/crt-gpu.d.ts +30 -0
  4. package/dist/crt-gpu.d.ts.map +1 -0
  5. package/dist/crt-gpu.js +282 -0
  6. package/dist/crt-gpu.js.map +1 -0
  7. package/dist/hex-gpu.d.ts +35 -0
  8. package/dist/hex-gpu.d.ts.map +1 -0
  9. package/dist/hex-gpu.js +382 -0
  10. package/dist/hex-gpu.js.map +1 -0
  11. package/dist/index.d.ts +21 -300
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +36 -963
  14. package/dist/index.js.map +1 -1
  15. package/dist/types.d.ts +84 -0
  16. package/dist/types.d.ts.map +1 -0
  17. package/dist/types.js +7 -0
  18. package/dist/types.js.map +1 -0
  19. package/dist/wasm-wrapper.d.ts +71 -0
  20. package/dist/wasm-wrapper.d.ts.map +1 -0
  21. package/dist/wasm-wrapper.js +76 -0
  22. package/dist/wasm-wrapper.js.map +1 -0
  23. package/dist/xbrz-gpu.d.ts +34 -0
  24. package/dist/xbrz-gpu.d.ts.map +1 -0
  25. package/dist/xbrz-gpu.js +640 -0
  26. package/dist/xbrz-gpu.js.map +1 -0
  27. package/package.json +48 -35
  28. package/src/crt-gpu.ts +313 -0
  29. package/src/hex-gpu.ts +426 -0
  30. package/src/index.ts +52 -0
  31. package/src/types.ts +90 -0
  32. package/src/wasm/crt.rs +181 -0
  33. package/src/wasm/hex.rs +324 -0
  34. package/src/wasm/lib.rs +285 -0
  35. package/src/wasm/xbrz.rs +262 -0
  36. package/src/wasm-wrapper.ts +195 -0
  37. package/src/xbrz-gpu.ts +671 -0
  38. package/dist/index.d.mts +0 -305
  39. package/dist/index.mjs +0 -948
  40. package/dist/index.mjs.map +0 -1
  41. package/pkg/LICENSE +0 -21
  42. package/pkg/README.md +0 -117
  43. package/pkg/renderart_wasm.d.ts +0 -52
  44. package/pkg/renderart_wasm.js +0 -5
  45. package/pkg/renderart_wasm_bg.js +0 -283
  46. package/pkg/renderart_wasm_bg.wasm +0 -0
  47. package/pkg/renderart_wasm_bg.wasm.d.ts +0 -24
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 * Simple manual initialization pattern.\n * User must call initWasm() with the WASM module before using CPU renderers.\n */\n\nimport type { \n CrtOptions, \n HexOptions, \n XbrzOptions, \n ImageInput, \n ImageOutput,\n HexOrientation,\n} from './types';\n\n// WASM module reference\nlet wasm: any = null;\nlet wasmReady = false;\n\n/**\n * Initialize WASM module.\n * \n * @example\n * ```typescript\n * import init, * as wasmModule from '@pixagram/renderart/dist/renderart_wasm_bg.js';\n * import { initWasm } from '@pixagram/renderart';\n * \n * await init();\n * initWasm(wasmModule);\n * ```\n */\nexport function initWasm(wasmModule: any): void {\n wasm = wasmModule;\n wasmReady = true;\n}\n\n/** Check if WASM is loaded */\nexport function isWasmLoaded(): boolean {\n return wasmReady;\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/** Ensure WASM is loaded */\nfunction ensureWasm(): void {\n if (!wasmReady || !wasm) {\n throw new Error('WASM not initialized. Call initWasm() first.');\n }\n}\n\n// ============================================================================\n// CRT CPU Renderer\n// ============================================================================\n\n/** CRT CPU Renderer using WASM */\nexport class CrtCpuRenderer {\n /** Create renderer (WASM must be initialized first) */\n static create(): CrtCpuRenderer {\n ensureWasm();\n return new CrtCpuRenderer();\n }\n \n /** Check if renderer is ready */\n isReady(): boolean {\n return wasmReady;\n }\n \n /** Render CRT effect */\n render(input: ImageInput | ImageData, options: CrtOptions = {}): ImageOutput {\n ensureWasm();\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(): void {}\n}\n\n// ============================================================================\n// HEX CPU Renderer\n// ============================================================================\n\nfunction parseColorToU32(color: string | number | undefined, defaultVal: number): number {\n if (color === undefined) return defaultVal;\n if (typeof color === 'number') return color;\n if (color === 'transparent') return 0x00000000;\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 6) return (parseInt(hex, 16) << 8) | 0xFF;\n if (hex.length === 8) return parseInt(hex, 16);\n }\n return defaultVal;\n}\n\n/** HEX CPU Renderer using WASM */\nexport class HexCpuRenderer {\n static create(): HexCpuRenderer {\n ensureWasm();\n return new HexCpuRenderer();\n }\n \n isReady(): boolean {\n return wasmReady;\n }\n \n render(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n ensureWasm();\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 getDimensions(srcWidth: number, srcHeight: number, scale: number, orientation: HexOrientation = 'flat-top'): { width: number; height: number } {\n ensureWasm();\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(): void {}\n}\n\n// ============================================================================\n// XBRZ CPU Renderer\n// ============================================================================\n\n/** XBRZ CPU Renderer using WASM */\nexport class XbrzCpuRenderer {\n static create(): XbrzCpuRenderer {\n ensureWasm();\n return new XbrzCpuRenderer();\n }\n \n isReady(): boolean {\n return wasmReady;\n }\n \n render(input: ImageInput | ImageData, options: XbrzOptions = {}): ImageOutput {\n ensureWasm();\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(): void {}\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 require WASM initialization.\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} 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 ensureCpu(): CrtCpuRenderer {\n if (!this.cpuRenderer) {\n this.cpuRenderer = CrtCpuRenderer.create();\n }\n return this.cpuRenderer;\n }\n\n /** Render with options or preset */\n render(\n input: ImageInput | ImageData,\n optionsOrPreset: CrtOptions | CrtPreset = {}\n ): ImageOutput {\n const options = typeof optionsOrPreset === 'string' \n ? { ...CRT_PRESETS[optionsOrPreset] }\n : optionsOrPreset;\n \n const backend = options.backend ?? 'auto';\n \n if (backend === 'gpu' || (backend === 'auto' && this.gpuAvailable)) {\n return this.ensureGpu().render(input, options);\n }\n \n return this.ensureCpu().render(input, options);\n }\n\n /** Synchronous GPU-only render */\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 ensureCpu(): HexCpuRenderer {\n if (!this.cpuRenderer) {\n this.cpuRenderer = HexCpuRenderer.create();\n }\n return this.cpuRenderer;\n }\n\n render(\n input: ImageInput | ImageData,\n optionsOrPreset: HexOptions | HexPreset = {}\n ): ImageOutput {\n const options = typeof optionsOrPreset === 'string'\n ? { ...HEX_PRESETS[optionsOrPreset] }\n : optionsOrPreset;\n \n const backend = options.backend ?? 'auto';\n \n if (backend === 'gpu' || (backend === 'auto' && this.gpuAvailable)) {\n return this.ensureGpu().render(input, options);\n }\n \n return this.ensureCpu().render(input, options);\n }\n\n renderSync(input: ImageInput | ImageData, options: HexOptions = {}): ImageOutput {\n return this.ensureGpu().render(input, options);\n }\n\n getDimensions(\n srcWidth: number,\n srcHeight: number,\n options: HexOptions = {}\n ): { 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 (CPU only)\n// ============================================================================\n\n/** XBRZ rendering engine (CPU/WASM only) */\nexport class XbrzEngine {\n private cpuRenderer: XbrzCpuRenderer | null = null;\n\n private ensureCpu(): XbrzCpuRenderer {\n if (!this.cpuRenderer) {\n this.cpuRenderer = XbrzCpuRenderer.create();\n }\n return this.cpuRenderer;\n }\n\n render(\n input: ImageInput | ImageData,\n optionsOrPreset: XbrzOptions | XbrzPreset = {}\n ): ImageOutput {\n const options = typeof optionsOrPreset === 'string'\n ? { ...XBRZ_PRESETS[optionsOrPreset] }\n : optionsOrPreset;\n \n return this.ensureCpu().render(input, options);\n }\n\n dispose(): void {\n this.cpuRenderer?.dispose();\n this.cpuRenderer = null;\n }\n}\n\n// ============================================================================\n// RenderArt - Main API\n// ============================================================================\n\n/** Main RenderArt instance */\nexport class RenderArt {\n readonly crt: CrtEngine;\n readonly hex: HexEngine;\n readonly xbrz: XbrzEngine;\n readonly capabilities: RendererCapabilities;\n\n private constructor(capabilities: RendererCapabilities) {\n this.capabilities = capabilities;\n this.crt = new CrtEngine(capabilities.gpu);\n this.hex = new HexEngine(capabilities.gpu);\n this.xbrz = new XbrzEngine();\n }\n\n /**\n * Create RenderArt instance.\n * For CPU/WASM support, call initWasm() first.\n */\n static create(): RenderArt {\n const gpuAvailable = checkWebGL2();\n const cpuAvailable = isWasmLoaded();\n \n return new RenderArt({\n gpu: gpuAvailable,\n cpu: cpuAvailable,\n maxTextureSize: gpuAvailable ? getMaxTextureSize() : 0,\n recommendedBackend: gpuAvailable ? 'gpu' : cpuAvailable ? 'cpu' : 'gpu',\n });\n }\n\n /**\n * Create GPU-only RenderArt instance (no WASM needed).\n */\n static createGpuOnly(): RenderArt {\n const gpuAvailable = checkWebGL2();\n \n if (!gpuAvailable) {\n throw new Error('WebGL2 not available');\n }\n \n return new RenderArt({\n gpu: true,\n cpu: false,\n maxTextureSize: getMaxTextureSize(),\n recommendedBackend: 'gpu',\n });\n }\n\n dispose(): void {\n this.crt.dispose();\n this.hex.dispose();\n this.xbrz.dispose();\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExD,qBAAqB;AACrB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE1E,gBAAgB;AAChB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D,iDAAiD;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mCAAmC;IACnC,GAAG,EAAE,GAAG,EAAE;QACR,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IACD,uCAAuC;IACvC,GAAG,EAAE,GAAG,EAAE;QACR,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IACD,wCAAwC;IACxC,IAAI,EAAE,GAAG,EAAE;QACT,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,eAAe,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;CACF,CAAC;AAEF,4BAA4B;AAC5B,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * RenderArt Shared Types
3
+ *
4
+ * Common type definitions for all rendering engines.
5
+ */
6
+ /** Input image data */
7
+ export interface ImageInput {
8
+ /** Raw RGBA pixel data */
9
+ data: Uint8ClampedArray | Uint8Array;
10
+ /** Image width in pixels */
11
+ width: number;
12
+ /** Image height in pixels */
13
+ height: number;
14
+ }
15
+ /** Output image data */
16
+ export interface ImageOutput {
17
+ /** Raw RGBA pixel data */
18
+ data: Uint8ClampedArray;
19
+ /** Output width in pixels */
20
+ width: number;
21
+ /** Output height in pixels */
22
+ height: number;
23
+ }
24
+ /** Base renderer interface */
25
+ export interface Renderer<TOptions = object> {
26
+ /** Check if renderer is ready for use */
27
+ isReady(): boolean;
28
+ /** Render image with given options */
29
+ render(input: ImageInput | ImageData, options?: TOptions): ImageOutput;
30
+ /** Dispose of renderer resources */
31
+ dispose(): void;
32
+ }
33
+ /** CRT effect options */
34
+ export interface CrtOptions {
35
+ /** Output scale factor (2-32, default: 3) */
36
+ scale?: number;
37
+ /** Horizontal warp amount (default: 0.015) */
38
+ warpX?: number;
39
+ /** Vertical warp amount (default: 0.02) */
40
+ warpY?: number;
41
+ /** Scanline hardness, negative values (default: -4.0) */
42
+ scanHardness?: number;
43
+ /** Scanline opacity (0-1, default: 0.5) */
44
+ scanOpacity?: number;
45
+ /** Shadow mask opacity (0-1, default: 0.3) */
46
+ maskOpacity?: number;
47
+ /** Enable barrel distortion (default: true) */
48
+ enableWarp?: boolean;
49
+ /** Enable scanline effect (default: true) */
50
+ enableScanlines?: boolean;
51
+ /** Enable shadow mask (default: true) */
52
+ enableMask?: boolean;
53
+ }
54
+ /** Hexagonal grid orientation */
55
+ export type HexOrientation = 'flat-top' | 'pointy-top';
56
+ /** Hexagonal grid options */
57
+ export interface HexOptions {
58
+ /** Output scale factor (2-32, default: 16) */
59
+ scale?: number;
60
+ /** Hexagon orientation (default: 'flat-top') */
61
+ orientation?: HexOrientation;
62
+ /** Draw borders between hexagons (default: false) */
63
+ drawBorders?: boolean;
64
+ /** Border color as CSS color string or RGBA number (default: '#282828') */
65
+ borderColor?: string | number;
66
+ /** Border thickness in pixels (default: 1) */
67
+ borderThickness?: number;
68
+ /** Background color for out-of-bounds areas (default: 'transparent') */
69
+ backgroundColor?: string | number;
70
+ }
71
+ /** xBRZ scaling options */
72
+ export interface XbrzOptions {
73
+ /** Output scale factor (2-6, default: 2) */
74
+ scale?: number;
75
+ /** Luminance weight for color comparison (default: 1.0) */
76
+ luminanceWeight?: number;
77
+ /** Color equality tolerance (0-255, default: 30) */
78
+ equalColorTolerance?: number;
79
+ /** Steep direction threshold (default: 2.2) */
80
+ steepDirectionThreshold?: number;
81
+ /** Dominant direction threshold (default: 3.6) */
82
+ dominantDirectionThreshold?: number;
83
+ }
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uBAAuB;AACvB,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAAC;IACrC,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,8BAA8B;AAC9B,MAAM,WAAW,QAAQ,CAAC,QAAQ,GAAG,MAAM;IACzC,yCAAyC;IACzC,OAAO,IAAI,OAAO,CAAC;IACnB,sCAAsC;IACtC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACvE,oCAAoC;IACpC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvD,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kDAAkD;IAClD,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * RenderArt Shared Types
3
+ *
4
+ * Common type definitions for all rendering engines.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * RenderArt WASM Module Wrapper
3
+ *
4
+ * Provides TypeScript type definitions and helper functions
5
+ * for the WebAssembly module.
6
+ */
7
+ import type { CrtOptions, HexOptions, HexOrientation, ImageOutput, XbrzOptions } from './types';
8
+ /** WASM upscale result structure */
9
+ export interface WasmUpscaleResult {
10
+ /** Pointer to output data in WASM memory */
11
+ ptr: number;
12
+ /** Length of output data in bytes */
13
+ len: number;
14
+ /** Output width in pixels */
15
+ width: number;
16
+ /** Output height in pixels */
17
+ height: number;
18
+ }
19
+ /** WASM module interface */
20
+ export interface RenderArtWasm {
21
+ /** Get WASM memory for reading output buffers */
22
+ get_memory(): WebAssembly.Memory;
23
+ /** CRT upscale with default config */
24
+ crt_upscale(data: Uint8Array, width: number, height: number, scale: number): WasmUpscaleResult;
25
+ /** CRT upscale with full config */
26
+ crt_upscale_config(data: Uint8Array, width: number, height: number, scale: number, warp_x: number, warp_y: number, scan_hardness: number, scan_opacity: number, mask_opacity: number, enable_warp: boolean, enable_scanlines: boolean, enable_mask: boolean): WasmUpscaleResult;
27
+ /** HEX upscale with default config */
28
+ hex_upscale(data: Uint8Array, width: number, height: number, scale: number): WasmUpscaleResult;
29
+ /** HEX upscale with full config */
30
+ hex_upscale_config(data: Uint8Array, width: number, height: number, scale: number, orientation: number, draw_borders: boolean, border_color: number, border_thickness: number, background_color: number): WasmUpscaleResult;
31
+ /** Get HEX output dimensions */
32
+ hex_get_dimensions(width: number, height: number, scale: number, orientation: number): Uint32Array;
33
+ /** xBRZ upscale with default config */
34
+ xbrz_upscale(data: Uint8Array, width: number, height: number, scale: number): WasmUpscaleResult;
35
+ /** xBRZ upscale with full config */
36
+ xbrz_upscale_config(data: Uint8Array, width: number, height: number, scale: number, luminance_weight: number, equal_color_tolerance: number, dominant_direction_threshold: number, steep_direction_threshold: number): WasmUpscaleResult;
37
+ }
38
+ /** Helper to read WASM output into ImageOutput */
39
+ export declare function readWasmOutput(wasm: RenderArtWasm, result: WasmUpscaleResult): ImageOutput;
40
+ /** Parse color to RGBA number for WASM */
41
+ export declare function colorToRgba(color: string | number | undefined, defaultValue: number): number;
42
+ /** Convert HexOrientation string to number for WASM */
43
+ export declare function orientationToNumber(orientation: HexOrientation | undefined): number;
44
+ /**
45
+ * High-level WASM renderer wrapper
46
+ *
47
+ * Provides the same interface as GPU renderers but uses WASM.
48
+ */
49
+ export declare class WasmRenderer {
50
+ private wasm;
51
+ constructor(wasm: RenderArtWasm);
52
+ /** Render CRT effect */
53
+ renderCrt(input: ImageData | {
54
+ data: Uint8Array;
55
+ width: number;
56
+ height: number;
57
+ }, options?: CrtOptions): ImageOutput;
58
+ /** Render hexagonal effect */
59
+ renderHex(input: ImageData | {
60
+ data: Uint8Array;
61
+ width: number;
62
+ height: number;
63
+ }, options?: HexOptions): ImageOutput;
64
+ /** Render xBRZ effect */
65
+ renderXbrz(input: ImageData | {
66
+ data: Uint8Array;
67
+ width: number;
68
+ height: number;
69
+ }, options?: XbrzOptions): ImageOutput;
70
+ }
71
+ //# sourceMappingURL=wasm-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm-wrapper.d.ts","sourceRoot":"","sources":["../src/wasm-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * RenderArt WASM Module Wrapper
3
+ *
4
+ * Provides TypeScript type definitions and helper functions
5
+ * for the WebAssembly module.
6
+ */
7
+ /** Helper to read WASM output into ImageOutput */
8
+ export function readWasmOutput(wasm, result) {
9
+ const memory = wasm.get_memory();
10
+ const data = new Uint8ClampedArray(memory.buffer, result.ptr, result.len);
11
+ // Copy the data to avoid issues with WASM memory growth
12
+ return {
13
+ data: new Uint8ClampedArray(data),
14
+ width: result.width,
15
+ height: result.height,
16
+ };
17
+ }
18
+ /** Parse color to RGBA number for WASM */
19
+ export function colorToRgba(color, defaultValue) {
20
+ if (color === undefined)
21
+ return defaultValue;
22
+ if (typeof color === 'number')
23
+ return color;
24
+ if (color === 'transparent')
25
+ return 0x00000000;
26
+ if (color.startsWith('#')) {
27
+ const hex = color.slice(1);
28
+ if (hex.length === 6) {
29
+ return (parseInt(hex, 16) << 8) | 0xFF;
30
+ }
31
+ if (hex.length === 8) {
32
+ return parseInt(hex, 16);
33
+ }
34
+ }
35
+ return defaultValue;
36
+ }
37
+ /** Convert HexOrientation string to number for WASM */
38
+ export function orientationToNumber(orientation) {
39
+ return orientation === 'pointy-top' ? 1 : 0;
40
+ }
41
+ /**
42
+ * High-level WASM renderer wrapper
43
+ *
44
+ * Provides the same interface as GPU renderers but uses WASM.
45
+ */
46
+ export class WasmRenderer {
47
+ wasm;
48
+ constructor(wasm) {
49
+ this.wasm = wasm;
50
+ }
51
+ /** Render CRT effect */
52
+ renderCrt(input, options = {}) {
53
+ const data = input instanceof ImageData ? new Uint8Array(input.data.buffer) : input.data;
54
+ const { width, height } = input;
55
+ const scale = Math.min(32, Math.max(2, options.scale ?? 3));
56
+ const result = this.wasm.crt_upscale_config(data, width, height, scale, options.warpX ?? 0.015, options.warpY ?? 0.02, options.scanHardness ?? -4.0, options.scanOpacity ?? 0.5, options.maskOpacity ?? 0.3, options.enableWarp !== false, options.enableScanlines !== false, options.enableMask !== false);
57
+ return readWasmOutput(this.wasm, result);
58
+ }
59
+ /** Render hexagonal effect */
60
+ renderHex(input, options = {}) {
61
+ const data = input instanceof ImageData ? new Uint8Array(input.data.buffer) : input.data;
62
+ const { width, height } = input;
63
+ const scale = Math.min(32, Math.max(2, options.scale ?? 16));
64
+ const result = this.wasm.hex_upscale_config(data, width, height, scale, orientationToNumber(options.orientation), options.drawBorders ?? false, colorToRgba(options.borderColor, 0x282828FF), options.borderThickness ?? 1, colorToRgba(options.backgroundColor, 0x00000000));
65
+ return readWasmOutput(this.wasm, result);
66
+ }
67
+ /** Render xBRZ effect */
68
+ renderXbrz(input, options = {}) {
69
+ const data = input instanceof ImageData ? new Uint8Array(input.data.buffer) : input.data;
70
+ const { width, height } = input;
71
+ const scale = Math.min(6, Math.max(2, options.scale ?? 2));
72
+ const result = this.wasm.xbrz_upscale_config(data, width, height, scale, options.luminanceWeight ?? 1.0, options.equalColorTolerance ?? 30, options.dominantDirectionThreshold ?? 4.4, options.steepDirectionThreshold ?? 2.2);
73
+ return readWasmOutput(this.wasm, result);
74
+ }
75
+ }
76
+ //# sourceMappingURL=wasm-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm-wrapper.js","sourceRoot":"","sources":["../src/wasm-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * xBRZ GPU Renderer using WebGL2
3
+ *
4
+ * High-performance xBRZ pixel art scaling using fragment shaders.
5
+ * Based on Hyllian's xBRZ algorithm.
6
+ *
7
+ * Copyright (C) 2014-2016 DeSmuME team (shader algorithms)
8
+ * Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
9
+ */
10
+ import type { ImageInput, ImageOutput, Renderer, XbrzOptions } from './types';
11
+ /** xBRZ GPU Renderer */
12
+ export declare class XbrzGpuRenderer implements Renderer<XbrzOptions> {
13
+ private gl;
14
+ private canvas;
15
+ private program;
16
+ private texture;
17
+ private uniforms;
18
+ private initialized;
19
+ private currentCanvasSize;
20
+ private currentTexSize;
21
+ /** Create a new xBRZ GPU renderer */
22
+ static create(): XbrzGpuRenderer;
23
+ private init;
24
+ private createShader;
25
+ /** Check if renderer is ready */
26
+ isReady(): boolean;
27
+ /** Render xBRZ effect */
28
+ render(input: ImageInput | ImageData, options?: XbrzOptions): ImageOutput;
29
+ /** Dispose resources */
30
+ dispose(): void;
31
+ }
32
+ /** xBRZ presets */
33
+ export declare const XBRZ_PRESETS: Record<string, Partial<XbrzOptions>>;
34
+ //# sourceMappingURL=xbrz-gpu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xbrz-gpu.d.ts","sourceRoot":"","sources":["../src/xbrz-gpu.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA+c9E,wBAAwB;AACxB,qBAAa,eAAgB,YAAW,QAAQ,CAAC,WAAW,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAuC;IACjD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,cAAc,CAA2B;IAEjD,qCAAqC;IACrC,MAAM,CAAC,MAAM,IAAI,eAAe;IAMhC,OAAO,CAAC,IAAI;IAsEZ,OAAO,CAAC,YAAY;IAepB,iCAAiC;IACjC,OAAO,IAAI,OAAO;IAIlB,yBAAyB;IACzB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,OAAO,GAAE,WAAgB,GAAG,WAAW;IAuD7E,wBAAwB;IACxB,OAAO,IAAI,IAAI;CAShB;AAED,mBAAmB;AACnB,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAoB7D,CAAC"}