stats-gl 3.8.0 → 4.0.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.
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const DEFAULT_PREVIEW_WIDTH = 90;
4
+ const DEFAULT_PREVIEW_HEIGHT = 48;
5
+ class TextureCaptureWebGL {
6
+ constructor(gl, width = DEFAULT_PREVIEW_WIDTH, height = DEFAULT_PREVIEW_HEIGHT) {
7
+ this.previewFbo = null;
8
+ this.previewTexture = null;
9
+ this.gl = gl;
10
+ this.previewWidth = width;
11
+ this.previewHeight = height;
12
+ this.pixels = new Uint8Array(width * height * 4);
13
+ this.flippedPixels = new Uint8Array(width * height * 4);
14
+ this.initResources();
15
+ }
16
+ /**
17
+ * Resize preview dimensions
18
+ */
19
+ resize(width, height) {
20
+ if (width === this.previewWidth && height === this.previewHeight)
21
+ return;
22
+ this.previewWidth = width;
23
+ this.previewHeight = height;
24
+ this.pixels = new Uint8Array(width * height * 4);
25
+ this.flippedPixels = new Uint8Array(width * height * 4);
26
+ this.dispose();
27
+ this.initResources();
28
+ }
29
+ initResources() {
30
+ const gl = this.gl;
31
+ this.previewTexture = gl.createTexture();
32
+ gl.bindTexture(gl.TEXTURE_2D, this.previewTexture);
33
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, this.previewWidth, this.previewHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
34
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
35
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
36
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
37
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
38
+ this.previewFbo = gl.createFramebuffer();
39
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.previewFbo);
40
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.previewTexture, 0);
41
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
42
+ gl.bindTexture(gl.TEXTURE_2D, null);
43
+ }
44
+ async capture(source, sourceWidth, sourceHeight, _sourceId = "default") {
45
+ const gl = this.gl;
46
+ const prevReadFbo = gl.getParameter(gl.READ_FRAMEBUFFER_BINDING);
47
+ const prevDrawFbo = gl.getParameter(gl.DRAW_FRAMEBUFFER_BINDING);
48
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, source);
49
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.previewFbo);
50
+ gl.blitFramebuffer(
51
+ 0,
52
+ 0,
53
+ sourceWidth,
54
+ sourceHeight,
55
+ 0,
56
+ 0,
57
+ this.previewWidth,
58
+ this.previewHeight,
59
+ gl.COLOR_BUFFER_BIT,
60
+ gl.LINEAR
61
+ );
62
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.previewFbo);
63
+ gl.readPixels(0, 0, this.previewWidth, this.previewHeight, gl.RGBA, gl.UNSIGNED_BYTE, this.pixels);
64
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, prevReadFbo);
65
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, prevDrawFbo);
66
+ const flipped = this.flipY(this.pixels, this.previewWidth, this.previewHeight);
67
+ const imageData = new ImageData(new Uint8ClampedArray(flipped), this.previewWidth, this.previewHeight);
68
+ return createImageBitmap(imageData);
69
+ }
70
+ flipY(pixels, width, height) {
71
+ const rowSize = width * 4;
72
+ for (let y = 0; y < height; y++) {
73
+ const srcOffset = y * rowSize;
74
+ const dstOffset = (height - 1 - y) * rowSize;
75
+ this.flippedPixels.set(pixels.subarray(srcOffset, srcOffset + rowSize), dstOffset);
76
+ }
77
+ return this.flippedPixels;
78
+ }
79
+ removeSource(_sourceId) {
80
+ }
81
+ dispose() {
82
+ const gl = this.gl;
83
+ if (this.previewFbo) {
84
+ gl.deleteFramebuffer(this.previewFbo);
85
+ this.previewFbo = null;
86
+ }
87
+ if (this.previewTexture) {
88
+ gl.deleteTexture(this.previewTexture);
89
+ this.previewTexture = null;
90
+ }
91
+ }
92
+ }
93
+ class TextureCaptureWebGPU {
94
+ constructor(device, width = DEFAULT_PREVIEW_WIDTH, height = DEFAULT_PREVIEW_HEIGHT) {
95
+ this.previewTexture = null;
96
+ this.stagingBuffer = null;
97
+ this.blitPipeline = null;
98
+ this.sampler = null;
99
+ this.bindGroupLayout = null;
100
+ this.initialized = false;
101
+ this.device = device;
102
+ this.previewWidth = width;
103
+ this.previewHeight = height;
104
+ this.pixelsBuffer = new Uint8ClampedArray(width * height * 4);
105
+ }
106
+ /**
107
+ * Resize preview dimensions
108
+ */
109
+ resize(width, height) {
110
+ if (width === this.previewWidth && height === this.previewHeight)
111
+ return;
112
+ this.previewWidth = width;
113
+ this.previewHeight = height;
114
+ this.pixelsBuffer = new Uint8ClampedArray(width * height * 4);
115
+ if (this.previewTexture)
116
+ this.previewTexture.destroy();
117
+ if (this.stagingBuffer)
118
+ this.stagingBuffer.destroy();
119
+ this.previewTexture = null;
120
+ this.stagingBuffer = null;
121
+ if (this.initialized) {
122
+ this.createSizeResources();
123
+ }
124
+ }
125
+ createSizeResources() {
126
+ const device = this.device;
127
+ this.previewTexture = device.createTexture({
128
+ size: { width: this.previewWidth, height: this.previewHeight },
129
+ format: "rgba8unorm",
130
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
131
+ });
132
+ const bytesPerRow = Math.ceil(this.previewWidth * 4 / 256) * 256;
133
+ this.stagingBuffer = device.createBuffer({
134
+ size: bytesPerRow * this.previewHeight,
135
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
136
+ });
137
+ }
138
+ async initResources() {
139
+ if (this.initialized)
140
+ return;
141
+ const device = this.device;
142
+ this.createSizeResources();
143
+ this.sampler = device.createSampler({
144
+ minFilter: "linear",
145
+ magFilter: "linear"
146
+ });
147
+ const shaderModule = device.createShaderModule({
148
+ code: `
149
+ @group(0) @binding(0) var texSampler: sampler;
150
+ @group(0) @binding(1) var texInput: texture_2d<f32>;
151
+
152
+ struct VertexOutput {
153
+ @builtin(position) position: vec4f,
154
+ @location(0) uv: vec2f
155
+ }
156
+
157
+ @vertex
158
+ fn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
159
+ var positions = array<vec2f, 3>(
160
+ vec2f(-1.0, -1.0),
161
+ vec2f(3.0, -1.0),
162
+ vec2f(-1.0, 3.0)
163
+ );
164
+ var uvs = array<vec2f, 3>(
165
+ vec2f(0.0, 1.0),
166
+ vec2f(2.0, 1.0),
167
+ vec2f(0.0, -1.0)
168
+ );
169
+
170
+ var output: VertexOutput;
171
+ output.position = vec4f(positions[vertexIndex], 0.0, 1.0);
172
+ output.uv = uvs[vertexIndex];
173
+ return output;
174
+ }
175
+
176
+ @fragment
177
+ fn fragmentMain(@location(0) uv: vec2f) -> @location(0) vec4f {
178
+ return textureSample(texInput, texSampler, uv);
179
+ }
180
+ `
181
+ });
182
+ this.bindGroupLayout = device.createBindGroupLayout({
183
+ entries: [
184
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } },
185
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float" } }
186
+ ]
187
+ });
188
+ this.blitPipeline = device.createRenderPipeline({
189
+ layout: device.createPipelineLayout({ bindGroupLayouts: [this.bindGroupLayout] }),
190
+ vertex: {
191
+ module: shaderModule,
192
+ entryPoint: "vertexMain"
193
+ },
194
+ fragment: {
195
+ module: shaderModule,
196
+ entryPoint: "fragmentMain",
197
+ targets: [{ format: "rgba8unorm" }]
198
+ },
199
+ primitive: { topology: "triangle-list" }
200
+ });
201
+ this.initialized = true;
202
+ }
203
+ async capture(source) {
204
+ await this.initResources();
205
+ if (!this.previewTexture || !this.stagingBuffer || !this.blitPipeline || !this.sampler || !this.bindGroupLayout) {
206
+ return null;
207
+ }
208
+ const device = this.device;
209
+ const bindGroup = device.createBindGroup({
210
+ layout: this.bindGroupLayout,
211
+ entries: [
212
+ { binding: 0, resource: this.sampler },
213
+ { binding: 1, resource: source.createView() }
214
+ ]
215
+ });
216
+ const commandEncoder = device.createCommandEncoder();
217
+ const renderPass = commandEncoder.beginRenderPass({
218
+ colorAttachments: [{
219
+ view: this.previewTexture.createView(),
220
+ loadOp: "clear",
221
+ storeOp: "store",
222
+ clearValue: { r: 0, g: 0, b: 0, a: 1 }
223
+ }]
224
+ });
225
+ renderPass.setPipeline(this.blitPipeline);
226
+ renderPass.setBindGroup(0, bindGroup);
227
+ renderPass.draw(3);
228
+ renderPass.end();
229
+ const bytesPerRow = Math.ceil(this.previewWidth * 4 / 256) * 256;
230
+ commandEncoder.copyTextureToBuffer(
231
+ { texture: this.previewTexture },
232
+ { buffer: this.stagingBuffer, bytesPerRow },
233
+ { width: this.previewWidth, height: this.previewHeight }
234
+ );
235
+ device.queue.submit([commandEncoder.finish()]);
236
+ await this.stagingBuffer.mapAsync(GPUMapMode.READ);
237
+ const data = new Uint8Array(this.stagingBuffer.getMappedRange());
238
+ for (let y = 0; y < this.previewHeight; y++) {
239
+ const srcOffset = y * bytesPerRow;
240
+ const dstOffset = y * this.previewWidth * 4;
241
+ this.pixelsBuffer.set(data.subarray(srcOffset, srcOffset + this.previewWidth * 4), dstOffset);
242
+ }
243
+ this.stagingBuffer.unmap();
244
+ const imageData = new ImageData(new Uint8ClampedArray(this.pixelsBuffer), this.previewWidth, this.previewHeight);
245
+ return createImageBitmap(imageData);
246
+ }
247
+ dispose() {
248
+ if (this.previewTexture)
249
+ this.previewTexture.destroy();
250
+ if (this.stagingBuffer)
251
+ this.stagingBuffer.destroy();
252
+ this.previewTexture = null;
253
+ this.stagingBuffer = null;
254
+ this.blitPipeline = null;
255
+ this.sampler = null;
256
+ this.bindGroupLayout = null;
257
+ this.initialized = false;
258
+ }
259
+ }
260
+ function extractWebGLSource(target, gl) {
261
+ if (target.isWebGLRenderTarget && target.__webglFramebuffer) {
262
+ return {
263
+ framebuffer: target.__webglFramebuffer,
264
+ width: target.width || 1,
265
+ height: target.height || 1
266
+ };
267
+ }
268
+ return null;
269
+ }
270
+ function extractWebGPUSource(target, backend) {
271
+ if (target.isRenderTarget && target.texture && backend.get) {
272
+ const textureData = backend.get(target.texture);
273
+ return (textureData == null ? void 0 : textureData.texture) || null;
274
+ }
275
+ return null;
276
+ }
277
+ exports.DEFAULT_PREVIEW_HEIGHT = DEFAULT_PREVIEW_HEIGHT;
278
+ exports.DEFAULT_PREVIEW_WIDTH = DEFAULT_PREVIEW_WIDTH;
279
+ exports.TextureCaptureWebGL = TextureCaptureWebGL;
280
+ exports.TextureCaptureWebGPU = TextureCaptureWebGPU;
281
+ exports.extractWebGLSource = extractWebGLSource;
282
+ exports.extractWebGPUSource = extractWebGPUSource;
283
+ //# sourceMappingURL=textureCapture.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textureCapture.cjs","sources":["../lib/textureCapture.ts"],"sourcesContent":null,"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ const DEFAULT_PREVIEW_WIDTH = 90;
2
+ const DEFAULT_PREVIEW_HEIGHT = 48;
3
+ class TextureCaptureWebGL {
4
+ constructor(gl, width = DEFAULT_PREVIEW_WIDTH, height = DEFAULT_PREVIEW_HEIGHT) {
5
+ this.previewFbo = null;
6
+ this.previewTexture = null;
7
+ this.gl = gl;
8
+ this.previewWidth = width;
9
+ this.previewHeight = height;
10
+ this.pixels = new Uint8Array(width * height * 4);
11
+ this.flippedPixels = new Uint8Array(width * height * 4);
12
+ this.initResources();
13
+ }
14
+ /**
15
+ * Resize preview dimensions
16
+ */
17
+ resize(width, height) {
18
+ if (width === this.previewWidth && height === this.previewHeight)
19
+ return;
20
+ this.previewWidth = width;
21
+ this.previewHeight = height;
22
+ this.pixels = new Uint8Array(width * height * 4);
23
+ this.flippedPixels = new Uint8Array(width * height * 4);
24
+ this.dispose();
25
+ this.initResources();
26
+ }
27
+ initResources() {
28
+ const gl = this.gl;
29
+ this.previewTexture = gl.createTexture();
30
+ gl.bindTexture(gl.TEXTURE_2D, this.previewTexture);
31
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, this.previewWidth, this.previewHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
32
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
33
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
34
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
35
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
36
+ this.previewFbo = gl.createFramebuffer();
37
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.previewFbo);
38
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.previewTexture, 0);
39
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
40
+ gl.bindTexture(gl.TEXTURE_2D, null);
41
+ }
42
+ async capture(source, sourceWidth, sourceHeight, _sourceId = "default") {
43
+ const gl = this.gl;
44
+ const prevReadFbo = gl.getParameter(gl.READ_FRAMEBUFFER_BINDING);
45
+ const prevDrawFbo = gl.getParameter(gl.DRAW_FRAMEBUFFER_BINDING);
46
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, source);
47
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.previewFbo);
48
+ gl.blitFramebuffer(
49
+ 0,
50
+ 0,
51
+ sourceWidth,
52
+ sourceHeight,
53
+ 0,
54
+ 0,
55
+ this.previewWidth,
56
+ this.previewHeight,
57
+ gl.COLOR_BUFFER_BIT,
58
+ gl.LINEAR
59
+ );
60
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.previewFbo);
61
+ gl.readPixels(0, 0, this.previewWidth, this.previewHeight, gl.RGBA, gl.UNSIGNED_BYTE, this.pixels);
62
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, prevReadFbo);
63
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, prevDrawFbo);
64
+ const flipped = this.flipY(this.pixels, this.previewWidth, this.previewHeight);
65
+ const imageData = new ImageData(new Uint8ClampedArray(flipped), this.previewWidth, this.previewHeight);
66
+ return createImageBitmap(imageData);
67
+ }
68
+ flipY(pixels, width, height) {
69
+ const rowSize = width * 4;
70
+ for (let y = 0; y < height; y++) {
71
+ const srcOffset = y * rowSize;
72
+ const dstOffset = (height - 1 - y) * rowSize;
73
+ this.flippedPixels.set(pixels.subarray(srcOffset, srcOffset + rowSize), dstOffset);
74
+ }
75
+ return this.flippedPixels;
76
+ }
77
+ removeSource(_sourceId) {
78
+ }
79
+ dispose() {
80
+ const gl = this.gl;
81
+ if (this.previewFbo) {
82
+ gl.deleteFramebuffer(this.previewFbo);
83
+ this.previewFbo = null;
84
+ }
85
+ if (this.previewTexture) {
86
+ gl.deleteTexture(this.previewTexture);
87
+ this.previewTexture = null;
88
+ }
89
+ }
90
+ }
91
+ class TextureCaptureWebGPU {
92
+ constructor(device, width = DEFAULT_PREVIEW_WIDTH, height = DEFAULT_PREVIEW_HEIGHT) {
93
+ this.previewTexture = null;
94
+ this.stagingBuffer = null;
95
+ this.blitPipeline = null;
96
+ this.sampler = null;
97
+ this.bindGroupLayout = null;
98
+ this.initialized = false;
99
+ this.device = device;
100
+ this.previewWidth = width;
101
+ this.previewHeight = height;
102
+ this.pixelsBuffer = new Uint8ClampedArray(width * height * 4);
103
+ }
104
+ /**
105
+ * Resize preview dimensions
106
+ */
107
+ resize(width, height) {
108
+ if (width === this.previewWidth && height === this.previewHeight)
109
+ return;
110
+ this.previewWidth = width;
111
+ this.previewHeight = height;
112
+ this.pixelsBuffer = new Uint8ClampedArray(width * height * 4);
113
+ if (this.previewTexture)
114
+ this.previewTexture.destroy();
115
+ if (this.stagingBuffer)
116
+ this.stagingBuffer.destroy();
117
+ this.previewTexture = null;
118
+ this.stagingBuffer = null;
119
+ if (this.initialized) {
120
+ this.createSizeResources();
121
+ }
122
+ }
123
+ createSizeResources() {
124
+ const device = this.device;
125
+ this.previewTexture = device.createTexture({
126
+ size: { width: this.previewWidth, height: this.previewHeight },
127
+ format: "rgba8unorm",
128
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
129
+ });
130
+ const bytesPerRow = Math.ceil(this.previewWidth * 4 / 256) * 256;
131
+ this.stagingBuffer = device.createBuffer({
132
+ size: bytesPerRow * this.previewHeight,
133
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
134
+ });
135
+ }
136
+ async initResources() {
137
+ if (this.initialized)
138
+ return;
139
+ const device = this.device;
140
+ this.createSizeResources();
141
+ this.sampler = device.createSampler({
142
+ minFilter: "linear",
143
+ magFilter: "linear"
144
+ });
145
+ const shaderModule = device.createShaderModule({
146
+ code: `
147
+ @group(0) @binding(0) var texSampler: sampler;
148
+ @group(0) @binding(1) var texInput: texture_2d<f32>;
149
+
150
+ struct VertexOutput {
151
+ @builtin(position) position: vec4f,
152
+ @location(0) uv: vec2f
153
+ }
154
+
155
+ @vertex
156
+ fn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
157
+ var positions = array<vec2f, 3>(
158
+ vec2f(-1.0, -1.0),
159
+ vec2f(3.0, -1.0),
160
+ vec2f(-1.0, 3.0)
161
+ );
162
+ var uvs = array<vec2f, 3>(
163
+ vec2f(0.0, 1.0),
164
+ vec2f(2.0, 1.0),
165
+ vec2f(0.0, -1.0)
166
+ );
167
+
168
+ var output: VertexOutput;
169
+ output.position = vec4f(positions[vertexIndex], 0.0, 1.0);
170
+ output.uv = uvs[vertexIndex];
171
+ return output;
172
+ }
173
+
174
+ @fragment
175
+ fn fragmentMain(@location(0) uv: vec2f) -> @location(0) vec4f {
176
+ return textureSample(texInput, texSampler, uv);
177
+ }
178
+ `
179
+ });
180
+ this.bindGroupLayout = device.createBindGroupLayout({
181
+ entries: [
182
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } },
183
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float" } }
184
+ ]
185
+ });
186
+ this.blitPipeline = device.createRenderPipeline({
187
+ layout: device.createPipelineLayout({ bindGroupLayouts: [this.bindGroupLayout] }),
188
+ vertex: {
189
+ module: shaderModule,
190
+ entryPoint: "vertexMain"
191
+ },
192
+ fragment: {
193
+ module: shaderModule,
194
+ entryPoint: "fragmentMain",
195
+ targets: [{ format: "rgba8unorm" }]
196
+ },
197
+ primitive: { topology: "triangle-list" }
198
+ });
199
+ this.initialized = true;
200
+ }
201
+ async capture(source) {
202
+ await this.initResources();
203
+ if (!this.previewTexture || !this.stagingBuffer || !this.blitPipeline || !this.sampler || !this.bindGroupLayout) {
204
+ return null;
205
+ }
206
+ const device = this.device;
207
+ const bindGroup = device.createBindGroup({
208
+ layout: this.bindGroupLayout,
209
+ entries: [
210
+ { binding: 0, resource: this.sampler },
211
+ { binding: 1, resource: source.createView() }
212
+ ]
213
+ });
214
+ const commandEncoder = device.createCommandEncoder();
215
+ const renderPass = commandEncoder.beginRenderPass({
216
+ colorAttachments: [{
217
+ view: this.previewTexture.createView(),
218
+ loadOp: "clear",
219
+ storeOp: "store",
220
+ clearValue: { r: 0, g: 0, b: 0, a: 1 }
221
+ }]
222
+ });
223
+ renderPass.setPipeline(this.blitPipeline);
224
+ renderPass.setBindGroup(0, bindGroup);
225
+ renderPass.draw(3);
226
+ renderPass.end();
227
+ const bytesPerRow = Math.ceil(this.previewWidth * 4 / 256) * 256;
228
+ commandEncoder.copyTextureToBuffer(
229
+ { texture: this.previewTexture },
230
+ { buffer: this.stagingBuffer, bytesPerRow },
231
+ { width: this.previewWidth, height: this.previewHeight }
232
+ );
233
+ device.queue.submit([commandEncoder.finish()]);
234
+ await this.stagingBuffer.mapAsync(GPUMapMode.READ);
235
+ const data = new Uint8Array(this.stagingBuffer.getMappedRange());
236
+ for (let y = 0; y < this.previewHeight; y++) {
237
+ const srcOffset = y * bytesPerRow;
238
+ const dstOffset = y * this.previewWidth * 4;
239
+ this.pixelsBuffer.set(data.subarray(srcOffset, srcOffset + this.previewWidth * 4), dstOffset);
240
+ }
241
+ this.stagingBuffer.unmap();
242
+ const imageData = new ImageData(new Uint8ClampedArray(this.pixelsBuffer), this.previewWidth, this.previewHeight);
243
+ return createImageBitmap(imageData);
244
+ }
245
+ dispose() {
246
+ if (this.previewTexture)
247
+ this.previewTexture.destroy();
248
+ if (this.stagingBuffer)
249
+ this.stagingBuffer.destroy();
250
+ this.previewTexture = null;
251
+ this.stagingBuffer = null;
252
+ this.blitPipeline = null;
253
+ this.sampler = null;
254
+ this.bindGroupLayout = null;
255
+ this.initialized = false;
256
+ }
257
+ }
258
+ function extractWebGLSource(target, gl) {
259
+ if (target.isWebGLRenderTarget && target.__webglFramebuffer) {
260
+ return {
261
+ framebuffer: target.__webglFramebuffer,
262
+ width: target.width || 1,
263
+ height: target.height || 1
264
+ };
265
+ }
266
+ return null;
267
+ }
268
+ function extractWebGPUSource(target, backend) {
269
+ if (target.isRenderTarget && target.texture && backend.get) {
270
+ const textureData = backend.get(target.texture);
271
+ return (textureData == null ? void 0 : textureData.texture) || null;
272
+ }
273
+ return null;
274
+ }
275
+ export {
276
+ DEFAULT_PREVIEW_HEIGHT,
277
+ DEFAULT_PREVIEW_WIDTH,
278
+ TextureCaptureWebGL,
279
+ TextureCaptureWebGPU,
280
+ extractWebGLSource,
281
+ extractWebGPUSource
282
+ };
283
+ //# sourceMappingURL=textureCapture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textureCapture.js","sources":["../lib/textureCapture.ts"],"sourcesContent":null,"names":[],"mappings":"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"}