@pixagram/renderart 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,9 +4,15 @@ High-performance pixel art rendering engines with GPU (WebGL2) and CPU (WASM) su
4
4
 
5
5
  ## Features
6
6
 
7
- - **CRT Effect** (2-32x) - Classic CRT display simulation
8
- - **HEX Upscaling** (2-32x) - Hexagonal grid transformation
9
- - **XBRZ Scaling** (2-6x) - Edge-preserving pixel art scaling
7
+ - **CRT Effect** (2-32x) - Classic CRT display simulation with barrel distortion, scanlines, and shadow mask
8
+ - **HEX Upscaling** (2-32x) - Transform pixel art into hexagonal grid representations
9
+ - **XBRZ Scaling** (2-6x) - Edge-preserving pixel art scaling algorithm
10
+
11
+ All engines support:
12
+ - ⚡ **GPU acceleration** via WebGL2 (CRT, HEX)
13
+ - 🦀 **CPU fallback** via Rust/WASM (all engines)
14
+ - 🎨 **Customizable presets** and fine-grained options
15
+ - 🔄 **Auto-initialization** - WASM loads automatically on first use
10
16
 
11
17
  ## Installation
12
18
 
@@ -14,70 +20,115 @@ High-performance pixel art rendering engines with GPU (WebGL2) and CPU (WASM) su
14
20
  npm install @pixagram/renderart
15
21
  ```
16
22
 
17
- ## Quick Start
23
+ ## ⚠️ Building from Source (Required)
18
24
 
19
- ### GPU-Only (Simplest - No WASM needed)
25
+ The package includes placeholder WASM. You **must** build the actual WASM module:
20
26
 
21
- ```typescript
22
- import { CrtGpuRenderer } from '@pixagram/renderart';
27
+ ```bash
28
+ # Prerequisites: Rust + wasm-pack
29
+ # Install wasm-pack: https://rustwasm.github.io/wasm-pack/installer/
23
30
 
24
- const crt = CrtGpuRenderer.create();
25
- const result = crt.render(imageData, { scale: 3 });
31
+ cd node_modules/@pixagram/renderart
32
+ npm run build:wasm
33
+ ```
26
34
 
27
- // Use the result
28
- ctx.putImageData(new ImageData(result.data, result.width, result.height), 0, 0);
35
+ Or build everything:
36
+ ```bash
37
+ npm run build
29
38
  ```
30
39
 
31
- ### With CPU Fallback (Auto WASM loading)
40
+ ## Quick Start
32
41
 
33
42
  ```typescript
34
- import { RenderArt, setWasmUrl } from '@pixagram/renderart';
43
+ import { RenderArt } from '@pixagram/renderart';
35
44
 
36
- // Configure WASM path (copy renderart_wasm.wasm to your public folder)
37
- setWasmUrl('/wasm/renderart_wasm.wasm');
45
+ // Create renderer (auto-initializes WASM)
46
+ const renderer = await RenderArt.create();
38
47
 
39
- const renderer = RenderArt.create();
48
+ // Get your image data
49
+ const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
40
50
 
41
- // GPU when available, auto-loads WASM for CPU fallback
42
- const result = await renderer.crt.render(imageData, { scale: 3 });
51
+ // Apply CRT effect
52
+ const crtResult = await renderer.crt.render(imageData, { scale: 3 });
43
53
 
44
- // XBRZ is CPU-only (auto-loads WASM on first use)
54
+ // Apply HEX effect
55
+ const hexResult = await renderer.hex.render(imageData, { scale: 16 });
56
+
57
+ // Apply XBRZ scaling
45
58
  const xbrzResult = await renderer.xbrz.render(imageData, { scale: 4 });
59
+
60
+ // Use the result
61
+ ctx.putImageData(new ImageData(crtResult.data, crtResult.width, crtResult.height), 0, 0);
46
62
  ```
47
63
 
48
- ### Pre-load WASM
64
+ ### GPU-Only Mode (Sync, No WASM)
49
65
 
50
66
  ```typescript
51
- import { initWasm, setWasmUrl } from '@pixagram/renderart';
67
+ import { RenderArt } from '@pixagram/renderart';
52
68
 
53
- // Pre-load WASM for faster first CPU render
54
- setWasmUrl('/wasm/renderart_wasm.wasm');
55
- await initWasm();
69
+ // Create GPU-only renderer (no WASM loading)
70
+ const renderer = RenderArt.createGpuOnly();
71
+
72
+ // Synchronous rendering
73
+ const result = renderer.crt.renderSync(imageData, { scale: 3 });
56
74
  ```
57
75
 
58
- ## WASM Setup
76
+ ### Direct Renderer Usage
59
77
 
60
- 1. Build the WASM module:
61
- ```bash
62
- cd node_modules/@pixagram/renderart
63
- npm run build:wasm
64
- ```
78
+ ```typescript
79
+ import { CrtGpuRenderer } from '@pixagram/renderart';
65
80
 
66
- 2. Copy `wasm/renderart_wasm.wasm` to your public folder
81
+ // Use GPU renderer directly (no WASM needed)
82
+ const crt = CrtGpuRenderer.create();
83
+ const result = crt.render(imageData, { scale: 3 });
84
+ crt.dispose();
85
+ ```
67
86
 
68
- 3. Configure the path:
69
- ```typescript
70
- import { setWasmUrl } from '@pixagram/renderart';
71
- setWasmUrl('/your/path/renderart_wasm.wasm');
72
- ```
87
+ ## Webpack Configuration
88
+
89
+ For webpack 5, add to your webpack.config.js:
90
+
91
+ ```javascript
92
+ module.exports = {
93
+ experiments: {
94
+ asyncWebAssembly: true,
95
+ },
96
+ module: {
97
+ rules: [
98
+ {
99
+ test: /\.wasm$/,
100
+ type: 'webassembly/async',
101
+ },
102
+ ],
103
+ },
104
+ };
105
+ ```
73
106
 
74
107
  ## API Reference
75
108
 
76
- ### CRT Options
109
+ ### RenderArt (Unified API)
77
110
 
78
111
  ```typescript
79
- {
80
- scale: 3, // 2-32
112
+ // With CPU fallback (auto-loads WASM)
113
+ const renderer = await RenderArt.create();
114
+
115
+ // GPU-only mode
116
+ const renderer = RenderArt.createGpuOnly();
117
+
118
+ // Access capabilities
119
+ console.log(renderer.capabilities);
120
+ // { gpu: true, cpu: true, maxTextureSize: 16384, recommendedBackend: 'gpu' }
121
+
122
+ // Cleanup
123
+ renderer.dispose();
124
+ ```
125
+
126
+ ### CRT Engine
127
+
128
+ ```typescript
129
+ // Async with auto backend selection
130
+ const result = await renderer.crt.render(imageData, {
131
+ scale: 3, // 2-32 (default: 3)
81
132
  warpX: 0.015, // Horizontal curvature
82
133
  warpY: 0.02, // Vertical curvature
83
134
  scanHardness: -4.0, // Scanline sharpness
@@ -87,59 +138,85 @@ await initWasm();
87
138
  enableScanlines: true,
88
139
  enableMask: true,
89
140
  backend: 'auto', // 'gpu', 'cpu', or 'auto'
90
- }
141
+ });
142
+
143
+ // With preset
144
+ const result = await renderer.crt.render(imageData, 'authentic');
145
+ // Presets: 'default', 'authentic', 'subtle', 'flat'
146
+
147
+ // Sync GPU-only
148
+ const result = renderer.crt.renderSync(imageData, { scale: 3 });
91
149
  ```
92
150
 
93
- ### HEX Options
151
+ ### HEX Engine
94
152
 
95
153
  ```typescript
96
- {
97
- scale: 16, // 2-32
154
+ const result = await renderer.hex.render(imageData, {
155
+ scale: 16, // 2-32 (default: 16)
98
156
  orientation: 'flat-top', // 'flat-top' or 'pointy-top'
99
- drawBorders: false,
157
+ drawBorders: true,
100
158
  borderColor: '#282828',
101
159
  borderThickness: 1,
102
160
  backgroundColor: 'transparent',
103
- backend: 'auto',
104
- }
161
+ });
162
+
163
+ // Presets: 'default', 'bordered', 'pointy'
164
+ const result = await renderer.hex.render(imageData, 'bordered');
165
+
166
+ // Get output dimensions
167
+ const dims = renderer.hex.getDimensions(64, 64, { scale: 16 });
105
168
  ```
106
169
 
107
- ### XBRZ Options
170
+ ### XBRZ Engine (CPU Only)
108
171
 
109
172
  ```typescript
110
- {
111
- scale: 4, // 2-6
173
+ const result = await renderer.xbrz.render(imageData, {
174
+ scale: 4, // 2-6 (default: 2)
112
175
  luminanceWeight: 1.0,
113
176
  equalColorTolerance: 30,
114
177
  dominantDirectionThreshold: 4.4,
115
178
  steepDirectionThreshold: 2.2,
116
- }
179
+ });
180
+
181
+ // Presets: 'default', 'sharp', 'smooth'
182
+ const result = await renderer.xbrz.render(imageData, 'sharp');
117
183
  ```
118
184
 
119
- ## Presets
185
+ ## Backend Support
120
186
 
121
- ```typescript
122
- // CRT presets
123
- renderer.crt.render(imageData, 'authentic'); // Strong CRT look
124
- renderer.crt.render(imageData, 'subtle'); // Light CRT effect
125
- renderer.crt.render(imageData, 'flat'); // No curvature
126
-
127
- // HEX presets
128
- renderer.hex.render(imageData, 'bordered'); // With borders
129
- renderer.hex.render(imageData, 'pointy'); // Pointy-top orientation
130
-
131
- // XBRZ presets
132
- renderer.xbrz.render(imageData, 'sharp'); // Sharp edges
133
- renderer.xbrz.render(imageData, 'smooth'); // Smoother output
134
- ```
187
+ | Engine | GPU (WebGL2) | CPU (WASM) |
188
+ |--------|--------------|------------|
189
+ | CRT | Primary | ✅ Fallback |
190
+ | HEX | Primary | ✅ Fallback |
191
+ | XBRZ | ❌ N/A | Only |
192
+
193
+ ## Browser Support
194
+
195
+ - Chrome 79+
196
+ - Firefox 75+
197
+ - Safari 15+
198
+ - Edge 79+
199
+
200
+ ## Development
135
201
 
136
- ## Backend Selection
202
+ ```bash
203
+ # Clone and install
204
+ git clone https://github.com/pixagram/renderart.git
205
+ cd renderart
206
+ npm install
207
+
208
+ # Build WASM (requires Rust + wasm-pack)
209
+ npm run build:wasm
210
+
211
+ # Build TypeScript
212
+ npm run build:ts
137
213
 
138
- | Engine | GPU | CPU |
139
- |--------|-----|-----|
140
- | CRT | ✅ | ✅ |
141
- | HEX | ✅ | ✅ |
142
- | XBRZ | ❌ | ✅ |
214
+ # Full build
215
+ npm run build
216
+
217
+ # Run tests
218
+ npm test
219
+ ```
143
220
 
144
221
  ## License
145
222
 
package/dist/index.d.mts CHANGED
@@ -190,56 +190,68 @@ declare const HEX_PRESETS: Record<string, Partial<HexOptions>>;
190
190
  /**
191
191
  * WASM Module Loader
192
192
  *
193
- * Auto-initializes WASM from URL. Works with any bundler.
193
+ * Handles loading and initialization of the Rust WASM module.
194
+ * Auto-initializes on first use.
194
195
  */
195
196
 
196
197
  /**
197
- * Configure WASM loading path
198
- * Call this before using any CPU renderer if you need a custom path.
198
+ * Initialize WASM module (auto-called on first use)
199
+ * Can be called manually to pre-load WASM.
199
200
  *
200
- * @param url - URL to the renderart_wasm_bg.wasm file
201
- *
202
- * @example
203
- * ```typescript
204
- * setWasmUrl('/static/wasm/renderart_wasm_bg.wasm');
205
- * ```
206
- */
207
- declare function setWasmUrl(url: string): void;
208
- /**
209
- * Initialize WASM module
210
- * Called automatically on first CPU renderer use.
211
- * Can be called manually for preloading.
201
+ * @param wasmUrl - Optional URL to the .wasm file.
212
202
  */
213
- declare function initWasm(customUrl?: string): Promise<void>;
203
+ declare function initWasm(wasmUrl?: string): Promise<void>;
214
204
  /** Check if WASM is loaded */
215
205
  declare function isWasmLoaded(): boolean;
216
- /** CRT CPU Renderer using WASM */
206
+ /** Check if WASM loading failed */
207
+ declare function hasWasmError(): boolean;
208
+ /** Get WASM loading error if any */
209
+ declare function getWasmError(): Error | null;
210
+ /** CRT CPU Renderer using WASM (auto-initializes) */
217
211
  declare class CrtCpuRenderer {
218
- private ready;
219
- /** Create and initialize renderer (auto-loads WASM) */
212
+ private initialized;
213
+ /** Create and initialize renderer */
220
214
  static create(): Promise<CrtCpuRenderer>;
215
+ /** Initialize (loads WASM if needed) */
216
+ init(): Promise<void>;
217
+ /** Check if renderer is ready */
221
218
  isReady(): boolean;
219
+ /** Render CRT effect */
222
220
  render(input: ImageInput | ImageData, options?: CrtOptions): ImageOutput;
221
+ /** Dispose resources */
223
222
  dispose(): void;
224
223
  }
225
- /** HEX CPU Renderer using WASM */
224
+ /** HEX CPU Renderer using WASM (auto-initializes) */
226
225
  declare class HexCpuRenderer {
227
- private ready;
226
+ private initialized;
227
+ /** Create and initialize renderer */
228
228
  static create(): Promise<HexCpuRenderer>;
229
+ /** Initialize (loads WASM if needed) */
230
+ init(): Promise<void>;
231
+ /** Check if renderer is ready */
229
232
  isReady(): boolean;
233
+ /** Render hexagonal effect */
230
234
  render(input: ImageInput | ImageData, options?: HexOptions): ImageOutput;
235
+ /** Get output dimensions */
231
236
  getDimensions(srcWidth: number, srcHeight: number, scale: number, orientation?: HexOrientation): {
232
237
  width: number;
233
238
  height: number;
234
239
  };
240
+ /** Dispose resources */
235
241
  dispose(): void;
236
242
  }
237
- /** XBRZ CPU Renderer using WASM */
243
+ /** XBRZ CPU Renderer using WASM (auto-initializes) */
238
244
  declare class XbrzCpuRenderer {
239
- private ready;
245
+ private initialized;
246
+ /** Create and initialize renderer */
240
247
  static create(): Promise<XbrzCpuRenderer>;
248
+ /** Initialize (loads WASM if needed) */
249
+ init(): Promise<void>;
250
+ /** Check if renderer is ready */
241
251
  isReady(): boolean;
252
+ /** Render xBRZ scaling */
242
253
  render(input: ImageInput | ImageData, options?: XbrzOptions): ImageOutput;
254
+ /** Dispose resources */
243
255
  dispose(): void;
244
256
  }
245
257
  /** XBRZ presets */
@@ -312,4 +324,4 @@ declare class RenderArt {
312
324
  dispose(): void;
313
325
  }
314
326
 
315
- export { type Backend, CRT_PRESETS, CrtCpuRenderer, CrtEngine, CrtGpuRenderer, type CrtOptions, type CrtPreset, HEX_PRESETS, HexCpuRenderer, HexEngine, HexGpuRenderer, type HexOptions, type HexOrientation, type HexPreset, type ImageInput, type ImageOutput, type PixelData, RenderArt, type RenderStats, type Renderer, type RendererCapabilities, XBRZ_PRESETS, XbrzCpuRenderer, XbrzEngine, type XbrzOptions, type XbrzPreset, hexGetDimensions, initWasm, isWasmLoaded, setWasmUrl };
327
+ export { type Backend, CRT_PRESETS, CrtCpuRenderer, CrtEngine, CrtGpuRenderer, type CrtOptions, type CrtPreset, HEX_PRESETS, HexCpuRenderer, HexEngine, HexGpuRenderer, type HexOptions, type HexOrientation, type HexPreset, type ImageInput, type ImageOutput, type PixelData, RenderArt, type RenderStats, type Renderer, type RendererCapabilities, XBRZ_PRESETS, XbrzCpuRenderer, XbrzEngine, type XbrzOptions, type XbrzPreset, getWasmError, hasWasmError, hexGetDimensions, initWasm, isWasmLoaded };
package/dist/index.d.ts CHANGED
@@ -190,56 +190,68 @@ declare const HEX_PRESETS: Record<string, Partial<HexOptions>>;
190
190
  /**
191
191
  * WASM Module Loader
192
192
  *
193
- * Auto-initializes WASM from URL. Works with any bundler.
193
+ * Handles loading and initialization of the Rust WASM module.
194
+ * Auto-initializes on first use.
194
195
  */
195
196
 
196
197
  /**
197
- * Configure WASM loading path
198
- * Call this before using any CPU renderer if you need a custom path.
198
+ * Initialize WASM module (auto-called on first use)
199
+ * Can be called manually to pre-load WASM.
199
200
  *
200
- * @param url - URL to the renderart_wasm_bg.wasm file
201
- *
202
- * @example
203
- * ```typescript
204
- * setWasmUrl('/static/wasm/renderart_wasm_bg.wasm');
205
- * ```
206
- */
207
- declare function setWasmUrl(url: string): void;
208
- /**
209
- * Initialize WASM module
210
- * Called automatically on first CPU renderer use.
211
- * Can be called manually for preloading.
201
+ * @param wasmUrl - Optional URL to the .wasm file.
212
202
  */
213
- declare function initWasm(customUrl?: string): Promise<void>;
203
+ declare function initWasm(wasmUrl?: string): Promise<void>;
214
204
  /** Check if WASM is loaded */
215
205
  declare function isWasmLoaded(): boolean;
216
- /** CRT CPU Renderer using WASM */
206
+ /** Check if WASM loading failed */
207
+ declare function hasWasmError(): boolean;
208
+ /** Get WASM loading error if any */
209
+ declare function getWasmError(): Error | null;
210
+ /** CRT CPU Renderer using WASM (auto-initializes) */
217
211
  declare class CrtCpuRenderer {
218
- private ready;
219
- /** Create and initialize renderer (auto-loads WASM) */
212
+ private initialized;
213
+ /** Create and initialize renderer */
220
214
  static create(): Promise<CrtCpuRenderer>;
215
+ /** Initialize (loads WASM if needed) */
216
+ init(): Promise<void>;
217
+ /** Check if renderer is ready */
221
218
  isReady(): boolean;
219
+ /** Render CRT effect */
222
220
  render(input: ImageInput | ImageData, options?: CrtOptions): ImageOutput;
221
+ /** Dispose resources */
223
222
  dispose(): void;
224
223
  }
225
- /** HEX CPU Renderer using WASM */
224
+ /** HEX CPU Renderer using WASM (auto-initializes) */
226
225
  declare class HexCpuRenderer {
227
- private ready;
226
+ private initialized;
227
+ /** Create and initialize renderer */
228
228
  static create(): Promise<HexCpuRenderer>;
229
+ /** Initialize (loads WASM if needed) */
230
+ init(): Promise<void>;
231
+ /** Check if renderer is ready */
229
232
  isReady(): boolean;
233
+ /** Render hexagonal effect */
230
234
  render(input: ImageInput | ImageData, options?: HexOptions): ImageOutput;
235
+ /** Get output dimensions */
231
236
  getDimensions(srcWidth: number, srcHeight: number, scale: number, orientation?: HexOrientation): {
232
237
  width: number;
233
238
  height: number;
234
239
  };
240
+ /** Dispose resources */
235
241
  dispose(): void;
236
242
  }
237
- /** XBRZ CPU Renderer using WASM */
243
+ /** XBRZ CPU Renderer using WASM (auto-initializes) */
238
244
  declare class XbrzCpuRenderer {
239
- private ready;
245
+ private initialized;
246
+ /** Create and initialize renderer */
240
247
  static create(): Promise<XbrzCpuRenderer>;
248
+ /** Initialize (loads WASM if needed) */
249
+ init(): Promise<void>;
250
+ /** Check if renderer is ready */
241
251
  isReady(): boolean;
252
+ /** Render xBRZ scaling */
242
253
  render(input: ImageInput | ImageData, options?: XbrzOptions): ImageOutput;
254
+ /** Dispose resources */
243
255
  dispose(): void;
244
256
  }
245
257
  /** XBRZ presets */
@@ -312,4 +324,4 @@ declare class RenderArt {
312
324
  dispose(): void;
313
325
  }
314
326
 
315
- export { type Backend, CRT_PRESETS, CrtCpuRenderer, CrtEngine, CrtGpuRenderer, type CrtOptions, type CrtPreset, HEX_PRESETS, HexCpuRenderer, HexEngine, HexGpuRenderer, type HexOptions, type HexOrientation, type HexPreset, type ImageInput, type ImageOutput, type PixelData, RenderArt, type RenderStats, type Renderer, type RendererCapabilities, XBRZ_PRESETS, XbrzCpuRenderer, XbrzEngine, type XbrzOptions, type XbrzPreset, hexGetDimensions, initWasm, isWasmLoaded, setWasmUrl };
327
+ export { type Backend, CRT_PRESETS, CrtCpuRenderer, CrtEngine, CrtGpuRenderer, type CrtOptions, type CrtPreset, HEX_PRESETS, HexCpuRenderer, HexEngine, HexGpuRenderer, type HexOptions, type HexOrientation, type HexPreset, type ImageInput, type ImageOutput, type PixelData, RenderArt, type RenderStats, type Renderer, type RendererCapabilities, XBRZ_PRESETS, XbrzCpuRenderer, XbrzEngine, type XbrzOptions, type XbrzPreset, getWasmError, hasWasmError, hexGetDimensions, initWasm, isWasmLoaded };