xbintsc 0.5.31 → 0.5.32

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 (181) hide show
  1. package/README.md +16 -10
  2. package/dist/src/binder/references.js +14 -1
  3. package/dist/src/binder/references.js.map +1 -1
  4. package/dist/src/cli/help.d.ts +1 -1
  5. package/dist/src/codegen/generator/module.d.ts +1 -0
  6. package/dist/src/codegen/generator/module.js +54 -0
  7. package/dist/src/codegen/generator/module.js.map +1 -1
  8. package/dist/src/codegen/generator/statements/variables.js +6 -4
  9. package/dist/src/codegen/generator/statements/variables.js.map +1 -1
  10. package/dist/src/driver/version.d.ts +1 -1
  11. package/dist/src/driver/version.js +1 -1
  12. package/dist/src/extensions/gui/css.d.ts +26 -0
  13. package/dist/src/extensions/gui/css.js +100 -0
  14. package/dist/src/extensions/gui/css.js.map +1 -0
  15. package/dist/src/extensions/gui/html.js +9 -2
  16. package/dist/src/extensions/gui/html.js.map +1 -1
  17. package/dist/src/extensions/gui/index.js +16 -2
  18. package/dist/src/extensions/gui/index.js.map +1 -1
  19. package/dist/src/extensions/gui/three.d.ts +16 -0
  20. package/dist/src/extensions/gui/three.js +22 -0
  21. package/dist/src/extensions/gui/three.js.map +1 -0
  22. package/dist/src/extensions/media/index.d.ts +6 -5
  23. package/dist/src/extensions/media/index.js +12 -14
  24. package/dist/src/extensions/media/index.js.map +1 -1
  25. package/dist/tests/e2e/compile-builtins.test.js +24 -0
  26. package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
  27. package/dist/tests/e2e/compile-objects-classes.test.js +23 -0
  28. package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
  29. package/dist/tests/e2e/gui-browser.test.js +1 -1
  30. package/dist/tests/e2e/gui-browser.test.js.map +1 -1
  31. package/dist/tests/e2e/gui-effects.test.d.ts +6 -0
  32. package/dist/tests/e2e/gui-effects.test.js +262 -0
  33. package/dist/tests/e2e/gui-effects.test.js.map +1 -0
  34. package/dist/tests/e2e/gui-example-webgl.test.d.ts +10 -0
  35. package/dist/tests/e2e/gui-example-webgl.test.js +75 -0
  36. package/dist/tests/e2e/gui-example-webgl.test.js.map +1 -0
  37. package/dist/tests/e2e/gui-example-webgl2.test.d.ts +8 -0
  38. package/dist/tests/e2e/gui-example-webgl2.test.js +72 -0
  39. package/dist/tests/e2e/gui-example-webgl2.test.js.map +1 -0
  40. package/dist/tests/e2e/gui-layout.test.js +48 -0
  41. package/dist/tests/e2e/gui-layout.test.js.map +1 -1
  42. package/dist/tests/e2e/gui-media.test.js +5 -4
  43. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  44. package/dist/tests/e2e/gui-webgl.test.d.ts +11 -0
  45. package/dist/tests/e2e/gui-webgl.test.js +179 -0
  46. package/dist/tests/e2e/gui-webgl.test.js.map +1 -0
  47. package/dist/tests/e2e/gui-webgl2.test.d.ts +10 -0
  48. package/dist/tests/e2e/gui-webgl2.test.js +238 -0
  49. package/dist/tests/e2e/gui-webgl2.test.js.map +1 -0
  50. package/dist/tests/extensions/gui.test.js +41 -0
  51. package/dist/tests/extensions/gui.test.js.map +1 -1
  52. package/dist/tests/extensions/media.test.js +7 -3
  53. package/dist/tests/extensions/media.test.js.map +1 -1
  54. package/doc/ai/extensions.md +29 -9
  55. package/doc/ai/troubleshooting.md +12 -8
  56. package/doc/ai/zh-CN/extensions.md +26 -8
  57. package/doc/ai/zh-CN/troubleshooting.md +10 -6
  58. package/doc/gui/api.md +3 -2
  59. package/doc/gui/build.md +72 -16
  60. package/doc/gui/canvas.md +11 -3
  61. package/doc/gui/dom.md +33 -18
  62. package/doc/gui/known-issues.md +57 -24
  63. package/doc/gui/layout.md +18 -0
  64. package/doc/gui/media.md +17 -13
  65. package/doc/gui/rendering.md +50 -3
  66. package/doc/gui/webgl.md +256 -0
  67. package/doc/gui.md +108 -17
  68. package/doc/npm-package.md +6 -4
  69. package/doc/requirements.md +18 -9
  70. package/doc/zh-CN/gui/api.md +3 -2
  71. package/doc/zh-CN/gui/build.md +64 -15
  72. package/doc/zh-CN/gui/canvas.md +9 -2
  73. package/doc/zh-CN/gui/dom.md +20 -7
  74. package/doc/zh-CN/gui/known-issues.md +45 -19
  75. package/doc/zh-CN/gui/layout.md +14 -0
  76. package/doc/zh-CN/gui/media.md +15 -11
  77. package/doc/zh-CN/gui/rendering.md +41 -4
  78. package/doc/zh-CN/gui/webgl.md +115 -0
  79. package/doc/zh-CN/gui.md +89 -14
  80. package/doc/zh-CN/npm-package.md +9 -6
  81. package/doc/zh-CN/requirements.md +12 -6
  82. package/llms.txt +2 -0
  83. package/package.json +1 -1
  84. package/runtime/ext_gui/browser.cpp +39 -13
  85. package/runtime/ext_gui/canvas.cpp +3 -18
  86. package/runtime/ext_gui/canvas_internal.h +10 -0
  87. package/runtime/ext_gui/canvas_raster.cpp +60 -0
  88. package/runtime/ext_gui/clip_values.cpp +246 -0
  89. package/runtime/ext_gui/css.cpp +94 -0
  90. package/runtime/ext_gui/css.h +22 -1
  91. package/runtime/ext_gui/css_match.cpp +3 -0
  92. package/runtime/ext_gui/css_selector.cpp +9 -0
  93. package/runtime/ext_gui/css_sheet.cpp +89 -45
  94. package/runtime/ext_gui/document.cpp +4 -1
  95. package/runtime/ext_gui/document.h +2 -0
  96. package/runtime/ext_gui/dom.h +16 -0
  97. package/runtime/ext_gui/dom_api.cpp +1 -0
  98. package/runtime/ext_gui/dom_api_canvas.cpp +17 -80
  99. package/runtime/ext_gui/dom_api_canvas_extra.cpp +130 -1
  100. package/runtime/ext_gui/dom_api_canvas_pending.cpp +41 -0
  101. package/runtime/ext_gui/dom_api_internal.h +259 -0
  102. package/runtime/ext_gui/dom_api_webgl.cpp +376 -0
  103. package/runtime/ext_gui/dom_api_webgl2.cpp +434 -0
  104. package/runtime/ext_gui/dom_api_webgl2_draw.cpp +269 -0
  105. package/runtime/ext_gui/dom_api_webgl_buffer.cpp +212 -0
  106. package/runtime/ext_gui/dom_api_webgl_rt.h +30 -0
  107. package/runtime/ext_gui/dom_api_webgl_shader.cpp +443 -0
  108. package/runtime/ext_gui/dom_api_webgl_state.cpp +444 -0
  109. package/runtime/ext_gui/dom_api_webgl_texture.cpp +445 -0
  110. package/runtime/ext_gui/effect_values.cpp +312 -0
  111. package/runtime/ext_gui/gradient_values.cpp +476 -0
  112. package/runtime/ext_gui/grid_values.cpp +230 -0
  113. package/runtime/ext_gui/gui_canvas.cpp +50 -2
  114. package/runtime/ext_gui/gui_engine.h +27 -0
  115. package/runtime/ext_gui/gui_events.cpp +4 -1
  116. package/runtime/ext_gui/gui_media.cpp +1 -1
  117. package/runtime/ext_gui/gui_webgl.cpp +83 -0
  118. package/runtime/ext_gui/layout.cpp +21 -0
  119. package/runtime/ext_gui/layout_flow.cpp +81 -4
  120. package/runtime/ext_gui/layout_flow_internal.h +31 -0
  121. package/runtime/ext_gui/layout_grid.cpp +374 -0
  122. package/runtime/ext_gui/media.h +1 -1
  123. package/runtime/ext_gui/media_api.h +2 -2
  124. package/runtime/ext_gui/media_query.cpp +211 -0
  125. package/runtime/ext_gui/paint.cpp +111 -77
  126. package/runtime/ext_gui/paint.h +33 -3
  127. package/runtime/ext_gui/paint_background.cpp +229 -0
  128. package/runtime/ext_gui/paint_clip.cpp +268 -0
  129. package/runtime/ext_gui/paint_effects.cpp +324 -0
  130. package/runtime/ext_gui/paint_internal.h +85 -0
  131. package/runtime/ext_gui/renderer.cpp +8 -31
  132. package/runtime/ext_gui/renderer_clip.cpp +196 -0
  133. package/runtime/ext_gui/renderer_image.cpp +13 -8
  134. package/runtime/ext_gui/renderer_internal.h +15 -8
  135. package/runtime/ext_gui/renderer_text.cpp +6 -31
  136. package/runtime/ext_gui/style.cpp +343 -20
  137. package/runtime/ext_gui/style.h +144 -3
  138. package/runtime/ext_gui/style_print.cpp +134 -1
  139. package/runtime/ext_gui/style_values.cpp +152 -126
  140. package/runtime/ext_gui/style_values_internal.h +35 -0
  141. package/runtime/ext_gui/webgl.h +466 -0
  142. package/runtime/ext_gui/webgl2_constants.h +274 -0
  143. package/runtime/ext_gui/webgl_buffer.cpp +565 -0
  144. package/runtime/ext_gui/webgl_constants.h +317 -0
  145. package/runtime/ext_gui/webgl_context.cpp +466 -0
  146. package/runtime/ext_gui/webgl_draw.cpp +495 -0
  147. package/runtime/ext_gui/webgl_glsl.h +125 -0
  148. package/runtime/ext_gui/webgl_glsl_compile.cpp +431 -0
  149. package/runtime/ext_gui/webgl_glsl_rewrite.cpp +349 -0
  150. package/runtime/ext_gui/webgl_glsl_scan.cpp +581 -0
  151. package/runtime/ext_gui/webgl_msl.cpp +62 -0
  152. package/runtime/ext_gui/webgl_msl.h +33 -0
  153. package/runtime/ext_gui/webgl_pipeline.cpp +274 -0
  154. package/runtime/ext_gui/webgl_program_internal.h +18 -0
  155. package/runtime/ext_gui/webgl_shader.cpp +582 -0
  156. package/runtime/ext_gui/webgl_texture.cpp +293 -0
  157. package/runtime/ext_gui/webgl_uniform.cpp +167 -0
  158. package/runtime/ext_gui/webgl_webgl2.cpp +224 -0
  159. package/runtime/ext_media/media.cpp +1 -1
  160. package/runtime/ext_media/media_bridge.c +9 -3
  161. package/runtime/rt_internal.h +1 -0
  162. package/runtime/xt_containers/access.inc +8 -0
  163. package/runtime/xt_regex/api.inc +2 -0
  164. package/runtime/xt_regex/matcher.inc +16 -3
  165. package/runtime/xt_regex/parser.inc +8 -2
  166. package/runtime/xt_regex/types.inc +3 -0
  167. package/runtime/xt_stdlib2/regexp-match.inc +60 -21
  168. package/runtime/xt_stdlib2/regexp.inc +1 -0
  169. package/runtime/xt_typed_array.c +1 -1
  170. package/scripts/build-gui.ts +90 -3
  171. package/scripts/build-media.ts +323 -58
  172. package/scripts/setup-vs-toolchain.ps1 +152 -0
  173. package/src/binder/references.ts +13 -1
  174. package/src/codegen/generator/module.ts +50 -0
  175. package/src/codegen/generator/statements/variables.ts +6 -3
  176. package/src/driver/version.ts +1 -1
  177. package/src/extensions/gui/css.ts +113 -0
  178. package/src/extensions/gui/html.ts +9 -2
  179. package/src/extensions/gui/index.ts +16 -2
  180. package/src/extensions/gui/three.ts +25 -0
  181. package/src/extensions/media/index.ts +13 -16
@@ -0,0 +1,238 @@
1
+ /**
2
+ * End-to-end test for the `gui` extension's WebGL 2 context.
3
+ *
4
+ * Exercises the parts that are genuinely new over WebGL 1: the `#version 300
5
+ * es` shader dialect, vertex-array objects, instanced draws with a per-instance
6
+ * attribute divisor, `texStorage2D`, `clearBufferfv`, buffer copies and sampler
7
+ * objects. As in the WebGL 1 test, `readPixels` proves the GPU produced the
8
+ * picture.
9
+ */
10
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
11
+ import { createGuiHarness, guiAvailable } from "./gui-helpers.js";
12
+ const harness = createGuiHarness();
13
+ const PAGE = `
14
+ <html><head><title>webgl2</title></head>
15
+ <body style="margin:0">
16
+ <canvas id="c" width="64" height="64"></canvas>
17
+ </body></html>`;
18
+ describe.skipIf(!guiAvailable)("gui extension — WebGL 2", () => {
19
+ beforeAll(() => harness.setup());
20
+ afterAll(() => harness.cleanup());
21
+ it("runs #version 300 es shaders, VAOs and instanced draws", () => {
22
+ const { value, stderr } = harness.compileAndRun("webgl2", `
23
+ import { createWindow } from "gui";
24
+ import page from "./page.html";
25
+
26
+ const win = createWindow({ title: "webgl2", width: 320, height: 240 });
27
+ const label = (name: string, value: any): void => console.log(name + "=" + value);
28
+ const rgba = (p: any): string => p[0] + "," + p[1] + "," + p[2] + "," + p[3];
29
+
30
+ win.on("ready", () => {
31
+ const canvas: any = document.getElementById("c");
32
+ const gl: any = canvas.getContext("webgl2");
33
+ label("webgl2", gl != null);
34
+ if (gl == null) {
35
+ win.close();
36
+ return;
37
+ }
38
+ label("webgl1-after", canvas.getContext("webgl") == null);
39
+ label("version", gl.getParameter(gl.VERSION));
40
+ label("draw-buffers", gl.getParameter(gl.MAX_DRAW_BUFFERS));
41
+
42
+ canvas.width = 64;
43
+ canvas.height = 64;
44
+ gl.viewport(0, 0, 64, 64);
45
+ const pixels = new Uint8Array(4);
46
+ const probe = (x: number, y: number): string => {
47
+ gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
48
+ return rgba(pixels);
49
+ };
50
+
51
+ gl.clearColor(1, 0, 0, 1);
52
+ gl.clear(gl.COLOR_BUFFER_BIT);
53
+ label("clear-red", probe(32, 32));
54
+ gl.clearBufferfv(gl.COLOR, 0, new Float32Array([0, 1, 0, 1]));
55
+ label("clear-buffer", probe(32, 32));
56
+
57
+ const vs: any = gl.createShader(gl.VERTEX_SHADER);
58
+ gl.shaderSource(vs, "#version 300 es\\n" +
59
+ "in vec2 a_pos; in vec2 a_offset; out vec2 v_uv;\\n" +
60
+ "void main() { v_uv = a_pos * 0.5 + 0.5;\\n" +
61
+ " gl_Position = vec4(a_pos * 0.35 + a_offset, 0.0, 1.0); }");
62
+ gl.compileShader(vs);
63
+ const vs_ok = gl.getShaderParameter(vs, gl.COMPILE_STATUS);
64
+ label("vs", vs_ok === true ? "true" : "false:" + gl.getShaderInfoLog(vs));
65
+ const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
66
+ gl.shaderSource(fs, "#version 300 es\\n" +
67
+ "precision highp float; in vec2 v_uv; uniform vec4 u_color;\\n" +
68
+ "out vec4 fragColor; void main() { fragColor = u_color; }");
69
+ gl.compileShader(fs);
70
+ const fs_ok = gl.getShaderParameter(fs, gl.COMPILE_STATUS);
71
+ label("fs", fs_ok === true ? "true" : "false:" + gl.getShaderInfoLog(fs));
72
+ const program: any = gl.createProgram();
73
+ gl.attachShader(program, vs);
74
+ gl.attachShader(program, fs);
75
+ gl.linkProgram(program);
76
+ const link_ok = gl.getProgramParameter(program, gl.LINK_STATUS);
77
+ label("link", link_ok === true ? "true" : "false:" + gl.getProgramInfoLog(program));
78
+ gl.useProgram(program);
79
+ label("ubo", gl.getUniformBlockIndex(program, "Nope"));
80
+
81
+ const vao: any = gl.createVertexArray();
82
+ label("vao", vao != null);
83
+ gl.bindVertexArray(vao);
84
+ const quad = gl.createBuffer();
85
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad);
86
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
87
+ -1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1,
88
+ ]), gl.STATIC_DRAW);
89
+ const pos: any = gl.getAttribLocation(program, "a_pos");
90
+ gl.enableVertexAttribArray(pos);
91
+ gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);
92
+ const offsets = gl.createBuffer();
93
+ gl.bindBuffer(gl.ARRAY_BUFFER, offsets);
94
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-0.5, 0, 0, 0, 0.5, 0]), gl.STATIC_DRAW);
95
+ const offset_loc: any = gl.getAttribLocation(program, "a_offset");
96
+ gl.enableVertexAttribArray(offset_loc);
97
+ gl.vertexAttribPointer(offset_loc, 2, gl.FLOAT, false, 0, 0);
98
+ gl.vertexAttribDivisor(offset_loc, 1);
99
+ // Round-trip the VAO through the default state to prove it restores.
100
+ gl.bindVertexArray(null);
101
+ gl.bindVertexArray(vao);
102
+
103
+ gl.uniform4f(gl.getUniformLocation(program, "u_color"), 0, 0, 1, 1);
104
+ gl.clearColor(1, 0, 0, 1);
105
+ gl.clear(gl.COLOR_BUFFER_BIT);
106
+ gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, 3);
107
+ label("inst-0", probe(16, 32));
108
+ label("inst-1", probe(32, 32));
109
+ label("inst-2", probe(48, 32));
110
+ label("inst-background", probe(4, 32));
111
+
112
+ // Sampler objects and immutable texture storage.
113
+ const sampler: any = gl.createSampler();
114
+ gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
115
+ gl.bindSampler(0, sampler);
116
+ label("sampler", gl.getSamplerParameter(sampler, gl.TEXTURE_MIN_FILTER) === gl.NEAREST);
117
+ const texture: any = gl.createTexture();
118
+ gl.bindTexture(gl.TEXTURE_2D, texture);
119
+ gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, 2, 2);
120
+ gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE,
121
+ new Uint8Array([255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 0, 255]));
122
+ label("tex-storage", gl.getError());
123
+
124
+ // copyBufferSubData / getBufferSubData.
125
+ const source = gl.createBuffer();
126
+ gl.bindBuffer(gl.COPY_READ_BUFFER, source);
127
+ gl.bufferData(gl.COPY_READ_BUFFER, new Uint8Array([1, 2, 3, 4]), gl.STATIC_DRAW);
128
+ const destination = gl.createBuffer();
129
+ gl.bindBuffer(gl.COPY_WRITE_BUFFER, destination);
130
+ gl.bufferData(gl.COPY_WRITE_BUFFER, new Uint8Array([9, 9, 9, 9]), gl.STATIC_DRAW);
131
+ gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 4);
132
+ const out = new Uint8Array(4);
133
+ gl.getBufferSubData(gl.COPY_WRITE_BUFFER, 0, out, 0, 4);
134
+ label("copy", out[0] + "," + out[1] + "," + out[2] + "," + out[3]);
135
+ label("error", gl.getError());
136
+ win.close();
137
+ });
138
+
139
+ win.loadHTML(page);
140
+ console.log("loaded");
141
+ `, { files: { "page.html": PAGE }, autocloseMs: 10000 });
142
+ expect(value("webgl2")).toBe("true");
143
+ expect(value("webgl1-after")).toBe("true");
144
+ expect(value("version")).toContain("WebGL 2.0");
145
+ expect(value("draw-buffers")).toBe("1");
146
+ expect(value("clear-red")).toBe("255,0,0,255");
147
+ expect(value("clear-buffer")).toBe("0,255,0,255");
148
+ expect(value("vs")).toBe("true");
149
+ expect(value("fs")).toBe("true");
150
+ expect(value("link")).toBe("true");
151
+ expect(value("ubo")).toBe("4294967295");
152
+ expect(value("vao")).toBe("true");
153
+ expect(value("inst-0")).toBe("0,0,255,255");
154
+ expect(value("inst-1")).toBe("0,0,255,255");
155
+ expect(value("inst-2")).toBe("0,0,255,255");
156
+ expect(value("inst-background")).toBe("255,0,0,255");
157
+ expect(value("sampler")).toBe("true");
158
+ expect(value("tex-storage")).toBe("0");
159
+ expect(value("copy")).toBe("1,2,3,4");
160
+ expect(value("error")).toBe("0");
161
+ expect(stderr).not.toContain("pipeline creation failed");
162
+ });
163
+ it("flattens struct uniforms into addressable fields", () => {
164
+ const { value } = harness.compileAndRun("webgl2-struct", `
165
+ import { createWindow } from "gui";
166
+ import page from "./page.html";
167
+
168
+ const win = createWindow({ title: "struct", width: 320, height: 240 });
169
+ const label = (name: string, value: any): void => console.log(name + "=" + value);
170
+
171
+ win.on("ready", () => {
172
+ const canvas: any = document.getElementById("c");
173
+ const gl: any = canvas.getContext("webgl2");
174
+ label("webgl2", gl != null);
175
+ if (gl == null) {
176
+ win.close();
177
+ return;
178
+ }
179
+ const vs: any = gl.createShader(gl.VERTEX_SHADER);
180
+ gl.shaderSource(vs, "#version 300 es\\n" +
181
+ "in vec2 a_pos; void main() { gl_Position = vec4(a_pos, 0.0, 1.0); }");
182
+ gl.compileShader(vs);
183
+ const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
184
+ gl.shaderSource(fs, "#version 300 es\\n" +
185
+ "precision highp float;\\n" +
186
+ "struct Light { vec3 color; float power; };\\n" +
187
+ "uniform Light lights[2];\\n" +
188
+ "out vec4 fragColor;\\n" +
189
+ "void main() { fragColor = vec4(max(lights[0].color, lights[1].color), 1.0); }");
190
+ gl.compileShader(fs);
191
+ label("compile", gl.getShaderParameter(vs, gl.COMPILE_STATUS) === true &&
192
+ gl.getShaderParameter(fs, gl.COMPILE_STATUS) === true);
193
+ const program: any = gl.createProgram();
194
+ gl.attachShader(program, vs);
195
+ gl.attachShader(program, fs);
196
+ gl.linkProgram(program);
197
+ label("link", gl.getProgramParameter(program, gl.LINK_STATUS) === true);
198
+ gl.useProgram(program);
199
+ const c0: any = gl.getUniformLocation(program, "lights[0].color");
200
+ const c1: any = gl.getUniformLocation(program, "lights[1].color");
201
+ const p0: any = gl.getUniformLocation(program, "lights[0].power");
202
+ const p1: any = gl.getUniformLocation(program, "lights[1].power");
203
+ label("locations", (c0 != null) + "," + (c1 != null) + "," + (p0 != null) + "," + (p1 != null));
204
+ gl.uniform3f(c0, 1, 0, 0);
205
+ gl.uniform3f(c1, 0, 1, 0);
206
+ gl.uniform1f(p0, 1);
207
+ gl.uniform1f(p1, 1);
208
+ const buffer: any = gl.createBuffer();
209
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
210
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
211
+ -1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1,
212
+ ]), gl.STATIC_DRAW);
213
+ const pos: any = gl.getAttribLocation(program, "a_pos");
214
+ gl.enableVertexAttribArray(pos);
215
+ gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);
216
+ gl.viewport(0, 0, 64, 64);
217
+ gl.clearColor(0, 0, 0, 1);
218
+ gl.clear(gl.COLOR_BUFFER_BIT);
219
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
220
+ const px = new Uint8Array(4);
221
+ gl.readPixels(32, 32, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);
222
+ label("pixel", px[0] + "," + px[1] + "," + px[2] + "," + px[3]);
223
+ label("error", gl.getError());
224
+ win.close();
225
+ });
226
+
227
+ win.loadHTML(page);
228
+ console.log("loaded");
229
+ `, { files: { "page.html": PAGE }, autocloseMs: 10000 });
230
+ expect(value("webgl2")).toBe("true");
231
+ expect(value("compile")).toBe("true");
232
+ expect(value("link")).toBe("true");
233
+ expect(value("locations")).toBe("true,true,true,true");
234
+ expect(value("pixel")).toBe("255,255,0,255");
235
+ expect(value("error")).toBe("0");
236
+ });
237
+ });
238
+ //# sourceMappingURL=gui-webgl2.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui-webgl2.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-webgl2.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { tmpdir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
4
  import { afterEach, describe, expect, it } from "vitest";
5
5
  import { loadHtmlAsset } from "../../src/extensions/gui/html.js";
6
+ import { loadScriptAsset } from "../../src/extensions/gui/three.js";
6
7
  import { guiExtension } from "../../src/extensions/gui/index.js";
7
8
  import { DiagnosticBag } from "../../src/diagnostics/diagnostic.js";
8
9
  import { SourceFile } from "../../src/diagnostics/source.js";
@@ -173,5 +174,45 @@ describe("gui .html asset loader", () => {
173
174
  expect(parseDiagnostics(moduleSource), src).toBe(0);
174
175
  }
175
176
  });
177
+ it("inlines linked stylesheets and their @imports into the HTML", () => {
178
+ const directory = writeFiles({
179
+ "styles/main.css": '@import "./base.css";\n.a { color: red; }',
180
+ "styles/base.css": "body { background: #000; }",
181
+ "page.html": "",
182
+ });
183
+ const htmlPath = join(directory, "page.html");
184
+ const html = '<link rel="stylesheet" href="styles/main.css"><div class="a">x</div>';
185
+ const { moduleSource, dependencies } = loadHtmlAsset(htmlPath, html);
186
+ expect(htmlOf(moduleSource)).toContain("body { background: #000; }");
187
+ expect(htmlOf(moduleSource)).toContain(".a { color: red; }");
188
+ expect(htmlOf(moduleSource)).not.toContain("<link");
189
+ expect(moduleSource).not.toContain("@import");
190
+ expect(dependencies).toContain(join(directory, "styles/main.css"));
191
+ expect(dependencies).toContain(join(directory, "styles/base.css"));
192
+ expect(parseDiagnostics(moduleSource)).toBe(0);
193
+ });
194
+ it("does not inline remote stylesheet links", () => {
195
+ const { moduleSource } = loadHtmlAsset("page.html", '<link rel="stylesheet" href="https://example.com/x.css">');
196
+ expect(htmlOf(moduleSource)).toContain('href="https://example.com/x.css"');
197
+ });
198
+ it("disables three.js's regex unroller but keeps the renderer untouched", () => {
199
+ const source = "const unrollLoopPattern = /#pragma unroll_loop_start/g;\n" +
200
+ "class WebGLRenderer {\n constructor() {}\n}\n" +
201
+ "class WebGL1Renderer extends WebGLRenderer {}\n" +
202
+ "export { WebGL1Renderer, WebGLRenderer };\n";
203
+ const { moduleSource, dependencies } = loadScriptAsset("three.module.js", source);
204
+ expect(moduleSource).toContain("const unrollLoopPattern = /__xt_never_match__/;");
205
+ expect(moduleSource).toContain("class WebGLRenderer {");
206
+ expect(moduleSource).toContain("class WebGL1Renderer extends WebGLRenderer {}");
207
+ expect(moduleSource).not.toContain("WebGLRendererWebGL");
208
+ expect(moduleSource).not.toContain("__XtCanvas2DRenderer");
209
+ expect(dependencies).toBeUndefined();
210
+ });
211
+ it("leaves non-three JavaScript assets untouched", () => {
212
+ const source = "export const answer = 42;\n";
213
+ const result = loadScriptAsset("app.js", source);
214
+ expect(result.moduleSource).toBe(source);
215
+ expect(result.dependencies).toBeUndefined();
216
+ });
176
217
  });
177
218
  //# sourceMappingURL=gui.test.js.map
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,WAAW,GAAa,EAAE,CAAC;AAEjC,gEAAgE;AAChE,SAAS,UAAU,CAAC,KAA6B;IAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACrE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,2DAA2D;AAC3D,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC;IAC1E,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED,oEAAoE;AACpE,SAAS,MAAM,CAAC,YAAoB;IAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAW,CAAC;AAC9E,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG,+BAA+B,CAAC;QAC7C,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CACpC,WAAW,EACX,6BAA6B,IAAI,WAAW,CAC7C,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,wBAAwB,EAAE,sCAAsC,CAAC,CAAC;QACjG,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC9F,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;QAC5E,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,2CAA2C,CAAC,CAAC;QACpF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,kDAAkD,CAAC,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,oDAAoD,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,QAAQ,EAAE,mEAAmE;SAC9E,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,mEAAmE,CAAC;QACjF,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,wBAAwB,EAAE,sCAAsC,CAAC,CAAC;QACjG,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;QAC/E,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,gBAAgB,EAAE,yDAAyD;YAC3E,aAAa,EAAE,wBAAwB;SACxC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;QAC7F,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,QAAQ,EAAE,wDAAwD;SACnE,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,sCAAsC,CAAC,CAAC,CAAC,OAAO,CACvG,WAAW,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,MAAM,EAAE,2CAA2C;YACnD,MAAM,EAAE,2CAA2C;YACnD,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,CACV,aAAa,CAAC,QAAQ,EAAE,8DAA8D,CAAC,CACxF,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC3D,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAY,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CACpC,WAAW,EACX,WAAW,KAAK,oBAAoB,MAAM,WAAW,CACtD,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,QAAQ,EAAE;gBACR,iCAAiC;gBACjC,yBAAyB;gBACzB,iDAAiD;gBACjD,cAAc;gBACd,eAAe;gBACf,0BAA0B;gBAC1B,sBAAsB;gBACtB,oBAAoB;gBACpB,mDAAmD;gBACnD,0CAA0C;aAC3C,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACjF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC1D,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtD,oEAAoE;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACvD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAC3E,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,gCAAgC,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,qBAAqB,CAAC,EAAE,CAAC;YACpE,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,CAAC,CAAC;YACjF,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACxD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,iBAAiB,EAAE,2CAA2C;YAC9D,iBAAiB,EAAE,4BAA4B;YAC/C,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,sEAAsE,CAAC;QACpF,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CACpC,WAAW,EACX,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GACV,2DAA2D;YAC3D,gDAAgD;YAChD,iDAAiD;YACjD,6CAA6C,CAAC;QAChD,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAClF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;QAClF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;QAChF,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,6BAA6B,CAAC;QAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -13,7 +13,7 @@ afterEach(() => {
13
13
  vi.restoreAllMocks();
14
14
  mocks.findRuntimeLibrary.mockReset();
15
15
  });
16
- /** Pretend to be a POSIX host so the Windows-only guard does not fire. */
16
+ /** Pretend to be a POSIX host, so the archive name in messages is `media.a`. */
17
17
  function posixHost() {
18
18
  vi.spyOn(process, "platform", "get").mockReturnValue("darwin");
19
19
  }
@@ -41,9 +41,13 @@ describe("media extension object", () => {
41
41
  expect(() => mediaExtension.nativeObjects?.()).toThrow(/media native library not found/);
42
42
  expect(() => mediaExtension.nativeObjects?.()).toThrow(/npm run media/);
43
43
  });
44
- it("reports that Windows has no media archive yet", () => {
44
+ it("links media.lib and the Win32 system libraries on Windows", () => {
45
45
  vi.spyOn(process, "platform", "get").mockReturnValue("win32");
46
- expect(() => mediaExtension.nativeObjects?.()).toThrow(/not available on Windows/);
46
+ mocks.findRuntimeLibrary.mockReturnValue("C:/repo/runtime/lib/win32-x64/media.lib");
47
+ expect(mediaExtension.nativeObjects?.()).toEqual(["C:/repo/runtime/lib/win32-x64/media.lib"]);
48
+ /* FFmpeg's avutil/avcodec reference bcrypt, ole32 and user32; the GUI
49
+ * extension already contributes the rest. */
50
+ expect(mediaExtension.linkerFlags?.()).toEqual(["-lbcrypt", "-lole32", "-luser32"]);
47
51
  });
48
52
  it("rejects a build that enables media without gui", () => {
49
53
  const registry = createDefaultRegistry().register(mediaExtension);
@@ -1 +1 @@
1
- {"version":3,"file":"media.test.js","sourceRoot":"","sources":["../../../tests/extensions/media.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media.test.js","sourceRoot":"","sources":["../../../tests/extensions/media.test.ts"],"names":[],"mappings":"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"}
@@ -68,8 +68,12 @@ import { createWindow, run } from "gui";
68
68
  ```
69
69
 
70
70
  It is a self-contained GPU-accelerated renderer (own HTML parser, CSS cascade,
71
- layout and compositor) — not a system WebView. It ships as a per-platform
72
- prebuilt `gui.a`/`gui.lib` because it is C++. `<img>` decodes through the engine
71
+ layout and compositor) — not a system WebView. The compiler side also inlines
72
+ local `<link rel="stylesheet">` files (and their `@import`s) into `<style>`
73
+ blocks, because the runtime parser only reads inline `<style>`; and it rewrites
74
+ a bundled three.js module's `WebGLRenderer` to use the real WebGL 2 backend:
75
+ only its shader unroller is patched, and no Canvas2D fallback is bundled. It
76
+ ships as a per-platform prebuilt `gui.a`/`gui.lib` because it is C++. `<img>` decodes through the engine
73
77
  itself; `<video>`/`<audio>` do **not** work with `gui` alone — they need the
74
78
  separate [`media`](#media--videoaudio-decoding) extension. `<canvas>` is
75
79
  supported too: `getContext("2d")` returns a context whose fills, paths,
@@ -79,7 +83,11 @@ handles expose `canvas` drawing plus `width`/`height`. CSS
79
83
  `transform`/`transform-origin` work as paint-time effects, so a box (and the
80
84
  text, images and children in it) can be translated, scaled and rotated without
81
85
  reflowing anything — animate it per frame from `requestAnimationFrame` or with
82
- `transition: transform` (see `examples/gui/pelican-svg`). If the archive is
86
+ `transition: transform` (see `examples/gui/pelican-svg`). The CSS subset also
87
+ covers `@media`, `::before`/`::after` generated content, multi-layer linear/radial
88
+ backgrounds, `text-shadow`, `clip-path` and `filter` colour/shadow effects;
89
+ `backdrop-filter` and true group blur are documented approximations or
90
+ unsupported. If the archive is
83
91
  missing for your platform, the build fails with an actionable message; design
84
92
  and roadmap live in [../gui.md](../gui.md) (overview; the engine is documented by
85
93
  function under [`doc/gui/`](../gui/)), and the scripting surface in
@@ -92,8 +100,14 @@ Pages written for the browser also get the browser globals they reach for —
92
100
  `escape`, the `Event` family and a Web Audio *surface* (`AudioContext` with
93
101
  nodes, params and buffers, but no mixer) — plus a frame pump that starts at
94
102
  `loadHTML` and re-arms only while animation-frame callbacks remain, so a page
95
- that never calls `run()` still paints and then exits. WebGL, WebXR, `<video>`/
96
- `<audio>` without `media`, `fetch` and streaming are **not** implemented:
103
+ that never calls `run()` still paints and then exits. **WebGL 1.0 and 2.0 are implemented**: `canvas.getContext("webgl")` /
104
+ `"webgl2"` return a GPU context whose GLSL ES shaders are compiled to SPIR-V by
105
+ a bundled glslang — consumed by Vulkan, or cross-compiled to MSL by bundled
106
+ SPIRV-Cross on Metal — and drawn through SDL_GPU; the page composites the colour
107
+ texture without a CPU readback, and WebGL 2 adds VAOs, instancing, integer
108
+ attributes, sampler objects, `texStorage2D` and buffer copies (see
109
+ [../gui/webgl.md](../gui/webgl.md)). WebXR, `<video>`/`<audio>` without
110
+ `media`, `fetch` and streaming are **not** implemented:
97
111
  `typeof` answers `"undefined"` so a page takes its own fallback branch. See
98
112
  [../gui/api.md](../gui/api.md#browser-globals).
99
113
 
@@ -101,8 +115,8 @@ that never calls `run()` still paints and then exits. WebGL, WebXR, `<video>`/
101
115
 
102
116
  Enable with `--ext media` **together with** `gui` (`--ext gui,media`; the
103
117
  registry rejects `media` on its own). It links a separate FFmpeg-backed
104
- `media.a`, so adding `<video>`/`<audio>` playback does not make a GUI-only
105
- binary any larger.
118
+ `media.a`/`media.lib`, so adding `<video>`/`<audio>` playback does not make a
119
+ GUI-only binary any larger.
106
120
 
107
121
  The DOM API is the same as for any HTML media element: `play()` / `pause()` /
108
122
  `load()`, the `paused` / `ended` / `duration` / `currentTime` / `volume` /
@@ -112,8 +126,14 @@ The DOM API is the same as for any HTML media element: `play()` / `pause()` /
112
126
  elements and CSS (see `examples/gui/media.ts`). Video frames and audio PCM are
113
127
  decoded on the main thread; video goes through the image texture path. Without
114
128
  the extension, opening a media source fails and fires `error` (the element and
115
- its API still exist). The archive is POSIX-only for now, so Windows reports the
116
- same `error`; see [../gui/known-issues.md](../gui/known-issues.md).
129
+ its API still exist). The archive is built for every host: POSIX produces
130
+ `media.a`, while Windows produces `media.lib` from FFmpeg compiled with the
131
+ MSVC-targeting `clang-cl`, so it links with `gui.lib`. Building it on Windows
132
+ needs a POSIX shell (Git for Windows' bundled bash) and a native GNU make
133
+ (Chocolatey `make`, or `xbintsc_MAKE`). See
134
+ [../gui/build.md](../gui/build.md). Without the archive, or on a host where
135
+ `npm run media` has not run, media elements report `error`; see
136
+ [../gui/known-issues.md](../gui/known-issues.md).
117
137
 
118
138
  ## Third-party npm packages
119
139
 
@@ -102,11 +102,13 @@ stderr — read the stderr, not just the first line. Frequent causes:
102
102
  `xbintsc doctor` shows the compiler and its target; prefer the LLVM bundled
103
103
  with Visual Studio, which locates the SDK itself. If your installation still
104
104
  needs the environment imported, run from an **x64 Native Tools Command Prompt
105
- for VS 2022** (or **ARM64 Native Tools** on Windows on ARM), or import it
106
- first:
105
+ for VS 2022** (or **ARM64 Native Tools** on Windows on ARM), or import the
106
+ same Visual Studio setup CI uses:
107
107
  ```powershell
108
- & "$env:ProgramFiles\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64
108
+ pwsh -File scripts/setup-vs-toolchain.ps1
109
109
  ```
110
+ That imports `vcvarsall` and pins `xbintsc_CLANG` to the LLVM bundled with
111
+ Visual Studio. Invoking `vcvarsall.bat x64` directly also works.
110
112
  - the linker is wrong on Linux — set `xbintsc_CLANG` and/or pass
111
113
  `xbintsc_LINKER_ARGS=-fuse-ld=lld`;
112
114
  - `No C compiler found. Set xbintsc_CLANG to a clang binary.` — no clang on
@@ -120,11 +122,13 @@ described in [../gui.md](../gui.md).
120
122
 
121
123
  ### `media native library not found at …`
122
124
 
123
- `<video>`/`<audio>` playback needs the optional `media` archive (`media.a`),
124
- built separately with `npm run media`. Build it, or drop `--ext media`; a
125
- GUI-only build still links and media elements simply fire `error`. The `media`
126
- extension also requires `gui`, has no Windows archive yet, and `--ext media`
127
- alone is rejected with the flags to pass. See
125
+ `<video>`/`<audio>` playback needs the optional `media` archive (`media.a`, or
126
+ `media.lib` on Windows), built separately with `npm run media`. Build it, or
127
+ drop `--ext media`; a GUI-only build still links and media elements simply fire
128
+ `error`. The `media` extension also requires `gui`, and `--ext media` alone is
129
+ rejected with the flags to pass. On Windows the FFmpeg build additionally needs
130
+ a POSIX shell (Git for Windows' bash) and a native GNU make (Chocolatey `make`,
131
+ or `xbintsc_MAKE`). The script names whichever is missing. See
128
132
  [../gui/build.md](../gui/build.md).
129
133
 
130
134
  ### `Icon file not found` / icon tools missing
@@ -66,7 +66,11 @@ import { createWindow, run } from "gui";
66
66
  ```
67
67
 
68
68
  它是自带渲染引擎的 GPU 加速实现(自己的 HTML 解析器、CSS 级联、布局与合成器),不是
69
- 系统 WebView。`<img>` 由引擎自身解码;而 `<video>`/`<audio>` 在只启用 `gui` 时**不可用**
69
+ 系统 WebView。编译器一侧还会把本地 `<link rel="stylesheet">` 及其 `@import` 内联为
70
+ `<style>` 块(运行时解析器只读取内联 `<style>`);并让随包引入的 Three.js 的
71
+ `WebGLRenderer` 先探测 WebGL 上下文:引擎有上下文时使用 Three.js 自己的渲染器,
72
+ 直接使用真实的 WebGL 2 后端(只修补其着色器循环展开,不再打包 Canvas2D 回退)。
73
+ `<img>` 由引擎自身解码;而 `<video>`/`<audio>` 在只启用 `gui` 时**不可用**
70
74
  ——它们需要单独的 [`media`](#media--视频音频解码) 扩展。也支持 `<canvas>`:
71
75
  `getContext("2d")` 返回的上下文,其填充、路径、
72
76
  渐变、文本与 `drawImage` 由自研 CPU 光栅器处理(另有线段端点/连接、虚线描边、
@@ -74,7 +78,10 @@ import { createWindow, run } from "gui";
74
78
  `transform`/`transform-origin` 作为绘制期效果可用,因此一个盒子(以及其中的文本、
75
79
  图像与子元素)可以被平移、缩放与旋转而不触发任何重排——可以用
76
80
  `requestAnimationFrame` 逐帧驱动,或写成 `transition: transform`(见
77
- `examples/gui/pelican-svg`)。因为主体是 C++,它以各平台预编译的 `gui.a`/`gui.lib` 形式分发。如果该
81
+ `examples/gui/pelican-svg`)。CSS 子集还覆盖 `@media`、`::before`/`::after`
82
+ 生成内容、线性/径向多层背景、`text-shadow`、`clip-path` 与 `filter`
83
+ 颜色/阴影效果;`backdrop-filter` 与真正的组模糊是有文档说明的近似或未支持。
84
+ 因为主体是 C++,它以各平台预编译的 `gui.a`/`gui.lib` 形式分发。如果该
78
85
  平台的归档不存在,构建会以明确的提示失败;设计与路线图见 [../../zh-CN/gui.md](../../zh-CN/gui.md)(总览;引擎按功能拆分在 [`doc/zh-CN/gui/`](../../zh-CN/gui/) 下),
79
86
  脚本接口见 [../../zh-CN/gui-scripts.md](../../zh-CN/gui-scripts.md)。Canvas API
80
87
  及其限制见 [../../zh-CN/gui/canvas.md](../../zh-CN/gui/canvas.md)。
@@ -84,15 +91,21 @@ import { createWindow, run } from "gui";
84
91
  `getComputedStyle`、`alert`/`prompt`、`escape`、`Event` 家族,以及一层 Web Audio
85
92
  **接口**(`AudioContext` 及其节点、参数与缓冲区,但没有混音后端)—— 另外还有帧泵:
86
93
  它在 `loadHTML` 时启动,仅在仍有动画帧回调时重新排程,因此从不调用 `run()` 的页面
87
- 也能绘制并最终退出。WebGL、WebXR、未启用 `media` 时的 `<video>`/`<audio>`、`fetch`
88
- 与流式接口**尚未实现**:`typeof` 会回答 `"undefined"`,让页面走自己的降级分支。
94
+ 也能绘制并最终退出。**WebGL 1.0 与 2.0 已实现**:`canvas.getContext("webgl")` /
95
+ `"webgl2"` 返回 GPU 上下文,其 GLSL ES 着色器由内置 glslang 编译为 SPIR-V
96
+ (Vulkan 直接消费,Metal 上由内置 SPIRV-Cross 转成 MSL),
97
+ 并通过 SDL_GPU 绘制;页面直接合成颜色纹理而无须 CPU 读回,WebGL 2 还增加
98
+ VAO、实例化、整数属性、采样器对象、`texStorage2D` 与缓冲拷贝(见
99
+ [../../zh-CN/gui/webgl.md](../../zh-CN/gui/webgl.md))。WebXR、未启用
100
+ `media` 时的 `<video>`/`<audio>`、`fetch` 与流式接口**尚未实现**:`typeof` 会回答
101
+ `"undefined"`,让页面走自己的降级分支。
89
102
  见 [../../zh-CN/gui/api.md](../../zh-CN/gui/api.md)。
90
103
 
91
104
  ### `media` —— 视频/音频解码
92
105
 
93
106
  用 `--ext media` **与 `gui` 一起**开启(`--ext gui,media`;注册表会拒绝单独启用
94
- `media`)。它链接单独的 FFmpeg 后端 `media.a`,因此加入 `<video>`/`<audio>` 播放
95
- 不会让只做界面的二进制变大。
107
+ `media`)。它链接单独的 FFmpeg 后端 `media.a`/`media.lib`,因此加入
108
+ `<video>`/`<audio>` 播放不会让只做界面的二进制变大。
96
109
 
97
110
  DOM API 与普通 HTML 媒体元素一致:`play()` / `pause()` / `load()`,以及
98
111
  `paused` / `ended` / `duration` / `currentTime` / `volume` / `muted` / `loop` /
@@ -100,8 +113,13 @@ DOM API 与普通 HTML 媒体元素一致:`play()` / `pause()` / `load()`,
100
113
  `loadedmetadata`/`play`/`pause`/`ended`/`timeupdate`/`error` 事件。没有内置
101
114
  控件——用元素和 CSS 自绘控件(见 `examples/gui/media.ts`)。视频帧与音频 PCM
102
115
  都在主线程解码;视频走图像纹理路径。没有该扩展时,打开媒体源会失败并触发
103
- `error`(元素与 API 仍然存在)。该归档目前仅支持 POSIX,因此 Windows 也只会触发
104
- 同样的 `error`;见 [../../zh-CN/gui/known-issues.md](../../zh-CN/gui/known-issues.md)。
116
+ `error`(元素与 API 仍然存在)。归档会为每个宿主平台构建:POSIX 产出
117
+ `media.a`,Windows 则用面向 MSVC 的 `clang-cl` 编译 FFmpeg 并产出 `media.lib`,
118
+ 因此可与 `gui.lib` 链接。Windows 上构建它需要 POSIX shell(Git for Windows
119
+ 自带的 bash)与原生 GNU make(Chocolatey `make`,或 `xbintsc_MAKE`)。见
120
+ [../../zh-CN/gui/build.md](../../zh-CN/gui/build.md)。
121
+ 没有归档、或宿主上还没运行 `npm run media` 时,媒体元素会触发 `error`;见
122
+ [../../zh-CN/gui/known-issues.md](../../zh-CN/gui/known-issues.md)。
105
123
 
106
124
  ## 第三方 npm 包
107
125
 
@@ -94,10 +94,12 @@ clang 自身失败。抛出的消息包含完整的 clang 命令与 stderr——
94
94
  - Windows 上解析到的 clang 找不到 MSVC/SDK 头文件或库。`xbintsc doctor` 会显示
95
95
  编译器及其目标;优先使用 Visual Studio 自带的 LLVM,它会自行定位 SDK。如果你的
96
96
  安装仍需要显式导入环境,请在 **x64 Native Tools Command Prompt for VS 2022**
97
- (ARM64 机器上是 **ARM64 Native Tools**)里运行,或先导入环境:
97
+ (ARM64 机器上是 **ARM64 Native Tools**)里运行,或直接使用 CI 同一套设置:
98
98
  ```powershell
99
- & "$env:ProgramFiles\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64
99
+ pwsh -File scripts/setup-vs-toolchain.ps1
100
100
  ```
101
+ 该脚本会导入 `vcvarsall`,并把 `xbintsc_CLANG` 指向 Visual Studio 自带的
102
+ LLVM。直接执行 `vcvarsall.bat x64` 也仍然可行。
101
103
  - Linux 上链接器不对——设置 `xbintsc_CLANG`,并/或传
102
104
  `xbintsc_LINKER_ARGS=-fuse-ld=lld`;
103
105
  - `No C compiler found. Set xbintsc_CLANG to a clang binary.` —— `PATH` 里完全没有
@@ -110,10 +112,12 @@ clang 自身失败。抛出的消息包含完整的 clang 命令与 stderr——
110
112
 
111
113
  ### `media native library not found at …`
112
114
 
113
- `<video>`/`<audio>` 播放需要可选的 `media` 归档(`media.a`),用
114
- `npm run media` 单独构建。构建它,或去掉 `--ext media`;仅启用 `gui` 的构建仍可
115
- 链接,媒体元素只会触发 `error`。`media` 扩展还依赖 `gui`,目前没有 Windows
116
- 归档,单独 `--ext media` 会被拒绝并提示应传的 flag。见
115
+ `<video>`/`<audio>` 播放需要可选的 `media` 归档(`media.a`,Windows 上是
116
+ `media.lib`),用 `npm run media` 单独构建。构建它,或去掉 `--ext media`;
117
+ 仅启用 `gui` 的构建仍可链接,媒体元素只会触发 `error`。`media` 扩展还依赖
118
+ `gui`,单独 `--ext media` 会被拒绝并提示应传的 flag。Windows 上 FFmpeg 的
119
+ 构建还需要 POSIX shell(Git for Windows 的 bash)与原生 GNU make
120
+ (Chocolatey `make`,或 `xbintsc_MAKE`)。脚本会指出缺失的是哪一个。见
117
121
  [../../zh-CN/gui/build.md](../../zh-CN/gui/build.md)。
118
122
 
119
123
  ### `Icon file not found` / 图标工具缺失
package/doc/gui/api.md CHANGED
@@ -56,7 +56,8 @@ requestAnimationFrame(frame);
56
56
  | `localStorage` | an in-memory `getItem` / `setItem` / `removeItem` / `clear` / `key` / `length` store |
57
57
  | `AudioContext`, `webkitAudioContext` | a Web Audio graph builder (see below) |
58
58
  | `Event`, `CustomEvent`, `ProgressEvent`, … | event constructors |
59
- | `HTMLCanvasElement`, `HTMLImageElement`, `ImageBitmap`, `ImageData`, `OffscreenCanvas`, `WebGL*`, `XRWebGL*`, `Request`, `Headers`, `Response`, `ReadableStream`, `DOMParser` | `typeof` probes answer `"undefined"` (the engine has no WebGL, XR, fetch or streaming backend), which lets a page take its "unsupported" branch instead of calling a no-op stub |
59
+ | `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)). |
60
+ | `ImageBitmap`, `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)). |
60
61
  | `requestAnimationFrame` / `cancelAnimationFrame` | queued on the window's frame list; see [Runtime integration](./runtime.md) |
61
62
  | `alert` / `confirm` / `prompt`, `matchMedia`, `getComputedStyle`, `escape` | host implementations (Annex B `escape` encodes per UTF-16 code unit, matching `decodeURIComponent(escape(bytes))`) |
62
63
 
@@ -142,4 +143,4 @@ afterwards for debugging.
142
143
  Multiple windows fall out of the object model: `createWindow` returns a native
143
144
  object handle; each handle owns its own `SDL_Window`/GPU surface and its own DOM
144
145
  tree. `run()` drives one shared main loop that ticks every window and exits when
145
- the last one closes.
146
+ the last one closes.