xbintsc 0.5.38 → 0.5.42

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.
Files changed (132) hide show
  1. package/dist/src/cli/help.d.ts +1 -1
  2. package/dist/src/codegen/generator/module.js +23 -7
  3. package/dist/src/codegen/generator/module.js.map +1 -1
  4. package/dist/src/driver/version.d.ts +1 -1
  5. package/dist/src/driver/version.js +1 -1
  6. package/dist/src/extensions/gui/html.js +9 -2
  7. package/dist/src/extensions/gui/html.js.map +1 -1
  8. package/dist/tests/codegen/closures.test.js +7 -0
  9. package/dist/tests/codegen/closures.test.js.map +1 -1
  10. package/dist/tests/e2e/compile-objects-classes.test.js +31 -0
  11. package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
  12. package/dist/tests/e2e/gui-canvas-state.test.d.ts +9 -0
  13. package/dist/tests/e2e/gui-canvas-state.test.js +297 -0
  14. package/dist/tests/e2e/gui-canvas-state.test.js.map +1 -0
  15. package/dist/tests/e2e/gui-data-url.test.d.ts +10 -0
  16. package/dist/tests/e2e/gui-data-url.test.js +127 -0
  17. package/dist/tests/e2e/gui-data-url.test.js.map +1 -0
  18. package/dist/tests/e2e/gui-draw-perf.test.d.ts +22 -0
  19. package/dist/tests/e2e/gui-draw-perf.test.js +405 -0
  20. package/dist/tests/e2e/gui-draw-perf.test.js.map +1 -0
  21. package/dist/tests/e2e/gui-effects.test.js +96 -0
  22. package/dist/tests/e2e/gui-effects.test.js.map +1 -1
  23. package/dist/tests/e2e/gui-paint.test.js +77 -0
  24. package/dist/tests/e2e/gui-paint.test.js.map +1 -1
  25. package/dist/tests/e2e/gui-perf.test.d.ts +23 -0
  26. package/dist/tests/e2e/gui-perf.test.js +283 -0
  27. package/dist/tests/e2e/gui-perf.test.js.map +1 -0
  28. package/dist/tests/e2e/gui-script-import-order.test.js +9 -1
  29. package/dist/tests/e2e/gui-script-import-order.test.js.map +1 -1
  30. package/dist/tests/e2e/gui-webgl.test.js +4 -4
  31. package/dist/tests/e2e/gui-webgl.test.js.map +1 -1
  32. package/dist/tests/e2e/gui-webgl2-shadow-sampler.test.d.ts +8 -0
  33. package/dist/tests/e2e/gui-webgl2-shadow-sampler.test.js +336 -0
  34. package/dist/tests/e2e/gui-webgl2-shadow-sampler.test.js.map +1 -0
  35. package/dist/tests/extensions/gui.test.js +23 -0
  36. package/dist/tests/extensions/gui.test.js.map +1 -1
  37. package/doc/gui/api.md +28 -2
  38. package/doc/gui/canvas.md +114 -27
  39. package/doc/gui/known-issues.md +47 -19
  40. package/doc/gui/media.md +11 -2
  41. package/doc/gui/rendering.md +120 -18
  42. package/doc/gui/runtime.md +18 -3
  43. package/doc/gui/webgl.md +38 -19
  44. package/doc/gui.md +38 -5
  45. package/doc/zh-CN/gui/api.md +25 -2
  46. package/doc/zh-CN/gui/canvas.md +97 -26
  47. package/doc/zh-CN/gui/known-issues.md +32 -12
  48. package/doc/zh-CN/gui/media.md +9 -2
  49. package/doc/zh-CN/gui/rendering.md +89 -11
  50. package/doc/zh-CN/gui/runtime.md +13 -3
  51. package/doc/zh-CN/gui/webgl.md +27 -5
  52. package/doc/zh-CN/gui.md +25 -2
  53. package/package.json +7 -7
  54. package/runtime/ext_gui/browser.cpp +3 -1
  55. package/runtime/ext_gui/canvas.cpp +135 -89
  56. package/runtime/ext_gui/canvas.h +116 -0
  57. package/runtime/ext_gui/canvas_clip.cpp +143 -0
  58. package/runtime/ext_gui/canvas_composite.cpp +241 -0
  59. package/runtime/ext_gui/canvas_coverage.cpp +241 -0
  60. package/runtime/ext_gui/canvas_gradient.cpp +41 -4
  61. package/runtime/ext_gui/canvas_image_data.cpp +4 -0
  62. package/runtime/ext_gui/canvas_internal.h +34 -9
  63. package/runtime/ext_gui/canvas_raster.cpp +207 -178
  64. package/runtime/ext_gui/canvas_shadow.cpp +161 -0
  65. package/runtime/ext_gui/canvas_stroke.cpp +37 -9
  66. package/runtime/ext_gui/canvas_style.cpp +59 -0
  67. package/runtime/ext_gui/canvas_text.cpp +140 -0
  68. package/runtime/ext_gui/css.h +7 -0
  69. package/runtime/ext_gui/css_sheet.cpp +22 -0
  70. package/runtime/ext_gui/document.cpp +25 -1
  71. package/runtime/ext_gui/document.h +8 -0
  72. package/runtime/ext_gui/dom_api_canvas.cpp +48 -15
  73. package/runtime/ext_gui/dom_api_canvas_image.cpp +9 -0
  74. package/runtime/ext_gui/dom_api_canvas_state.cpp +217 -0
  75. package/runtime/ext_gui/dom_api_internal.h +36 -37
  76. package/runtime/ext_gui/dom_api_offscreen.cpp +213 -0
  77. package/runtime/ext_gui/dom_api_proto.cpp +18 -0
  78. package/runtime/ext_gui/dom_api_webgl.cpp +19 -9
  79. package/runtime/ext_gui/dom_api_webgl_internal.h +58 -0
  80. package/runtime/ext_gui/dom_api_webgl_source.cpp +18 -0
  81. package/runtime/ext_gui/gradient_values.cpp +56 -49
  82. package/runtime/ext_gui/gui.cpp +5 -0
  83. package/runtime/ext_gui/gui_canvas.cpp +4 -0
  84. package/runtime/ext_gui/gui_engine.h +30 -0
  85. package/runtime/ext_gui/gui_events.cpp +185 -58
  86. package/runtime/ext_gui/gui_media.cpp +3 -0
  87. package/runtime/ext_gui/image.cpp +225 -1
  88. package/runtime/ext_gui/image.h +6 -4
  89. package/runtime/ext_gui/image_bitmap_browser.cpp +11 -0
  90. package/runtime/ext_gui/layout.cpp +4 -0
  91. package/runtime/ext_gui/paint.cpp +72 -3
  92. package/runtime/ext_gui/paint.h +11 -1
  93. package/runtime/ext_gui/paint_background.cpp +110 -12
  94. package/runtime/ext_gui/paint_effects.cpp +2 -1
  95. package/runtime/ext_gui/paint_internal.h +5 -1
  96. package/runtime/ext_gui/perf.cpp +171 -0
  97. package/runtime/ext_gui/perf.h +127 -0
  98. package/runtime/ext_gui/renderer.cpp +190 -54
  99. package/runtime/ext_gui/renderer.h +52 -14
  100. package/runtime/ext_gui/renderer_image.cpp +135 -65
  101. package/runtime/ext_gui/renderer_internal.h +41 -3
  102. package/runtime/ext_gui/renderer_layer.cpp +552 -0
  103. package/runtime/ext_gui/renderer_text.cpp +24 -12
  104. package/runtime/ext_gui/style.cpp +101 -30
  105. package/runtime/ext_gui/style.h +35 -4
  106. package/runtime/ext_gui/style_print.cpp +15 -1
  107. package/runtime/ext_gui/style_values.cpp +10 -0
  108. package/runtime/ext_gui/text.cpp +23 -4
  109. package/runtime/ext_gui/text.h +29 -0
  110. package/runtime/ext_gui/text_cache.cpp +118 -0
  111. package/runtime/ext_gui/text_glyph_cache.cpp +100 -0
  112. package/runtime/ext_gui/webgl.h +48 -146
  113. package/runtime/ext_gui/webgl_blit.cpp +12 -1
  114. package/runtime/ext_gui/webgl_blit_depth.cpp +270 -0
  115. package/runtime/ext_gui/webgl_buffer.cpp +59 -1
  116. package/runtime/ext_gui/webgl_buffer_objects.cpp +106 -9
  117. package/runtime/ext_gui/webgl_clear.cpp +3 -0
  118. package/runtime/ext_gui/webgl_context.cpp +29 -3
  119. package/runtime/ext_gui/webgl_draw.cpp +75 -270
  120. package/runtime/ext_gui/webgl_draw_buffers.cpp +1 -0
  121. package/runtime/ext_gui/webgl_draw_setup.cpp +321 -0
  122. package/runtime/ext_gui/webgl_draw_state.h +130 -0
  123. package/runtime/ext_gui/webgl_glsl_scan.cpp +3 -8
  124. package/runtime/ext_gui/webgl_objects.h +148 -0
  125. package/runtime/ext_gui/webgl_pipeline.cpp +8 -8
  126. package/runtime/ext_gui/webgl_program_internal.h +35 -0
  127. package/runtime/ext_gui/webgl_shader.cpp +22 -30
  128. package/runtime/ext_gui/webgl_webgl2.cpp +36 -0
  129. package/runtime/ext_gui/window.cpp +56 -1
  130. package/src/codegen/generator/module.ts +22 -7
  131. package/src/driver/version.ts +1 -1
  132. package/src/extensions/gui/html.ts +9 -2
@@ -0,0 +1,336 @@
1
+ /**
2
+ * GUI e2e: comparative shadow samplers and `gl_FragDepth`.
3
+ *
4
+ * `sampler2DShadow` must reach SDL_GPU as a comparison sampler, and a fragment
5
+ * shader that writes `gl_FragDepth` must actually update the depth attachment.
6
+ * Both are checked by rendering and reading pixels back.
7
+ */
8
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
9
+ import { createGuiHarness, guiAvailable } from "./gui-helpers.js";
10
+ const harness = createGuiHarness();
11
+ const PAGE = `
12
+ <html><head><title>webgl2-shadow-sampler</title></head>
13
+ <body style="margin:0">
14
+ <canvas id="c" width="64" height="64"></canvas>
15
+ </body></html>`;
16
+ describe.skipIf(!guiAvailable)("gui extension — shadow samplers and gl_FragDepth", () => {
17
+ beforeAll(() => harness.setup());
18
+ afterAll(() => harness.cleanup());
19
+ it("samples a depth texture through sampler2DShadow", () => {
20
+ const { value } = harness.compileAndRun("webgl2-shadow-sampler", `
21
+ import { createWindow } from "gui";
22
+ import page from "./page.html";
23
+
24
+ const win = createWindow({ title: "shadow-sampler", width: 320, height: 240 });
25
+ const label = (name: string, value: any): void => console.log(name + "=" + value);
26
+
27
+ win.on("ready", () => {
28
+ const canvas: any = document.getElementById("c");
29
+ const gl: any = canvas.getContext("webgl2");
30
+ if (gl == null) {
31
+ console.log("webgl2=false");
32
+ win.close();
33
+ return;
34
+ }
35
+ const px = new Uint8Array(4);
36
+ const probe = (): string => {
37
+ gl.readPixels(32, 32, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);
38
+ return px[0] + "," + px[1] + "," + px[2] + "," + px[3];
39
+ };
40
+
41
+ const vs: any = gl.createShader(gl.VERTEX_SHADER);
42
+ gl.shaderSource(vs, "#version 300 es\\n" +
43
+ "in vec2 a_pos; void main() { gl_Position = vec4(a_pos, 0.0, 1.0); }");
44
+ gl.compileShader(vs);
45
+
46
+ const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
47
+ gl.shaderSource(fs, "#version 300 es\\n" +
48
+ "precision highp float;\\n" +
49
+ "uniform highp sampler2DShadow u_depth;\\n" +
50
+ "uniform highp float u_ref;\\n" +
51
+ "out highp vec4 fragColor;\\n" +
52
+ "void main() {\\n" +
53
+ " float v = texture(u_depth, vec3(0.5, 0.5, u_ref));\\n" +
54
+ " fragColor = vec4(v, v, v, 1.0);\\n" +
55
+ "}");
56
+ gl.compileShader(fs);
57
+ const fs_ok = gl.getShaderParameter(fs, gl.COMPILE_STATUS);
58
+ label("fs", fs_ok === true ? "true" : "false:" + gl.getShaderInfoLog(fs));
59
+
60
+ const program: any = gl.createProgram();
61
+ gl.attachShader(program, vs);
62
+ gl.attachShader(program, fs);
63
+ gl.linkProgram(program);
64
+ label("link", gl.getProgramParameter(program, gl.LINK_STATUS) === true);
65
+
66
+ const quad = gl.createBuffer();
67
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad);
68
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
69
+ gl.useProgram(program);
70
+ const pos: any = gl.getAttribLocation(program, "a_pos");
71
+ gl.enableVertexAttribArray(pos);
72
+ gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
73
+
74
+ // A depth texture cleared to 0.5, attached to a 16x16 framebuffer.
75
+ const depthTex: any = gl.createTexture();
76
+ gl.bindTexture(gl.TEXTURE_2D, depthTex);
77
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24, 16, 16, 0,
78
+ gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null);
79
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
80
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
81
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);
82
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, gl.LEQUAL);
83
+ label("compare-mode", gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE));
84
+ label("compare-func", gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC));
85
+
86
+ const colorTex: any = gl.createTexture();
87
+ gl.bindTexture(gl.TEXTURE_2D, colorTex);
88
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
89
+
90
+ const fb: any = gl.createFramebuffer();
91
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
92
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, colorTex, 0);
93
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTex, 0);
94
+ label("framebuffer", gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE);
95
+ gl.viewport(0, 0, 16, 16);
96
+ gl.clearColor(0, 0, 0, 1);
97
+ gl.clearDepth(0.5);
98
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
99
+
100
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
101
+ gl.viewport(0, 0, 64, 64);
102
+ gl.activeTexture(gl.TEXTURE0);
103
+ gl.bindTexture(gl.TEXTURE_2D, depthTex);
104
+ gl.uniform1i(gl.getUniformLocation(program, "u_depth"), 0);
105
+ const ref: any = gl.getUniformLocation(program, "u_ref");
106
+
107
+ gl.clearColor(0, 0, 0, 1);
108
+ gl.clear(gl.COLOR_BUFFER_BIT);
109
+ gl.uniform1f(ref, 0.25);
110
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
111
+ label("passes", probe());
112
+
113
+ gl.clear(gl.COLOR_BUFFER_BIT);
114
+ gl.uniform1f(ref, 0.75);
115
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
116
+ label("fails", probe());
117
+ label("error", gl.getError());
118
+ win.close();
119
+ });
120
+ win.loadHTML(page);
121
+ `, { files: { "page.html": PAGE } });
122
+ expect(value("fs")).toBe("true");
123
+ expect(value("link")).toBe("true");
124
+ expect(value("compare-mode")).toBe("34894"); // COMPARE_REF_TO_TEXTURE, 0x884e
125
+ expect(value("compare-func")).toBe("515"); // LEQUAL, 0x0203
126
+ expect(value("framebuffer")).toBe("true");
127
+ // ref 0.25 <= stored 0.5 -> pass (white); ref 0.75 > 0.5 -> fail (black).
128
+ expect(value("passes")).toBe("255,255,255,255");
129
+ expect(value("fails")).toBe("0,0,0,255");
130
+ expect(value("error")).toBe("0");
131
+ });
132
+ it("writes gl_FragDepth into the depth attachment", () => {
133
+ const { value } = harness.compileAndRun("webgl2-frag-depth", `
134
+ import { createWindow } from "gui";
135
+ import page from "./page.html";
136
+
137
+ const win = createWindow({ title: "frag-depth", width: 320, height: 240 });
138
+ const label = (name: string, value: any): void => console.log(name + "=" + value);
139
+
140
+ win.on("ready", () => {
141
+ const canvas: any = document.getElementById("c");
142
+ const gl: any = canvas.getContext("webgl2");
143
+ if (gl == null) {
144
+ console.log("webgl2=false");
145
+ win.close();
146
+ return;
147
+ }
148
+ const px = new Uint8Array(4);
149
+ const probe = (): string => {
150
+ gl.readPixels(32, 32, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);
151
+ return px[0] + "," + px[1] + "," + px[2] + "," + px[3];
152
+ };
153
+
154
+ const vs: any = gl.createShader(gl.VERTEX_SHADER);
155
+ gl.shaderSource(vs, "#version 300 es\\n" +
156
+ "in vec2 a_pos; uniform float u_z;" +
157
+ "void main() { gl_Position = vec4(a_pos, u_z, 1.0); }");
158
+ gl.compileShader(vs);
159
+
160
+ const depth_fs: any = gl.createShader(gl.FRAGMENT_SHADER);
161
+ gl.shaderSource(depth_fs, "#version 300 es\\n" +
162
+ "precision highp float; out vec4 fragColor;\\n" +
163
+ "void main() { gl_FragDepth = 0.25; fragColor = vec4(0.0, 0.0, 0.0, 1.0); }");
164
+ gl.compileShader(depth_fs);
165
+ label("depth-fs", gl.getShaderParameter(depth_fs, gl.COMPILE_STATUS) === true);
166
+
167
+ const red_fs: any = gl.createShader(gl.FRAGMENT_SHADER);
168
+ gl.shaderSource(red_fs, "#version 300 es\\n" +
169
+ "precision highp float; out vec4 fragColor;\\n" +
170
+ "void main() { fragColor = vec4(1.0, 0.0, 0.0, 1.0); }");
171
+ gl.compileShader(red_fs);
172
+
173
+ const depth_program: any = gl.createProgram();
174
+ gl.attachShader(depth_program, vs);
175
+ gl.attachShader(depth_program, depth_fs);
176
+ gl.linkProgram(depth_program);
177
+ label("depth-link", gl.getProgramParameter(depth_program, gl.LINK_STATUS) === true);
178
+
179
+ const red_program: any = gl.createProgram();
180
+ gl.attachShader(red_program, vs);
181
+ gl.attachShader(red_program, red_fs);
182
+ gl.linkProgram(red_program);
183
+ label("red-link", gl.getProgramParameter(red_program, gl.LINK_STATUS) === true);
184
+
185
+ const quad = gl.createBuffer();
186
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad);
187
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
188
+
189
+ gl.viewport(0, 0, 64, 64);
190
+ gl.clearColor(0, 0, 0, 1);
191
+ gl.clearDepth(1.0);
192
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
193
+
194
+ gl.enable(gl.DEPTH_TEST);
195
+ gl.depthFunc(gl.ALWAYS);
196
+ gl.depthMask(true);
197
+ gl.useProgram(depth_program);
198
+ let pos: any = gl.getAttribLocation(depth_program, "a_pos");
199
+ gl.enableVertexAttribArray(pos);
200
+ gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
201
+ gl.uniform1f(gl.getUniformLocation(depth_program, "u_z"), 0.0);
202
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
203
+
204
+ // z = 0.5 is farther than the 0.25 the first pass wrote, so LESS fails.
205
+ gl.depthFunc(gl.LESS);
206
+ gl.depthMask(false);
207
+ gl.useProgram(red_program);
208
+ pos = gl.getAttribLocation(red_program, "a_pos");
209
+ gl.enableVertexAttribArray(pos);
210
+ gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
211
+ gl.uniform1f(gl.getUniformLocation(red_program, "u_z"), 0.5);
212
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
213
+ label("occluded", probe());
214
+
215
+ gl.depthMask(true);
216
+ gl.disable(gl.DEPTH_TEST);
217
+ label("error", gl.getError());
218
+ win.close();
219
+ });
220
+ win.loadHTML(page);
221
+ `, { files: { "page.html": PAGE } });
222
+ expect(value("depth-fs")).toBe("true");
223
+ expect(value("depth-link")).toBe("true");
224
+ expect(value("red-link")).toBe("true");
225
+ // If gl_FragDepth were ignored the depth stayed 1.0 and the red quad would
226
+ // have painted over the black first pass.
227
+ expect(value("occluded")).toBe("0,0,0,255");
228
+ expect(value("error")).toBe("0");
229
+ });
230
+ it("copies a depth attachment with blitFramebuffer", () => {
231
+ const { value } = harness.compileAndRun("webgl2-depth-blit", `
232
+ import { createWindow } from "gui";
233
+ import page from "./page.html";
234
+
235
+ const win = createWindow({ title: "depth-blit", width: 320, height: 240 });
236
+ const label = (name: string, value: any): void => console.log(name + "=" + value);
237
+
238
+ win.on("ready", () => {
239
+ const canvas: any = document.getElementById("c");
240
+ const gl: any = canvas.getContext("webgl2");
241
+ if (gl == null) {
242
+ console.log("webgl2=false");
243
+ win.close();
244
+ return;
245
+ }
246
+ const px = new Uint8Array(4);
247
+ const probe = (x: number, y: number): string => {
248
+ gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);
249
+ return px[0] + "," + px[1] + "," + px[2] + "," + px[3];
250
+ };
251
+ const make_program = (vs_source: string, fs_source: string): any => {
252
+ const vs: any = gl.createShader(gl.VERTEX_SHADER);
253
+ gl.shaderSource(vs, vs_source);
254
+ gl.compileShader(vs);
255
+ const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
256
+ gl.shaderSource(fs, fs_source);
257
+ gl.compileShader(fs);
258
+ const program: any = gl.createProgram();
259
+ gl.attachShader(program, vs);
260
+ gl.attachShader(program, fs);
261
+ gl.linkProgram(program);
262
+ return program;
263
+ };
264
+ const show = make_program(
265
+ "#version 300 es\\nin vec2 a_pos; out vec2 v_uv;" +
266
+ "void main() { v_uv = a_pos * 0.5 + 0.5;" +
267
+ " gl_Position = vec4(a_pos, 0.0, 1.0); }",
268
+ "#version 300 es\\nprecision highp float; in vec2 v_uv;" +
269
+ "uniform sampler2D u_tex; out vec4 fragColor;" +
270
+ "void main() { fragColor = vec4(vec3(texture(u_tex, v_uv).r), 1.0); }");
271
+ label("show-link", gl.getProgramParameter(show, gl.LINK_STATUS) === true);
272
+
273
+ const make_target = (depth_value: number): any[] => {
274
+ const depth: any = gl.createTexture();
275
+ gl.bindTexture(gl.TEXTURE_2D, depth);
276
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24, 16, 16, 0,
277
+ gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null);
278
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
279
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
280
+ const color: any = gl.createTexture();
281
+ gl.bindTexture(gl.TEXTURE_2D, color);
282
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
283
+ const fb: any = gl.createFramebuffer();
284
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
285
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, color, 0);
286
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
287
+ gl.viewport(0, 0, 16, 16);
288
+ gl.clearColor(0, 0, 0, 1);
289
+ gl.clearDepth(depth_value);
290
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
291
+ return [fb, color, depth];
292
+ };
293
+ const source = make_target(0.25);
294
+ const destination = make_target(1.0);
295
+ label("complete",
296
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE);
297
+
298
+ // Copy only the left half of the source into the right half of the
299
+ // destination; the destination's left half must keep depth 1.0.
300
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, source[0]);
301
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, destination[0]);
302
+ gl.blitFramebuffer(0, 0, 8, 16, 8, 0, 16, 16, gl.DEPTH_BUFFER_BIT, gl.NEAREST);
303
+ label("blit-error", gl.getError());
304
+
305
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
306
+ gl.viewport(0, 0, 64, 64);
307
+ gl.useProgram(show);
308
+ gl.uniform1i(gl.getUniformLocation(show, "u_tex"), 0);
309
+ gl.activeTexture(gl.TEXTURE0);
310
+ gl.bindTexture(gl.TEXTURE_2D, destination[2]);
311
+ gl.clearColor(0, 0, 0, 1);
312
+ gl.clear(gl.COLOR_BUFFER_BIT);
313
+ const quad = gl.createBuffer();
314
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad);
315
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
316
+ const pos: any = gl.getAttribLocation(show, "a_pos");
317
+ gl.enableVertexAttribArray(pos);
318
+ gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
319
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
320
+ label("untouched", probe(16, 32));
321
+ label("copied", probe(48, 32));
322
+ win.close();
323
+ });
324
+ win.loadHTML(page);
325
+ `, { files: { "page.html": PAGE } });
326
+ expect(value("show-link")).toBe("true");
327
+ expect(value("complete")).toBe("true");
328
+ expect(value("blit-error")).toBe("0");
329
+ // 1.0 stays white; the copied 0.25 depth reads back near 64.
330
+ expect(value("untouched")).toBe("255,255,255,255");
331
+ const copied = value("copied").split(",").map(Number);
332
+ expect(copied[0] ?? 0).toBeGreaterThan(55);
333
+ expect(copied[0] ?? 0).toBeLessThan(75);
334
+ });
335
+ });
336
+ //# sourceMappingURL=gui-webgl2-shadow-sampler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui-webgl2-shadow-sampler.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-webgl2-shadow-sampler.test.ts"],"names":[],"mappings":"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"}
@@ -96,6 +96,29 @@ describe("gui .html asset loader", () => {
96
96
  expect(moduleSource).not.toContain("../lib/util");
97
97
  expect(parseDiagnostics(moduleSource)).toBe(0);
98
98
  });
99
+ it("keeps a CRLF external script intact when hoisting its imports", () => {
100
+ /* The parser indexes newline-normalized text, so masking the raw file would
101
+ * blank the wrong spans and leave fragments like "js';" in the body. */
102
+ const directory = writeFiles({
103
+ "app.ts": "import { size } from './util';\r\n\r\nconst label = 'ready';\r\nconsole.log(size, label);\r\n",
104
+ "util.ts": "export const size = 1;",
105
+ });
106
+ const htmlPath = join(directory, "page.html");
107
+ const { moduleSource, sourceRanges } = loadHtmlAsset(htmlPath, `<html>\r\n<body>\r\n<script src="./app.ts"></script>\r\n</body>\r\n</html>`);
108
+ expect(moduleSource).toContain("console.log(size, label);");
109
+ expect(moduleSource).toContain("const label = 'ready';");
110
+ expect(moduleSource.match(/js';/g)).toBeNull();
111
+ const html = htmlOf(moduleSource);
112
+ expect(html).not.toContain("\r");
113
+ expect(html).toContain("<body>");
114
+ expect(sourceRanges).toHaveLength(1);
115
+ const range = sourceRanges[0];
116
+ const body = moduleSource.slice(range.start, range.end);
117
+ expect(body).toContain("const label = 'ready';");
118
+ expect(body).toContain("console.log(size, label);");
119
+ expect(body).not.toContain("import {");
120
+ expect(parseDiagnostics(moduleSource)).toBe(0);
121
+ });
99
122
  it("strips export modifiers from an external script", () => {
100
123
  const directory = writeFiles({
101
124
  "app.ts": "export const a = 1;\nexport function f() { return a; }",
@@ -1 +1 @@
1
- {"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/extensions/gui.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/extensions/gui.test.ts"],"names":[],"mappings":"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"}
package/doc/gui/api.md CHANGED
@@ -94,8 +94,9 @@ requestAnimationFrame(frame);
94
94
  | `Event`, `CustomEvent`, `ProgressEvent`, `MouseEvent`, `KeyboardEvent`, `PointerEvent`, `WheelEvent`, `FocusEvent`, `InputEvent`, `SubmitEvent` | event constructors; the `init` argument is kept as given (`detail`, `composed`, mouse/keyboard fields, …) |
95
95
  | `AbortController`, `AbortSignal` | a real controller/signal pair for `{ signal }` listener removal, with `abort()`, `aborted`, `reason`, `onabort` and `throwIfAborted()` |
96
96
  | `HTMLCanvasElement`, `HTMLImageElement`, `WebGLRenderingContext`, `WebGL2RenderingContext`, `WebGLBuffer`/`WebGLTexture`/`WebGLShader`/`WebGLProgram`/`WebGLFramebuffer`/`WebGLRenderbuffer`/`WebGLUniformLocation`/`WebGLActiveInfo`/`WebGLVertexArrayObject`/`WebGLSampler`/`WebGLQuery`/`WebGLSync`/`WebGLTransformFeedback` | real constructor values. `canvas.getContext("webgl")` and `getContext("webgl2")` return GPU contexts (see [WebGL](./webgl.md)). |
97
- | `ImageBitmap`, `createImageBitmap(source)` | immutable bitmaps backed by decoded pixels (`<img>`, `<canvas>`, `<video>` frames and `ImageData` shapes); the promise resolves immediately and `texImage2D` accepts the result |
98
- | `ImageData`, `OffscreenCanvas`, `XRWebGL*`, `Request`, `Headers`, `Response`, `ReadableStream`, `DOMParser` | `typeof` probes answer `"undefined"` (no XR/fetch/streaming backend), which lets a page take its "unsupported" branch instead of calling a no-op stub. Three.js pages use its real renderer on this backend (see [Known issues](./known-issues.md)). |
97
+ | `ImageBitmap`, `createImageBitmap(source)` | immutable bitmaps backed by decoded pixels (`<img>`, `<canvas>`, `<video>` frames, `OffscreenCanvas` and `ImageData` shapes); the promise resolves immediately and `texImage2D` accepts the result |
98
+ | `OffscreenCanvas` | a real 2D offscreen bitmap with `getContext("2d")`, `width`/`height`, `transferToImageBitmap()` and `convertToBlob()`; `canvas.transferControlToOffscreen()` hands an element's bitmap over (see [Canvas](./canvas.md)). There is no offscreen WebGL context. |
99
+ | `ImageData`, `XRWebGL*`, `Request`, `Headers`, `Response`, `ReadableStream`, `DOMParser` | `typeof` probes answer `"undefined"` (no XR/fetch/streaming backend), which lets a page take its "unsupported" branch instead of calling a no-op stub. Three.js pages use its real renderer on this backend (see [Known issues](./known-issues.md)). |
99
100
  | `requestAnimationFrame` / `cancelAnimationFrame` | queued on the window's frame list; see [Runtime integration](./runtime.md) |
100
101
  | `alert` / `confirm` / `prompt`, `matchMedia`, `getComputedStyle`, `escape` | host implementations. `matchMedia` returns a **live** list (cached per query): `matches` is re-evaluated on resize and `change` listeners fire when it flips. `confirm`/`prompt` use a native dialog only with `XT_GUI_DIALOGS=1`; otherwise they report the message on stderr and return the documented default (Annex B `escape` encodes per UTF-16 code unit, matching `decodeURIComponent(escape(bytes))`) |
101
102
 
@@ -211,6 +212,31 @@ steady state every one of them is constant — a climbing `detachedNodes` or
211
212
  `handles` means the program removes nodes faster than it releases them (see
212
213
  [Node lifetime](./dom.md#node-lifetime)).
213
214
 
215
+ The same object reports what the last completed frame did and how much work the
216
+ program has done in total, which is how rendering cost is measured (see
217
+ [Performance](./rendering.md#performance-m20)):
218
+
219
+ | Field | Meaning |
220
+ | --- | --- |
221
+ | `frameMs`, `restyleMs`, `layoutMs`, `paintMs`, `uploadMs`, `drawMs` | phase timings of the last frame (milliseconds) |
222
+ | `frames`, `presents`, `exposes`, `deferred`, `skippedFrames`, `starvedFrames`, `transitionFrames` | frame loop activity: `presents` counts swapchain frames, `exposes` the presents the window system asked for with an expose/shown/restore event, `deferred` the presents a starved frame postponed, `skippedFrames` the frames nothing needed and `starvedFrames` the frames that asked to present and got no drawable target |
223
+ | `restyles`, `restyleNodes`, `rulesEvaluated`, `mediaEvaluated`, `layouts`, `layoutBoxes` | cascade and layout work |
224
+ | `textShapeCalls`, `textShapeHits`, `textCacheBytes`, `textCacheEntries` | shaping cache misses/hits and its occupancy |
225
+ | `paints`, `paintOps`, `drawRuns`, `drawCalls`, `uploadSubmits`, `vertices`, `syncNodes` | display-list, draw-call and upload work |
226
+ | `canvasDraws`, `canvasUploads`, `canvasUploadBytes` | Canvas 2D draw calls, texture uploads and the bytes copied (a partial redraw uploads only its dirty rectangle) |
227
+ | `webglDraws`, `webglPasses`, `webglPipelineMisses`, `webglBufferUploadBytes` | WebGL draw calls, render passes opened, pipelines created and buffer bytes copied |
228
+
229
+ Every field except the `*Ms` timings is cumulative, so subtract two snapshots to
230
+ get one frame. `restyleMs` covers the cascade **and** the layout pass it
231
+ triggers (which is also reported on its own as `layoutMs`).
232
+ `presents - exposes - deferred` counts the presents only the page asked for: an
233
+ expose/shown/restore event means the window has no contents and must be redrawn,
234
+ at a time the window server chooses, and a deferred present replays work an
235
+ earlier frame built when no swapchain image was available (`starvedFrames` counts
236
+ those frames — a climbing value means the window is not being updated at all).
237
+ `XT_GUI_PERF=1` prints the same numbers on stderr (one line per frame;
238
+ `XT_GUI_PERF=<N>` averages over N frames).
239
+
214
240
  They are used by `tests/e2e/gui-*.test.ts` to assert parsing, selector matching,
215
241
  specificity, inheritance, `!important` and layout geometry. They will stay useful
216
242
  afterwards for debugging.