hdrify-react 1.4.0 → 2.2.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/dist/index.d.ts CHANGED
@@ -5,4 +5,5 @@ export { HdrifyCanvas, type HdrifyCanvasProps } from './HdrifyCanvas.js';
5
5
  export { DEFAULT_IMAGE_VIEWER_SETTINGS, EXPOSURE_SLIDER_RANGE, type ImageFit, ImageViewer, type ImageViewerHandle, type ImageViewerProps, type ImageViewerSettings, type SettingsPanelMode, TONE_MAPPING_OPTIONS, } from './ImageViewer.js';
6
6
  export type { DownloadProgress, ImageViewerProgress } from './progress.js';
7
7
  export { IMAGE_VIEWER_CSS } from './styles.js';
8
+ export type { DisplayMode, ViewerToneMapping } from './display.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,KAAK,QAAQ,EACb,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,KAAK,QAAQ,EACb,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ImageDisplay } from './display.js';
2
+ /** A single FP16 texture drawn directly with WebGPU; unsupported presentation falls back to SDR. */
3
+ export declare function createWebGPUDisplay(canvas: HTMLCanvasElement, onFailure: () => void): Promise<ImageDisplay>;
4
+ //# sourceMappingURL=webgpuDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpuDisplay.d.ts","sources":["../src/webgpuDisplay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,YAAY,EAA0B,MAAM,cAAc,CAAC;AAkExF,oGAAoG;AACpG,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAoIjH"}
@@ -0,0 +1,208 @@
1
+ import { displayPixels } from './display.js';
2
+ // One full-screen triangle. UVs keep the source's first row at the top of the canvas.
3
+ // The canvas is tagged sRGB, so encode linear Rec.709 explicitly, preserving signed HDR values.
4
+ const SHADER = `
5
+ struct Vertex { @builtin(position) position: vec4f, @location(0) uv: vec2f };
6
+ @vertex fn vertex(@builtin(vertex_index) index: u32) -> Vertex {
7
+ let uv = vec2f(f32((index << 1u) & 2u), f32(index & 2u));
8
+ return Vertex(vec4f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0, 0.0, 1.0), uv);
9
+ }
10
+ @group(0) @binding(0) var imageSampler: sampler;
11
+ @group(0) @binding(1) var image: texture_2d<f32>;
12
+ @group(0) @binding(2) var<uniform> exposure: f32;
13
+ @fragment fn fragment(input: Vertex) -> @location(0) vec4f {
14
+ let rgb = textureSample(image, imageSampler, input.uv).rgb * exposure;
15
+ let magnitude = abs(rgb);
16
+ let encoded = select(1.055 * pow(magnitude, vec3f(1.0 / 2.4)) - 0.055,
17
+ magnitude * 12.92, magnitude <= vec3f(0.0031308));
18
+ return vec4f(sign(rgb) * encoded, 1.0);
19
+ }`;
20
+ // Saturating float32 -> binary16, including subnormals and round-to-nearest-even.
21
+ const float = new Float32Array(1);
22
+ const bits = new Uint32Array(float.buffer);
23
+ function toHalfFloat(value) {
24
+ float[0] = Math.max(-65504, Math.min(65504, value));
25
+ const word = bits[0];
26
+ const sign = (word >>> 16) & 0x8000;
27
+ const exponent = ((word >>> 23) & 0xff) - 127;
28
+ if (exponent < -25)
29
+ return sign;
30
+ const mantissa = (word & 0x7fffff) | 0x800000;
31
+ const shift = exponent < -14 ? -exponent - 1 : 13;
32
+ const rounded = (mantissa + (2 ** (shift - 1) - 1) + ((mantissa >>> shift) & 1)) >>> shift;
33
+ return sign | (exponent < -14 ? rounded : ((exponent + 14) << 10) + rounded);
34
+ }
35
+ // One capability probe shared by every viewer in this page. Cache failure too.
36
+ let hdrCapability;
37
+ async function probeHdrCapability(document) {
38
+ const adapter = await document.defaultView?.navigator.gpu?.requestAdapter();
39
+ if (!adapter)
40
+ return false;
41
+ const device = await adapter.requestDevice();
42
+ const canvas = document.createElement('canvas');
43
+ const context = canvas.getContext('webgpu');
44
+ try {
45
+ if (!context)
46
+ return false;
47
+ context.configure({
48
+ device,
49
+ format: 'rgba16float',
50
+ colorSpace: 'srgb',
51
+ alphaMode: 'opaque',
52
+ toneMapping: { mode: 'extended' },
53
+ });
54
+ const configuration = context.getConfiguration();
55
+ return (configuration?.format === 'rgba16float' &&
56
+ configuration.toneMapping?.mode === 'extended' &&
57
+ configuration.colorSpace === 'srgb');
58
+ }
59
+ finally {
60
+ context?.unconfigure();
61
+ device.destroy();
62
+ }
63
+ }
64
+ /** A single FP16 texture drawn directly with WebGPU; unsupported presentation falls back to SDR. */
65
+ export async function createWebGPUDisplay(canvas, onFailure) {
66
+ const supported = await (hdrCapability ??= probeHdrCapability(canvas.ownerDocument).catch(() => false));
67
+ if (!supported)
68
+ throw new Error('WebGPU extended FP16 presentation is not supported');
69
+ // Adapters can create only one device; each viewer acquires its own rendering resources.
70
+ const adapter = await canvas.ownerDocument.defaultView?.navigator.gpu?.requestAdapter();
71
+ if (!adapter)
72
+ throw new Error('WebGPU is not available');
73
+ const device = await adapter.requestDevice({
74
+ requiredLimits: { maxTextureDimension2D: adapter.limits.maxTextureDimension2D },
75
+ });
76
+ let disposed = false;
77
+ let map;
78
+ let exposureBuffer;
79
+ let context = null;
80
+ const fail = () => {
81
+ if (!disposed)
82
+ onFailure();
83
+ };
84
+ const dispose = () => {
85
+ if (disposed)
86
+ return;
87
+ disposed = true;
88
+ device.removeEventListener('uncapturederror', fail);
89
+ context?.unconfigure();
90
+ map?.destroy();
91
+ exposureBuffer?.destroy();
92
+ device.destroy();
93
+ };
94
+ try {
95
+ device.addEventListener('uncapturederror', fail);
96
+ void device.lost.then(fail);
97
+ context = canvas.getContext('webgpu');
98
+ if (!context)
99
+ throw new Error('WebGPU canvas is not available');
100
+ context.configure({
101
+ device,
102
+ format: 'rgba16float',
103
+ colorSpace: 'srgb',
104
+ alphaMode: 'opaque',
105
+ toneMapping: { mode: 'extended' },
106
+ });
107
+ const surface = context;
108
+ const module = device.createShaderModule({ code: SHADER });
109
+ const pipeline = await device.createRenderPipelineAsync({
110
+ layout: 'auto',
111
+ vertex: { module, entryPoint: 'vertex' },
112
+ fragment: { module, entryPoint: 'fragment', targets: [{ format: 'rgba16float' }] },
113
+ primitive: { topology: 'triangle-list' },
114
+ });
115
+ const uniformBuffer = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
116
+ exposureBuffer = uniformBuffer;
117
+ const exposureValue = new Float32Array(1);
118
+ const sampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' });
119
+ let bindings;
120
+ let previousImage;
121
+ let previousToneMapping;
122
+ let previousExposure;
123
+ let wideSource = false;
124
+ let size = '';
125
+ return {
126
+ mode: 'hdr',
127
+ draw(image, toneMapping, exposure) {
128
+ if (disposed)
129
+ return;
130
+ // Ordinary exposure-only changes are a uniform update. Explicit tone mappers use the same HDRify
131
+ // operators as SDR, retaining float output rather than quantizing through an 8-bit preview.
132
+ if (previousImage !== image ||
133
+ previousToneMapping !== toneMapping ||
134
+ ((toneMapping !== 'none' || wideSource) && previousExposure !== exposure)) {
135
+ const pixels = displayPixels(image, toneMapping, toneMapping === 'none' ? 1 : exposure);
136
+ wideSource =
137
+ toneMapping === 'none' && pixels.some((value, index) => index % 4 !== 3 && Math.abs(value) > 65504);
138
+ // Bake exposure for values outside FP16's range, so lowering exposure can recover bright
139
+ // float32 source highlights rather than magnifying an already-clipped upload.
140
+ if (wideSource)
141
+ for (let i = 0; i < pixels.length; i++)
142
+ if (i % 4 !== 3)
143
+ pixels[i] = pixels[i] * exposure;
144
+ const halves = new Uint16Array(pixels.length);
145
+ for (let i = 0; i < pixels.length; i++)
146
+ halves[i] = toHalfFloat(pixels[i]);
147
+ if (!map || map.width !== image.width || map.height !== image.height) {
148
+ map?.destroy();
149
+ map = device.createTexture({
150
+ size: [image.width, image.height],
151
+ format: 'rgba16float',
152
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
153
+ });
154
+ bindings = device.createBindGroup({
155
+ layout: pipeline.getBindGroupLayout(0),
156
+ entries: [
157
+ { binding: 0, resource: sampler },
158
+ { binding: 1, resource: map.createView() },
159
+ { binding: 2, resource: { buffer: uniformBuffer } },
160
+ ],
161
+ });
162
+ }
163
+ device.queue.writeTexture({ texture: map }, halves, { bytesPerRow: image.width * 8 }, [
164
+ image.width,
165
+ image.height,
166
+ ]);
167
+ previousImage = image;
168
+ previousToneMapping = toneMapping;
169
+ }
170
+ previousExposure = exposure;
171
+ exposureValue[0] = toneMapping === 'none' && !wideSource ? exposure : 1;
172
+ device.queue.writeBuffer(uniformBuffer, 0, exposureValue);
173
+ const encoder = device.createCommandEncoder();
174
+ const pass = encoder.beginRenderPass({
175
+ colorAttachments: [
176
+ {
177
+ view: surface.getCurrentTexture().createView(),
178
+ loadOp: 'clear',
179
+ storeOp: 'store',
180
+ clearValue: { r: 0, g: 0, b: 0, a: 1 },
181
+ },
182
+ ],
183
+ });
184
+ pass.setPipeline(pipeline);
185
+ pass.setBindGroup(0, bindings);
186
+ pass.draw(3);
187
+ pass.end();
188
+ device.queue.submit([encoder.finish()]);
189
+ },
190
+ resize(width, height, pixelRatio) {
191
+ const ratio = Math.min(pixelRatio, device.limits.maxTextureDimension2D / Math.max(width, height));
192
+ const next = `${width}:${height}:${ratio}`;
193
+ if (next === size)
194
+ return;
195
+ size = next;
196
+ canvas.width = Math.max(1, Math.floor(width * ratio));
197
+ canvas.height = Math.max(1, Math.floor(height * ratio));
198
+ },
199
+ complete: () => device.queue.onSubmittedWorkDone(),
200
+ dispose,
201
+ };
202
+ }
203
+ catch (error) {
204
+ dispose();
205
+ throw error;
206
+ }
207
+ }
208
+ //# sourceMappingURL=webgpuDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpuDisplay.js","sources":["../src/webgpuDisplay.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hdrify-react",
3
- "version": "1.4.0",
3
+ "version": "2.2.0",
4
4
  "description": "React component and <image-viewer> web component for displaying HDR images with tone mapping and exposure",
5
5
  "keywords": [
6
6
  "exr",
@@ -47,18 +47,23 @@
47
47
  },
48
48
  "./image-viewer.js": "./dist/image-viewer.js",
49
49
  "./dist/*": "./dist/*",
50
- "./package.json": "./package.json"
50
+ "./package.json": "./package.json",
51
+ "./decode": {
52
+ "types": "./dist/decode.d.ts",
53
+ "default": "./dist/decode.js"
54
+ }
51
55
  },
52
56
  "publishConfig": {
53
57
  "access": "public",
54
58
  "registry": "https://registry.npmjs.org/"
55
59
  },
56
60
  "dependencies": {
57
- "hdrify": "1.4.0"
61
+ "hdrify": "2.2.0"
58
62
  },
59
63
  "devDependencies": {
60
64
  "@types/react": "^19.3.0",
61
65
  "@types/react-dom": "^19.3.0",
66
+ "@webgpu/types": "^0.1.74",
62
67
  "esbuild": "^0.27.3",
63
68
  "react": "^19.3.1",
64
69
  "react-dom": "^19.3.1"