text-shaper 0.1.4 → 0.1.6

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,470 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, {
5
- get: all[name],
6
- enumerable: true,
7
- configurable: true,
8
- set: (newValue) => all[name] = () => newValue
9
- });
10
- };
11
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
12
-
13
- // tests/performance/utils/perf-utils.ts
14
- class PerformanceTimer {
15
- startTime = 0;
16
- endTime = 0;
17
- start() {
18
- this.startTime = performance.now();
19
- }
20
- end() {
21
- this.endTime = performance.now();
22
- return this.duration();
23
- }
24
- duration() {
25
- return this.endTime - this.startTime;
26
- }
27
- static now() {
28
- return performance.now();
29
- }
30
- }
31
- async function benchmark(name, fn, options = {}) {
32
- const {
33
- iterations = 100,
34
- warmupIterations = 10,
35
- gcBetweenRuns = false
36
- } = options;
37
- for (let i = 0;i < warmupIterations; i++) {
38
- await fn();
39
- }
40
- if (gcBetweenRuns && globalThis.gc) {
41
- globalThis.gc();
42
- }
43
- const samples = [];
44
- let totalTime = 0;
45
- let minTime = Infinity;
46
- let maxTime = -Infinity;
47
- for (let i = 0;i < iterations; i++) {
48
- const start = PerformanceTimer.now();
49
- await fn();
50
- const end = PerformanceTimer.now();
51
- const duration = end - start;
52
- samples.push(duration);
53
- totalTime += duration;
54
- minTime = Math.min(minTime, duration);
55
- maxTime = Math.max(maxTime, duration);
56
- if (i % 10 === 9) {
57
- await new Promise((resolve) => setTimeout(resolve, 1));
58
- }
59
- }
60
- return {
61
- name,
62
- iterations,
63
- totalTime,
64
- avgTime: totalTime / iterations,
65
- minTime,
66
- maxTime,
67
- samples
68
- };
69
- }
70
- async function comparePerformance(name, impl1, impl2, options = {}) {
71
- const result1 = await benchmark(`${name}-impl1`, impl1, options);
72
- const result2 = await benchmark(`${name}-impl2`, impl2, options);
73
- const speedup = result1.avgTime / result2.avgTime;
74
- const winner = result1.avgTime < result2.avgTime ? "impl1" : "impl2";
75
- return {
76
- impl1: result1,
77
- impl2: result2,
78
- speedup: Math.max(speedup, 1 / speedup),
79
- winner
80
- };
81
- }
82
-
83
- class MemoryTracker {
84
- initialUsage = 0;
85
- start() {
86
- if (globalThis.performance?.memory) {
87
- this.initialUsage = globalThis.performance.memory.usedJSHeapSize;
88
- }
89
- }
90
- getUsage() {
91
- if (globalThis.performance?.memory) {
92
- return globalThis.performance.memory.usedJSHeapSize - this.initialUsage;
93
- }
94
- return 0;
95
- }
96
- format(bytes) {
97
- return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
98
- }
99
- }
100
- function createPerformanceReport(results) {
101
- const report = [];
102
- report.push("=== Performance Benchmark Report ===");
103
- report.push(`Generated: ${new Date().toISOString()}`);
104
- report.push("");
105
- results.forEach((result) => {
106
- report.push(`${result.name}:`);
107
- report.push(` Iterations: ${result.iterations}`);
108
- report.push(` Average: ${result.avgTime.toFixed(3)} ms`);
109
- report.push(` Min: ${result.minTime.toFixed(3)} ms`);
110
- report.push(` Max: ${result.maxTime.toFixed(3)} ms`);
111
- report.push(` Total: ${result.totalTime.toFixed(3)} ms`);
112
- report.push("");
113
- });
114
- return report.join(`
115
- `);
116
- }
117
- function isWebGPUSupported() {
118
- return !!(navigator.gpu && navigator.gpu.requestAdapter);
119
- }
120
- function isWebGLSupported() {
121
- try {
122
- const canvas = document.createElement("canvas");
123
- return !!(canvas.getContext("webgl") || canvas.getContext("webgl2"));
124
- } catch {
125
- return false;
126
- }
127
- }
128
- async function getGPUInfo() {
129
- const info = {
130
- vendor: "Unknown",
131
- renderer: "Unknown",
132
- webgpu: isWebGPUSupported(),
133
- webgl: isWebGLSupported()
134
- };
135
- if (info.webgpu) {
136
- try {
137
- const adapter = await navigator.gpu.requestAdapter();
138
- if (adapter) {
139
- info.vendor = adapter.info?.vendor || "Unknown";
140
- info.renderer = adapter.info?.architecture || "Unknown";
141
- }
142
- } catch {}
143
- }
144
- if (info.webgl && info.vendor === "Unknown") {
145
- try {
146
- const canvas = document.createElement("canvas");
147
- const gl = canvas.getContext("webgl2") || canvas.getContext("webgl");
148
- if (gl) {
149
- const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
150
- if (debugInfo) {
151
- info.vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
152
- info.renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
153
- }
154
- }
155
- } catch {}
156
- }
157
- return info;
158
- }
159
-
160
- // tests/performance/gpu/webgl-perf.ts
161
- function initWebGL() {
162
- const canvas = document.createElement("canvas");
163
- canvas.width = 512;
164
- canvas.height = 512;
165
- const gl = canvas.getContext("webgl2") || canvas.getContext("webgl");
166
- if (!gl) {
167
- console.warn("WebGL not supported");
168
- return null;
169
- }
170
- return { canvas, gl };
171
- }
172
- function compileShader(gl, type, source) {
173
- const shader = gl.createShader(type);
174
- if (!shader)
175
- return null;
176
- gl.shaderSource(shader, source);
177
- gl.compileShader(shader);
178
- if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
179
- console.error("Shader compilation error:", gl.getShaderInfoLog(shader));
180
- gl.deleteShader(shader);
181
- return null;
182
- }
183
- return shader;
184
- }
185
- function createProgram(gl, vertexSource, fragmentSource) {
186
- const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
187
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
188
- if (!vertexShader || !fragmentShader)
189
- return null;
190
- const program = gl.createProgram();
191
- if (!program)
192
- return null;
193
- gl.attachShader(program, vertexShader);
194
- gl.attachShader(program, fragmentShader);
195
- gl.linkProgram(program);
196
- if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
197
- console.error("Program linking error:", gl.getProgramInfoLog(program));
198
- gl.deleteProgram(program);
199
- return null;
200
- }
201
- return program;
202
- }
203
- async function benchmarkWebGLAtlasRendering(context, options = {}) {
204
- const { gl } = context;
205
- const vertexShaderSource = `
206
- attribute vec2 a_position;
207
- attribute vec2 a_texCoord;
208
- uniform mat3 u_matrix;
209
- varying vec2 v_texCoord;
210
-
211
- void main() {
212
- gl_Position = vec4((u_matrix * vec3(a_position, 1.0)).xy, 0.0, 1.0);
213
- v_texCoord = a_texCoord;
214
- }
215
- `;
216
- const fragmentShaderSource = `
217
- precision mediump float;
218
- uniform sampler2D u_texture;
219
- uniform vec4 u_color;
220
- varying vec2 v_texCoord;
221
-
222
- void main() {
223
- vec4 texColor = texture2D(u_texture, v_texCoord);
224
- gl_FragColor = vec4(texColor.rgb * u_color.rgb, texColor.a * u_color.a);
225
- }
226
- `;
227
- const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);
228
- if (!program)
229
- throw new Error("Failed to create shader program");
230
- context.program = program;
231
- gl.useProgram(program);
232
- const quadCount = 100;
233
- const vertices = [];
234
- const texCoords = [];
235
- for (let i = 0;i < quadCount; i++) {
236
- const x = i % 10 * 0.2 - 0.9;
237
- const y = Math.floor(i / 10) * 0.2 - 0.9;
238
- const size = 0.15;
239
- vertices.push(x, y, x + size, y, x, y + size, x + size, y, x + size, y + size, x, y + size);
240
- const u = i % 16 / 16;
241
- const v = Math.floor(i / 16) / 16;
242
- const texSize = 1 / 16;
243
- texCoords.push(u, v, u + texSize, v, u, v + texSize, u + texSize, v, u + texSize, v + texSize, u, v + texSize);
244
- }
245
- const positionBuffer = gl.createBuffer();
246
- gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
247
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
248
- const texCoordBuffer = gl.createBuffer();
249
- gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
250
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoords), gl.STATIC_DRAW);
251
- const texture = gl.createTexture();
252
- gl.bindTexture(gl.TEXTURE_2D, texture);
253
- const atlasData = new Uint8Array(256 * 256 * 4);
254
- for (let i = 0;i < atlasData.length; i += 4) {
255
- atlasData[i] = 255;
256
- atlasData[i + 1] = 255;
257
- atlasData[i + 2] = 255;
258
- atlasData[i + 3] = 255;
259
- }
260
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, atlasData);
261
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
262
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
263
- const positionLocation = gl.getAttribLocation(program, "a_position");
264
- const texCoordLocation = gl.getAttribLocation(program, "a_texCoord");
265
- gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
266
- gl.enableVertexAttribArray(positionLocation);
267
- gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
268
- gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
269
- gl.enableVertexAttribArray(texCoordLocation);
270
- gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
271
- const matrixLocation = gl.getUniformLocation(program, "u_matrix");
272
- const colorLocation = gl.getUniformLocation(program, "u_color");
273
- const textureLocation = gl.getUniformLocation(program, "u_texture");
274
- gl.uniformMatrix3fv(matrixLocation, false, [
275
- 1,
276
- 0,
277
- 0,
278
- 0,
279
- 1,
280
- 0,
281
- 0,
282
- 0,
283
- 1
284
- ]);
285
- gl.uniform4fv(colorLocation, [1, 1, 1, 1]);
286
- gl.uniform1i(textureLocation, 0);
287
- return benchmark("WebGL Atlas Rendering", () => {
288
- gl.clear(gl.COLOR_BUFFER_BIT);
289
- gl.drawArrays(gl.TRIANGLES, 0, quadCount * 6);
290
- }, options);
291
- }
292
- async function benchmarkWebGLSDF(context, options = {}) {
293
- const { gl, canvas } = context;
294
- const size = 64;
295
- const framebuffer = gl.createFramebuffer();
296
- context.framebuffer = framebuffer;
297
- const sdfTexture = gl.createTexture();
298
- gl.bindTexture(gl.TEXTURE_2D, sdfTexture);
299
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, size, size, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
300
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
301
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
302
- gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
303
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, sdfTexture, 0);
304
- if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
305
- throw new Error("Framebuffer not complete");
306
- }
307
- const vertexShaderSource = `
308
- attribute vec2 a_position;
309
- void main() {
310
- gl_Position = vec4(a_position, 0.0, 1.0);
311
- }
312
- `;
313
- const fragmentShaderSource = `
314
- precision mediump float;
315
- uniform vec2 u_resolution;
316
- uniform vec2 u_center;
317
- uniform float u_radius;
318
-
319
- void main() {
320
- vec2 coord = gl_FragCoord.xy;
321
- float dist = distance(coord, u_center);
322
- float sdf = (dist - u_radius) / u_resolution.x;
323
- float alpha = 0.5 + 0.5 * sdf;
324
- gl_FragColor = vec4(alpha, alpha, alpha, 1.0);
325
- }
326
- `;
327
- const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);
328
- if (!program)
329
- throw new Error("Failed to create SDF shader program");
330
- gl.useProgram(program);
331
- const vertices = new Float32Array([
332
- -1,
333
- -1,
334
- 1,
335
- -1,
336
- -1,
337
- 1,
338
- 1,
339
- -1,
340
- 1,
341
- 1,
342
- -1,
343
- 1
344
- ]);
345
- const buffer = gl.createBuffer();
346
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
347
- gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
348
- const positionLocation = gl.getAttribLocation(program, "a_position");
349
- gl.enableVertexAttribArray(positionLocation);
350
- gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
351
- const resolutionLocation = gl.getUniformLocation(program, "u_resolution");
352
- const centerLocation = gl.getUniformLocation(program, "u_center");
353
- const radiusLocation = gl.getUniformLocation(program, "u_radius");
354
- gl.uniform2f(resolutionLocation, size, size);
355
- gl.uniform2f(centerLocation, size / 2, size / 2);
356
- gl.uniform1f(radiusLocation, size / 3);
357
- gl.viewport(0, 0, size, size);
358
- return benchmark("WebGL SDF Generation", () => {
359
- gl.clear(gl.COLOR_BUFFER_BIT);
360
- gl.drawArrays(gl.TRIANGLES, 0, 6);
361
- }, options);
362
- }
363
- async function benchmarkWebGLGlyphBlitting(context, options = {}) {
364
- const { gl } = context;
365
- const vertexShaderSource = `
366
- attribute vec2 a_position;
367
- attribute vec2 a_texCoord;
368
- uniform vec2 u_offset;
369
- uniform vec2 u_scale;
370
- varying vec2 v_texCoord;
371
-
372
- void main() {
373
- vec2 pos = (a_position * u_scale) + u_offset;
374
- gl_Position = vec4(pos, 0.0, 1.0);
375
- v_texCoord = a_texCoord;
376
- }
377
- `;
378
- const fragmentShaderSource = `
379
- precision mediump float;
380
- uniform sampler2D u_texture;
381
- uniform float u_alpha;
382
- varying vec2 v_texCoord;
383
-
384
- void main() {
385
- vec4 color = texture2D(u_texture, v_texCoord);
386
- gl_FragColor = vec4(color.rgb, color.a * u_alpha);
387
- }
388
- `;
389
- const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);
390
- if (!program)
391
- throw new Error("Failed to create blitting program");
392
- gl.useProgram(program);
393
- const glyphTexture = gl.createTexture();
394
- gl.bindTexture(gl.TEXTURE_2D, glyphTexture);
395
- const glyphData = new Uint8Array(32 * 32 * 4);
396
- for (let i = 0;i < glyphData.length; i += 4) {
397
- const x = i / 4 % 32;
398
- const y = Math.floor(i / 4 / 32);
399
- const dist = Math.sqrt((x - 16) ** 2 + (y - 16) ** 2);
400
- const alpha = Math.max(0, 255 - dist * 8);
401
- glyphData[i] = 255;
402
- glyphData[i + 1] = 255;
403
- glyphData[i + 2] = 255;
404
- glyphData[i + 3] = alpha;
405
- }
406
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, glyphData);
407
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
408
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
409
- const vertices = new Float32Array([
410
- -1,
411
- -1,
412
- 0,
413
- 0,
414
- 1,
415
- -1,
416
- 1,
417
- 0,
418
- -1,
419
- 1,
420
- 0,
421
- 1,
422
- 1,
423
- -1,
424
- 1,
425
- 0,
426
- 1,
427
- 1,
428
- 1,
429
- 1,
430
- -1,
431
- 1,
432
- 0,
433
- 1
434
- ]);
435
- const buffer = gl.createBuffer();
436
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
437
- gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
438
- const positionLocation = gl.getAttribLocation(program, "a_position");
439
- const texCoordLocation = gl.getAttribLocation(program, "a_texCoord");
440
- gl.enableVertexAttribArray(positionLocation);
441
- gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 16, 0);
442
- gl.enableVertexAttribArray(texCoordLocation);
443
- gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 16, 8);
444
- const offsetLocation = gl.getUniformLocation(program, "u_offset");
445
- const scaleLocation = gl.getUniformLocation(program, "u_scale");
446
- const alphaLocation = gl.getUniformLocation(program, "u_alpha");
447
- const textureLocation = gl.getUniformLocation(program, "u_texture");
448
- gl.uniform1i(textureLocation, 0);
449
- const glyphCount = 50;
450
- return benchmark("WebGL Glyph Blitting", () => {
451
- gl.clear(gl.COLOR_BUFFER_BIT);
452
- for (let i = 0;i < glyphCount; i++) {
453
- const x = i % 10 * 0.2 - 0.9;
454
- const y = Math.floor(i / 10) * 0.2 - 0.9;
455
- const scale = 0.03;
456
- gl.uniform2f(offsetLocation, x, y);
457
- gl.uniform2f(scaleLocation, scale, scale);
458
- gl.uniform1f(alphaLocation, 1);
459
- gl.drawArrays(gl.TRIANGLES, 0, 6);
460
- }
461
- }, options);
462
- }
463
- export {
464
- initWebGL,
465
- benchmarkWebGLSDF,
466
- benchmarkWebGLGlyphBlitting,
467
- benchmarkWebGLAtlasRendering
468
- };
469
-
470
- //# debugId=6DC95163772016C064756E2164756E21
@@ -1,11 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../tests/performance/utils/perf-utils.ts", "../../tests/performance/gpu/webgl-perf.ts"],
4
- "sourcesContent": [
5
- "/**\n * Performance testing utilities for browser-based benchmarks\n */\n\nexport interface PerformanceResult {\n name: string;\n iterations: number;\n totalTime: number;\n avgTime: number;\n minTime: number;\n maxTime: number;\n samples: number[];\n}\n\nexport interface BenchmarkOptions {\n iterations?: number;\n warmupIterations?: number;\n gcBetweenRuns?: boolean;\n}\n\n/**\n * High-precision timing utility\n */\nexport class PerformanceTimer {\n private startTime = 0;\n private endTime = 0;\n\n start(): void {\n this.startTime = performance.now();\n }\n\n end(): number {\n this.endTime = performance.now();\n return this.duration();\n }\n\n duration(): number {\n return this.endTime - this.startTime;\n }\n\n static now(): number {\n return performance.now();\n }\n}\n\n/**\n * Run a performance benchmark on a function\n */\nexport async function benchmark(\n name: string,\n fn: () => void | Promise<void>,\n options: BenchmarkOptions = {}\n): Promise<PerformanceResult> {\n const {\n iterations = 100,\n warmupIterations = 10,\n gcBetweenRuns = false\n } = options;\n\n // Warmup\n for (let i = 0; i < warmupIterations; i++) {\n await fn();\n }\n\n // Force GC if available and requested\n if (gcBetweenRuns && (globalThis as any).gc) {\n (globalThis as any).gc();\n }\n\n const samples: number[] = [];\n let totalTime = 0;\n let minTime = Infinity;\n let maxTime = -Infinity;\n\n // Run benchmark\n for (let i = 0; i < iterations; i++) {\n const start = PerformanceTimer.now();\n await fn();\n const end = PerformanceTimer.now();\n \n const duration = end - start;\n samples.push(duration);\n totalTime += duration;\n minTime = Math.min(minTime, duration);\n maxTime = Math.max(maxTime, duration);\n\n // Small delay between iterations to prevent overheating\n if (i % 10 === 9) {\n await new Promise(resolve => setTimeout(resolve, 1));\n }\n }\n\n return {\n name,\n iterations,\n totalTime,\n avgTime: totalTime / iterations,\n minTime,\n maxTime,\n samples\n };\n}\n\n/**\n * Compare performance between two implementations\n */\nexport async function comparePerformance(\n name: string,\n impl1: () => void | Promise<void>,\n impl2: () => void | Promise<void>,\n options: BenchmarkOptions = {}\n): Promise<{\n impl1: PerformanceResult;\n impl2: PerformanceResult;\n speedup: number;\n winner: string;\n}> {\n const result1 = await benchmark(`${name}-impl1`, impl1, options);\n const result2 = await benchmark(`${name}-impl2`, impl2, options);\n\n const speedup = result1.avgTime / result2.avgTime;\n const winner = result1.avgTime < result2.avgTime ? 'impl1' : 'impl2';\n\n return {\n impl1: result1,\n impl2: result2,\n speedup: Math.max(speedup, 1 / speedup),\n winner\n };\n}\n\n/**\n * Memory usage tracker\n */\nexport class MemoryTracker {\n private initialUsage: number = 0;\n\n start(): void {\n if ((globalThis as any).performance?.memory) {\n this.initialUsage = (globalThis as any).performance.memory.usedJSHeapSize;\n }\n }\n\n getUsage(): number {\n if ((globalThis as any).performance?.memory) {\n return (globalThis as any).performance.memory.usedJSHeapSize - this.initialUsage;\n }\n return 0;\n }\n\n format(bytes: number): string {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n }\n}\n\n/**\n * Create a performance report\n */\nexport function createPerformanceReport(results: PerformanceResult[]): string {\n const report: string[] = [];\n \n report.push('=== Performance Benchmark Report ===');\n report.push(`Generated: ${new Date().toISOString()}`);\n report.push('');\n\n results.forEach(result => {\n report.push(`${result.name}:`);\n report.push(` Iterations: ${result.iterations}`);\n report.push(` Average: ${result.avgTime.toFixed(3)} ms`);\n report.push(` Min: ${result.minTime.toFixed(3)} ms`);\n report.push(` Max: ${result.maxTime.toFixed(3)} ms`);\n report.push(` Total: ${result.totalTime.toFixed(3)} ms`);\n report.push('');\n });\n\n return report.join('\\n');\n}\n\n/**\n * WebGPU support detection\n */\nexport function isWebGPUSupported(): boolean {\n return !!(navigator.gpu && navigator.gpu.requestAdapter);\n}\n\n/**\n * WebGL support detection\n */\nexport function isWebGLSupported(): boolean {\n try {\n const canvas = document.createElement('canvas');\n return !!(canvas.getContext('webgl') || canvas.getContext('webgl2'));\n } catch {\n return false;\n }\n}\n\n/**\n * Get GPU information\n */\nexport async function getGPUInfo(): Promise<{\n vendor: string;\n renderer: string;\n webgpu: boolean;\n webgl: boolean;\n}> {\n const info = {\n vendor: 'Unknown',\n renderer: 'Unknown',\n webgpu: isWebGPUSupported(),\n webgl: isWebGLSupported()\n };\n\n // Try WebGPU\n if (info.webgpu) {\n try {\n const adapter = await navigator.gpu.requestAdapter();\n if (adapter) {\n info.vendor = adapter.info?.vendor || 'Unknown';\n info.renderer = adapter.info?.architecture || 'Unknown';\n }\n } catch {\n // Ignore\n }\n }\n\n // Fallback to WebGL\n if (info.webgl && info.vendor === 'Unknown') {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\n if (gl) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n info.vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string;\n info.renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string;\n }\n }\n } catch {\n // Ignore\n }\n }\n\n return info;\n}",
6
- "/**\n * WebGL Performance Tests\n */\n\nimport { benchmark, PerformanceResult, BenchmarkOptions } from '../utils/perf-utils.js';\n\nexport interface WebGLTestContext {\n canvas: HTMLCanvasElement;\n gl: WebGL2RenderingContext | WebGLRenderingContext;\n program?: WebGLProgram;\n framebuffer?: WebGLFramebuffer;\n}\n\n/**\n * Initialize WebGL context\n */\nexport function initWebGL(): WebGLTestContext | null {\n const canvas = document.createElement('canvas');\n canvas.width = 512;\n canvas.height = 512;\n \n const gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\n if (!gl) {\n console.warn('WebGL not supported');\n return null;\n }\n\n return { canvas, gl };\n}\n\n/**\n * Compile shader\n */\nfunction compileShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | null {\n const shader = gl.createShader(type);\n if (!shader) return null;\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error('Shader compilation error:', gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n return null;\n }\n\n return shader;\n}\n\n/**\n * Create shader program\n */\nfunction createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | null {\n const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n\n if (!vertexShader || !fragmentShader) return null;\n\n const program = gl.createProgram();\n if (!program) return null;\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error('Program linking error:', gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n return null;\n }\n\n return program;\n}\n\n/**\n * WebGL Texture Atlas Rendering Performance Test\n */\nexport async function benchmarkWebGLAtlasRendering(\n context: WebGLTestContext,\n options: BenchmarkOptions = {}\n): Promise<PerformanceResult> {\n const { gl } = context;\n\n // Vertex shader for texture rendering\n const vertexShaderSource = `\n attribute vec2 a_position;\n attribute vec2 a_texCoord;\n uniform mat3 u_matrix;\n varying vec2 v_texCoord;\n\n void main() {\n gl_Position = vec4((u_matrix * vec3(a_position, 1.0)).xy, 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n `;\n\n // Fragment shader for texture rendering\n const fragmentShaderSource = `\n precision mediump float;\n uniform sampler2D u_texture;\n uniform vec4 u_color;\n varying vec2 v_texCoord;\n\n void main() {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor = vec4(texColor.rgb * u_color.rgb, texColor.a * u_color.a);\n }\n `;\n\n const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);\n if (!program) throw new Error('Failed to create shader program');\n\n context.program = program;\n gl.useProgram(program);\n\n // Create vertices for multiple quads (simulating glyph rendering)\n const quadCount = 100;\n const vertices: number[] = [];\n const texCoords: number[] = [];\n\n for (let i = 0; i < quadCount; i++) {\n const x = (i % 10) * 0.2 - 0.9;\n const y = Math.floor(i / 10) * 0.2 - 0.9;\n const size = 0.15;\n\n // Quad vertices\n vertices.push(\n x, y,\n x + size, y,\n x, y + size,\n x + size, y,\n x + size, y + size,\n x, y + size\n );\n\n // Texture coordinates\n const u = (i % 16) / 16;\n const v = Math.floor(i / 16) / 16;\n const texSize = 1.0 / 16;\n\n texCoords.push(\n u, v,\n u + texSize, v,\n u, v + texSize,\n u + texSize, v,\n u + texSize, v + texSize,\n u, v + texSize\n );\n }\n\n // Create buffers\n const positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoords), gl.STATIC_DRAW);\n\n // Create texture atlas\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n \n const atlasData = new Uint8Array(256 * 256 * 4);\n for (let i = 0; i < atlasData.length; i += 4) {\n atlasData[i] = 255; // R\n atlasData[i + 1] = 255; // G\n atlasData[i + 2] = 255; // B\n atlasData[i + 3] = 255; // A\n }\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, atlasData);\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\n // Set up attributes\n const positionLocation = gl.getAttribLocation(program, 'a_position');\n const texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.enableVertexAttribArray(texCoordLocation);\n gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n // Set uniforms\n const matrixLocation = gl.getUniformLocation(program, 'u_matrix');\n const colorLocation = gl.getUniformLocation(program, 'u_color');\n const textureLocation = gl.getUniformLocation(program, 'u_texture');\n\n gl.uniformMatrix3fv(matrixLocation, false, [\n 1, 0, 0,\n 0, 1, 0,\n 0, 0, 1\n ]);\n gl.uniform4fv(colorLocation, [1, 1, 1, 1]);\n gl.uniform1i(textureLocation, 0);\n\n return benchmark('WebGL Atlas Rendering', () => {\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, quadCount * 6);\n }, options);\n}\n\n/**\n * WebGL SDF Generation Performance Test\n */\nexport async function benchmarkWebGLSDF(\n context: WebGLTestContext,\n options: BenchmarkOptions = {}\n): Promise<PerformanceResult> {\n const { gl, canvas } = context;\n const size = 64;\n\n // Create framebuffer for offscreen rendering\n const framebuffer = gl.createFramebuffer();\n context.framebuffer = framebuffer;\n\n // Create texture for SDF output\n const sdfTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, sdfTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, size, size, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\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\n // Attach texture to framebuffer\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, sdfTexture, 0);\n\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error('Framebuffer not complete');\n }\n\n // SDF generation shader\n const vertexShaderSource = `\n attribute vec2 a_position;\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }\n `;\n\n const fragmentShaderSource = `\n precision mediump float;\n uniform vec2 u_resolution;\n uniform vec2 u_center;\n uniform float u_radius;\n\n void main() {\n vec2 coord = gl_FragCoord.xy;\n float dist = distance(coord, u_center);\n float sdf = (dist - u_radius) / u_resolution.x;\n float alpha = 0.5 + 0.5 * sdf;\n gl_FragColor = vec4(alpha, alpha, alpha, 1.0);\n }\n `;\n\n const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);\n if (!program) throw new Error('Failed to create SDF shader program');\n\n gl.useProgram(program);\n\n // Create full-screen quad\n const vertices = new Float32Array([\n -1, -1,\n 1, -1,\n -1, 1,\n 1, -1,\n 1, 1,\n -1, 1\n ]);\n\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(program, 'a_position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n // Set uniforms\n const resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n const centerLocation = gl.getUniformLocation(program, 'u_center');\n const radiusLocation = gl.getUniformLocation(program, 'u_radius');\n\n gl.uniform2f(resolutionLocation, size, size);\n gl.uniform2f(centerLocation, size / 2, size / 2);\n gl.uniform1f(radiusLocation, size / 3);\n\n gl.viewport(0, 0, size, size);\n\n return benchmark('WebGL SDF Generation', () => {\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }, options);\n}\n\n/**\n * WebGL Glyph Blitting Performance Test\n */\nexport async function benchmarkWebGLGlyphBlitting(\n context: WebGLTestContext,\n options: BenchmarkOptions = {}\n): Promise<PerformanceResult> {\n const { gl } = context;\n\n // Simple blitting shader\n const vertexShaderSource = `\n attribute vec2 a_position;\n attribute vec2 a_texCoord;\n uniform vec2 u_offset;\n uniform vec2 u_scale;\n varying vec2 v_texCoord;\n\n void main() {\n vec2 pos = (a_position * u_scale) + u_offset;\n gl_Position = vec4(pos, 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n `;\n\n const fragmentShaderSource = `\n precision mediump float;\n uniform sampler2D u_texture;\n uniform float u_alpha;\n varying vec2 v_texCoord;\n\n void main() {\n vec4 color = texture2D(u_texture, v_texCoord);\n gl_FragColor = vec4(color.rgb, color.a * u_alpha);\n }\n `;\n\n const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);\n if (!program) throw new Error('Failed to create blitting program');\n\n gl.useProgram(program);\n\n // Create glyph texture (simulating font atlas)\n const glyphTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, glyphTexture);\n \n const glyphData = new Uint8Array(32 * 32 * 4);\n for (let i = 0; i < glyphData.length; i += 4) {\n const x = (i / 4) % 32;\n const y = Math.floor((i / 4) / 32);\n const dist = Math.sqrt((x - 16) ** 2 + (y - 16) ** 2);\n const alpha = Math.max(0, 255 - dist * 8);\n \n glyphData[i] = 255; // R\n glyphData[i + 1] = 255; // G\n glyphData[i + 2] = 255; // B\n glyphData[i + 3] = alpha; // A\n }\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, glyphData);\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\n // Create quad for rendering\n const vertices = new Float32Array([\n // Position, TexCoord\n -1, -1, 0, 0,\n 1, -1, 1, 0,\n -1, 1, 0, 1,\n 1, -1, 1, 0,\n 1, 1, 1, 1,\n -1, 1, 0, 1\n ]);\n\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(program, 'a_position');\n const texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(texCoordLocation);\n gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 16, 8);\n\n // Set uniforms\n const offsetLocation = gl.getUniformLocation(program, 'u_offset');\n const scaleLocation = gl.getUniformLocation(program, 'u_scale');\n const alphaLocation = gl.getUniformLocation(program, 'u_alpha');\n const textureLocation = gl.getUniformLocation(program, 'u_texture');\n\n gl.uniform1i(textureLocation, 0);\n\n const glyphCount = 50;\n return benchmark('WebGL Glyph Blitting', () => {\n gl.clear(gl.COLOR_BUFFER_BIT);\n \n for (let i = 0; i < glyphCount; i++) {\n const x = (i % 10) * 0.2 - 0.9;\n const y = Math.floor(i / 10) * 0.2 - 0.9;\n const scale = 0.03;\n \n gl.uniform2f(offsetLocation, x, y);\n gl.uniform2f(scaleLocation, scale, scale);\n gl.uniform1f(alphaLocation, 1.0);\n \n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }, options);\n}"
7
- ],
8
- "mappings": "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",
9
- "debugId": "6DC95163772016C064756E2164756E21",
10
- "names": []
11
- }