@webex/ladon-ts 4.0.0 → 4.2.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.
@@ -1,463 +1,6 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- class WebGLRenderer {
11
- constructor(output_canvas, config) {
12
- this.output_canvas = output_canvas;
13
- this.config = config;
14
- this.verts = new Float32Array([
15
- -1.0, -1.0, 0.0, -1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
16
- 1.0, 1.0, 0.0, 1.0, -1.0, 0.0, -1.0, -1.0, 0.0,
17
- ]);
18
- this.vertex_shader_src = `#version 300 es
19
-
20
- in vec4 position;
21
-
22
- void main() {
23
- gl_Position = position;
24
- }
25
- `;
26
- const gl = this.output_canvas.getContext('webgl2');
27
- if (!gl) {
28
- const output_2d = this.output_canvas.getContext('2d');
29
- if (!output_2d) {
30
- throw new Error('[ladon-ts] - output canvas context must be webgl2 or 2d');
31
- }
32
- this.output_canvas_2d = output_2d;
33
- this.intermediate_canvas = document.createElement('canvas');
34
- this.intermediate_canvas.height = this.config.input.height;
35
- this.intermediate_canvas.width = this.config.input.width;
36
- const gl_intermediate = this.intermediate_canvas.getContext('webgl2');
37
- if (!gl_intermediate) {
38
- throw new Error('[ladon-ts] - error getting output context webgl');
39
- }
40
- this.gl = gl_intermediate;
41
- }
42
- else {
43
- this.gl = gl;
44
- }
45
- const image_texture = this.gl.createTexture();
46
- if (!image_texture) {
47
- throw new Error('[ladon-ts] - error creating input texture');
48
- }
49
- this.image_texture = image_texture;
50
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);
51
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
52
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
53
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
54
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, null);
55
- this.gl.bindTexture(this.gl.TEXTURE_2D, null);
56
- const mask_texture = this.gl.createTexture();
57
- if (!mask_texture) {
58
- throw new Error('[ladon-ts] - error creating mask texture');
59
- }
60
- this.mask_texture = mask_texture;
61
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
62
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);
63
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);
64
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
65
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
66
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R32F, this.config.input.width, this.config.input.height, 0, this.gl.RED, this.gl.FLOAT, null);
67
- this.gl.bindTexture(this.gl.TEXTURE_2D, null);
68
- const vertex_array = this.gl.createVertexArray();
69
- if (!vertex_array) {
70
- throw new Error('[ladon-ts] - error creating vertex array');
71
- }
72
- this.gl.bindVertexArray(vertex_array);
73
- const buffer = this.gl.createBuffer();
74
- if (!buffer) {
75
- throw new Error('[ladon-ts] - error creating buffer');
76
- }
77
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);
78
- this.gl.bufferData(this.gl.ARRAY_BUFFER, this.verts, this.gl.STATIC_DRAW);
79
- this.gl.vertexAttribPointer(0, 3, this.gl.FLOAT, false, 0, 0);
80
- this.gl.enableVertexAttribArray(0);
81
- this.gl.viewport(0, 0, this.config.input.width, this.config.input.height);
82
- }
83
- getUVCalculation() {
84
- if (this.config.render.horizontal_mirror) {
85
- return `vec2 st = -(gl_FragCoord.xy / u_resolution) + 1.0;`;
86
- }
87
- return `vec2 st = vec2((gl_FragCoord.x / u_resolution.x), -(gl_FragCoord.y / u_resolution.y) + 1.0);`;
88
- }
89
- setSharedUniforms(program) {
90
- const u_resolution = this.gl.getUniformLocation(program, 'u_resolution');
91
- if (!u_resolution) {
92
- throw new Error('[ladon-ts] - error finding "u_resolution" uniform');
93
- }
94
- this.gl.uniform2f(u_resolution, this.config.input.width, this.config.input.height);
95
- const u_image = this.gl.getUniformLocation(program, 'u_image');
96
- if (!u_image) {
97
- throw new Error('[ladon-ts] - error finding "u_image" uniform');
98
- }
99
- this.gl.activeTexture(this.gl.TEXTURE0);
100
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);
101
- this.gl.uniform1i(u_image, 0);
102
- const u_mask = this.gl.getUniformLocation(program, 'u_mask');
103
- if (u_mask) {
104
- this.gl.activeTexture(this.gl.TEXTURE1);
105
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
106
- this.gl.uniform1i(u_mask, 1);
107
- }
108
- }
109
- uploadVideoStream(input) {
110
- this.gl.activeTexture(this.gl.TEXTURE0);
111
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);
112
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, input);
113
- }
114
- postDraw() {
115
- if (this.output_canvas_2d && this.intermediate_canvas) {
116
- this.output_canvas_2d.drawImage(this.intermediate_canvas, 0, 0, this.config.input.width, this.config.input.height);
117
- }
118
- }
119
- }
120
- export class PassthroughRenderer extends WebGLRenderer {
121
- constructor(output_canvas, config) {
122
- super(output_canvas, config);
123
- this.output_canvas = output_canvas;
124
- this.config = config;
125
- this.fragment_shader = `#version 300 es
126
- precision highp float;
127
-
128
- out vec4 outColor;
129
-
130
- uniform sampler2D u_image;
131
- uniform vec2 u_resolution;
132
-
133
-
134
- void main() {
135
- ${this.getUVCalculation()}
136
-
137
- outColor = vec4(texture(u_image, st).rgb, 1.0);
138
- }
139
- `;
140
- const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
141
- const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader);
142
- this.program = linkProgram(this.gl, vertex_shader, fragment_shader);
143
- this.gl.useProgram(this.program);
144
- this.setSharedUniforms(this.program);
145
- }
146
- render(input,
147
- /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
148
- _) {
149
- return __awaiter(this, void 0, void 0, function* () {
150
- this.uploadVideoStream(input);
151
- this.gl.useProgram(this.program);
152
- this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
153
- this.postDraw();
154
- });
155
- }
156
- load() {
157
- return __awaiter(this, void 0, void 0, function* () {
158
- // empty
159
- });
160
- }
161
- destroy() {
162
- // empty
163
- }
164
- }
165
- export class ReplacementRenderer extends WebGLRenderer {
166
- constructor(output_canvas, config) {
167
- super(output_canvas, config);
168
- this.output_canvas = output_canvas;
169
- this.config = config;
170
- this.fragment_shader = `#version 300 es
171
- precision highp float;
172
-
173
- out vec4 outColor;
174
-
175
- uniform sampler2D u_background;
176
- uniform sampler2D u_image;
177
- uniform sampler2D u_mask;
178
- uniform vec2 u_resolution;
179
-
180
-
181
- float get_mask(vec2 st) {
182
- return clamp(texture(u_mask, st).r, 0.0, 1.0);
183
- }
184
-
185
- float get_inv_mask(vec2 st) {
186
- return 1.0 - get_mask(st);
187
- }
188
-
189
- void main() {
190
- ${this.getUVCalculation()}
191
-
192
- outColor = vec4(texture(u_background, st).rgb * get_inv_mask(st) + texture(u_image, st).rgb * get_mask(st), 1.0);
193
- }
194
- `;
195
- const background_canvas_ctx = this.config.render.background.getContext('2d');
196
- if (!background_canvas_ctx) {
197
- throw new Error('[ladon-ts] - could not get background canvas context 2d');
198
- }
199
- this.background_canvas_ctx = background_canvas_ctx;
200
- const background_data = this.background_canvas_ctx.getImageData(0, 0, this.config.render.background.width, this.config.render.background.height).data;
201
- if (this.config.render.kernel_size % 2 === 0) {
202
- throw new Error('[ladon-ts] - kernel_size must be odd');
203
- }
204
- const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
205
- const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader);
206
- this.program = linkProgram(this.gl, vertex_shader, fragment_shader);
207
- this.gl.useProgram(this.program);
208
- this.setSharedUniforms(this.program);
209
- const background_texture = this.gl.createTexture();
210
- if (!background_texture) {
211
- throw new Error('[ladon-ts] - error creating input texture');
212
- }
213
- this.background_texture = background_texture;
214
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);
215
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
216
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
217
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
218
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.render.background.width, this.config.render.background.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, background_data);
219
- this.gl.bindTexture(this.gl.TEXTURE_2D, null);
220
- const u_background = this.gl.getUniformLocation(this.program, 'u_background');
221
- if (!u_background) {
222
- throw new Error('[ladon-ts] - error finding "u_background" uniform');
223
- }
224
- this.gl.activeTexture(this.gl.TEXTURE2);
225
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);
226
- this.gl.uniform1i(u_background, 2);
227
- }
228
- render(input, mask) {
229
- return __awaiter(this, void 0, void 0, function* () {
230
- this.uploadVideoStream(input);
231
- if (mask.warm) {
232
- this.gl.activeTexture(this.gl.TEXTURE1);
233
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
234
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R32F, this.config.input.width, this.config.input.height, 0, this.gl.RED, this.gl.FLOAT, mask.data);
235
- }
236
- if (!this.config.render.static) {
237
- const background_data = this.background_canvas_ctx.getImageData(0, 0, this.config.render.background.width, this.config.render.background.height).data;
238
- this.gl.activeTexture(this.gl.TEXTURE2);
239
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);
240
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, background_data);
241
- }
242
- this.gl.useProgram(this.program);
243
- this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
244
- this.postDraw();
245
- });
246
- }
247
- load() {
248
- return __awaiter(this, void 0, void 0, function* () {
249
- // empty
250
- });
251
- }
252
- destroy() {
253
- // empty
254
- }
255
- }
256
- export class BlurRenderer extends WebGLRenderer {
257
- constructor(output_canvas, config) {
258
- super(output_canvas, config);
259
- this.output_canvas = output_canvas;
260
- this.config = config;
261
- this.fragment_shader_common = `#version 300 es
262
- precision highp float;
263
-
264
- #define KERNEL_SIZE ${this.config.render.kernel_size}
265
- #define HORIZONTAL vec2(1.0, 0.0)
266
- #define VERTICAL vec2(0.0, 1.0)
267
- #define EPSILON 0.00001
268
-
269
- out vec4 outColor;
270
-
271
- uniform sampler2D u_image;
272
- uniform float u_kernel[KERNEL_SIZE];
273
- uniform sampler2D u_mask;
274
- uniform vec2 u_resolution;
275
-
276
-
277
- float get_mask(vec2 st) {
278
- return clamp(texture(u_mask, st).r, 0.0, 1.0);
279
- }
280
-
281
- float get_inv_mask(vec2 st) {
282
- return 1.0 - get_mask(st);
283
- }
284
-
285
- vec4 get_offset_mul(sampler2D src, vec2 uv, float weight) {
286
- if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
287
- return vec4(vec3(0.0), weight);
288
- }
289
-
290
- // 4th channel is masked weight value
291
- return vec4(vec3(texture(src, uv).rgb * get_inv_mask(uv) * weight), get_mask(uv) * weight);
292
- }
293
-
294
- vec3 blur(sampler2D src, vec2 uv, vec2 direction) {
295
- vec4 result = vec4(0.0);
296
-
297
- vec2 step = (direction / u_resolution);
298
- int offset = (KERNEL_SIZE - 1) / 2;
299
-
300
- for (int i = 0; i < KERNEL_SIZE; i++) {
301
- vec2 offset = step * float(i - offset);
302
- result += get_offset_mul(src, uv + offset, u_kernel[i]);
303
- }
304
-
305
- if (abs(result.a - 1.0) < EPSILON) {
306
- return vec3(0.0);
307
- }
308
-
309
- // redistribute weights from masked areas
310
- return result.rgb * (1.0 + (result.a / (1.0 - result.a)));
311
- }
312
- `;
313
- this.fragment_shader_pass_1_src = this.fragment_shader_common +
314
- `
315
- void main() {
316
- vec2 st = gl_FragCoord.xy / u_resolution;
317
-
318
- outColor = vec4(blur(u_image, st, HORIZONTAL) * get_inv_mask(st), 1.0);
319
- }
320
- `;
321
- this.fragment_shader_pass_2_src = this.fragment_shader_common +
322
- `
323
- uniform sampler2D u_blur;
324
-
325
-
326
- void main() {
327
- ${this.getUVCalculation()}
328
-
329
- vec3 blurred = blur(u_blur, st, VERTICAL);
330
- vec3 image = texture(u_image, st).rgb;
331
- float mask = texture(u_mask, st).r;
332
-
333
- outColor = vec4(blurred * (1.0 - mask) + image * mask, 1.0);
334
- }
335
- `;
336
- if (this.config.render.kernel_size % 2 === 0) {
337
- throw new Error('[ladon-ts] - kernel_size must be odd');
338
- }
339
- // program pass 1 setup
340
- {
341
- const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
342
- const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader_pass_1_src);
343
- this.program_1 = linkProgram(this.gl, vertex_shader, fragment_shader);
344
- this.gl.useProgram(this.program_1);
345
- const framebuffer = this.gl.createFramebuffer();
346
- if (!framebuffer) {
347
- throw new Error('[ladon-ts] - error creating framebuffer');
348
- }
349
- this.framebuffer = framebuffer;
350
- const transfer_texture = this.gl.createTexture();
351
- if (!transfer_texture) {
352
- throw new Error('[ladon-ts] - error creating output texture');
353
- }
354
- this.transfer_texture = transfer_texture;
355
- this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.framebuffer);
356
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.transfer_texture);
357
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
358
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
359
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
360
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, null);
361
- this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, this.transfer_texture, 0);
362
- this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
363
- this.setSharedUniforms(this.program_1);
364
- const u_kernel = this.gl.getUniformLocation(this.program_1, 'u_kernel');
365
- if (!u_kernel) {
366
- throw new Error('[ladon-ts] - error finding "u_kernel" uniform');
367
- }
368
- this.gl.uniform1fv(u_kernel, this.getBlurKernel());
369
- }
370
- // program pass 2 setup
371
- {
372
- const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
373
- const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader_pass_2_src);
374
- this.program_2 = linkProgram(this.gl, vertex_shader, fragment_shader);
375
- this.gl.useProgram(this.program_2);
376
- const u_blur = this.gl.getUniformLocation(this.program_2, 'u_blur');
377
- if (!u_blur) {
378
- throw new Error('[ladon-ts] - error finding "u_blur" uniform');
379
- }
380
- this.u_blur = u_blur;
381
- this.gl.activeTexture(this.gl.TEXTURE2);
382
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.transfer_texture);
383
- this.gl.uniform1i(this.u_blur, 2);
384
- this.setSharedUniforms(this.program_2);
385
- const u_kernel = this.gl.getUniformLocation(this.program_2, 'u_kernel');
386
- if (!u_kernel) {
387
- throw new Error('[ladon-ts] - error finding "u_kernel" uniform');
388
- }
389
- this.gl.uniform1fv(u_kernel, this.getBlurKernel());
390
- }
391
- }
392
- render(input, mask) {
393
- return __awaiter(this, void 0, void 0, function* () {
394
- this.uploadVideoStream(input);
395
- if (mask.warm) {
396
- this.gl.activeTexture(this.gl.TEXTURE1);
397
- this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
398
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R32F, this.config.input.width, this.config.input.height, 0, this.gl.RED, this.gl.FLOAT, mask.data);
399
- }
400
- // program pass 1 - blur in one direction & output to framebuffer
401
- this.gl.useProgram(this.program_1);
402
- this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.framebuffer);
403
- this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
404
- this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
405
- // program pass 2 - blur in other direction & draw to screen
406
- this.gl.useProgram(this.program_2);
407
- this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
408
- this.postDraw();
409
- });
410
- }
411
- load() {
412
- return __awaiter(this, void 0, void 0, function* () {
413
- // empty
414
- });
415
- }
416
- destroy() {
417
- // empty
418
- }
419
- getBlurKernel() {
420
- const kernel = [];
421
- let sum = 0;
422
- for (let i = 0; i < this.config.render.kernel_size; i++) {
423
- let w = i - (this.config.render.kernel_size - 1) / 2;
424
- w = Math.exp(-(Math.pow(w, 2)) / Math.pow(this.config.render.sigma, 2));
425
- kernel.push(w);
426
- sum += w;
427
- }
428
- for (let i = 0; i < this.config.render.kernel_size; i++) {
429
- kernel[i] = kernel[i] / sum;
430
- }
431
- return new Float32Array(kernel);
432
- }
433
- }
434
- function compileShader(gl, shader_type, source) {
435
- var _a;
436
- const shader = gl.createShader(shader_type);
437
- if (!shader) {
438
- throw new Error('[ladon-ts] - error creating shader');
439
- }
440
- gl.shaderSource(shader, source);
441
- gl.compileShader(shader);
442
- if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
443
- const error = (_a = gl.getShaderInfoLog(shader)) !== null && _a !== void 0 ? _a : 'unknown error compiling shader.';
444
- throw new Error('[ladon-ts] - ' + error);
445
- }
446
- return shader;
447
- }
448
- function linkProgram(gl, vertex_shader, fragment_shader) {
449
- var _a;
450
- const program = gl.createProgram();
451
- if (!program) {
452
- throw new Error('[ladon-ts] - error creating GPU program');
453
- }
454
- gl.attachShader(program, vertex_shader);
455
- gl.attachShader(program, fragment_shader);
456
- gl.linkProgram(program);
457
- if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
458
- const error = (_a = gl.getProgramInfoLog(program)) !== null && _a !== void 0 ? _a : 'unknown error linking program.';
459
- throw new Error('[ladon-ts] - ' + error);
460
- }
461
- return program;
462
- }
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVNBLE1BQWUsYUFBYTtJQXdCeEIsWUFDVyxhQUFnQyxFQUN2QixNQUFzQjtRQUQvQixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFqQmhDLFVBQUssR0FBRyxJQUFJLFlBQVksQ0FBQztZQUMvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFFOUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHO1NBQ2pELENBQUMsQ0FBQztRQUVPLHNCQUFpQixHQUFHOzs7Ozs7O0NBT2pDLENBQUM7UUFNTSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ0wsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RCxDQUM1RCxDQUFDO2FBQ0w7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1lBRWxDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1B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
1
+ export * from './renderer/blur-renderer';
2
+ export * from './renderer/ladon-renderer';
3
+ export * from './renderer/passthrough-renderer';
4
+ export * from './renderer/replacement-renderer';
5
+ export * from './renderer/webgl-renderer';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyQkFBMkIsQ0FBQyJ9
@@ -1 +1,31 @@
1
- export declare const toAbsoluteURI: (relativeURL: string, baseURL?: string) => string;
1
+ import { PipelineConfig } from './config';
2
+ export declare const toAbsoluteURI: (relativeURL: string, baseURL?: string) => string;
3
+ export declare function compileShader(gl: WebGL2RenderingContext, shader_type: number, source: string): WebGLShader;
4
+ export declare function linkProgram(gl: WebGL2RenderingContext, vertex_shader: WebGLShader, fragment_shader: WebGLShader): WebGLProgram;
5
+ /**
6
+ * Resizes an image from the source dimensions to target dimensions.
7
+ *
8
+ * @param {Uint8ClampedArray} imageData The source image data in Uint8ClampedArray format.
9
+ * @param {number} srcWidth The width of the source image.
10
+ * @param {number} srcHeight The height of the source image.
11
+ * @param {number} targetWidth The width of the target image.
12
+ * @param {number} targetHeight The height of the target image.
13
+ *
14
+ * @returns {Uint8ClampedArray} The target image data in Uint8ClampedArray format.
15
+ *
16
+ * @example
17
+ * const targetData = resizeImage(sourceData, 800, 600, 400, 300);
18
+ *
19
+ * @note The function uses a "nearest neighbor" algorithm for resizing,
20
+ * which is fast but might not provide the best quality for all images.
21
+ */
22
+ export declare const resizeImage: (imageData: Uint8ClampedArray, srcWidth: number, srcHeight: number, targetWidth: number, targetHeight: number) => Uint8ClampedArray;
23
+ /**
24
+ * Resolves the model URL based on the configuration.
25
+ *
26
+ * @param {PipelineConfig} config The configuration object.
27
+ * @returns {Promise<string>} The resolved model URL.
28
+ * @example
29
+ * const modelUrl = await getModelUrl(config);
30
+ */
31
+ export declare const getModelUrl: ({ mask: { model_url_resolver, model_uri }, }: PipelineConfig) => Promise<string>;