xbintsc 0.5.42 → 0.5.45
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.
- package/dist/src/cli/help.d.ts +1 -1
- package/dist/src/driver/version.d.ts +1 -1
- package/dist/src/driver/version.js +1 -1
- package/dist/tests/e2e/gui-audio.test.js +22 -0
- package/dist/tests/e2e/gui-audio.test.js.map +1 -1
- package/dist/tests/e2e/gui-browser.test.js +3 -0
- package/dist/tests/e2e/gui-browser.test.js.map +1 -1
- package/dist/tests/e2e/gui-effects.test.js +48 -4
- package/dist/tests/e2e/gui-effects.test.js.map +1 -1
- package/dist/tests/e2e/gui-events.test.js +67 -0
- package/dist/tests/e2e/gui-events.test.js.map +1 -1
- package/doc/ai/extensions.md +5 -3
- package/doc/ai/zh-CN/extensions.md +4 -3
- package/doc/gui/api.md +13 -5
- package/doc/gui/input.md +7 -0
- package/doc/gui/known-issues.md +5 -3
- package/doc/gui/rendering.md +12 -8
- package/doc/gui-scripts.md +2 -1
- package/doc/gui.md +7 -4
- package/doc/zh-CN/gui/api.md +12 -5
- package/doc/zh-CN/gui/input.md +5 -0
- package/doc/zh-CN/gui/known-issues.md +3 -2
- package/doc/zh-CN/gui/rendering.md +9 -6
- package/doc/zh-CN/gui-scripts.md +2 -2
- package/doc/zh-CN/gui.md +6 -5
- package/package.json +7 -7
- package/runtime/ext_gui/audio.cpp +18 -0
- package/runtime/ext_gui/audio_device.cpp +12 -2
- package/runtime/ext_gui/browser.cpp +2 -2
- package/runtime/ext_gui/dom_api_events.cpp +2 -1
- package/runtime/ext_gui/gui.cpp +7 -0
- package/runtime/ext_gui/gui_engine.h +9 -0
- package/runtime/ext_gui/gui_events.cpp +52 -10
- package/runtime/ext_gui/gui_keymap.cpp +254 -0
- package/runtime/ext_gui/gui_keymap.h +31 -0
- package/runtime/ext_gui/paint.cpp +16 -1
- package/runtime/ext_gui/paint.h +46 -0
- package/runtime/ext_gui/paint_background.cpp +139 -64
- package/runtime/ext_gui/renderer_gradient.cpp +156 -0
- package/runtime/ext_gui/renderer_image.cpp +6 -1
- package/runtime/ext_gui/renderer_internal.h +22 -0
- package/runtime/ext_gui/window.cpp +10 -1
- package/src/driver/version.ts +1 -1
package/dist/src/cli/help.d.ts
CHANGED
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
* It lives apart from the command dispatch so the executable entry point stays
|
|
5
5
|
* under the repository's per-file line budget; the text is data, not logic.
|
|
6
6
|
*/
|
|
7
|
-
export declare const HELP = "xbintsc 0.5.
|
|
7
|
+
export declare const HELP = "xbintsc 0.5.45 - TypeScript binary compiler\n\nUsage:\n xbintsc build <file.ts> [options] Compile to a native binary\n xbintsc run <file.ts> [-- args] Compile and execute\n xbintsc check <file.ts> Parse, bind and check without linking\n xbintsc watch <file.ts> [options] Rebuild whenever the source tree changes\n xbintsc emit <file.ts> Print LLVM IR\n xbintsc doctor Report the resolved toolchain\n xbintsc version Print the version\n xbintsc help Show this message\n\nOptions:\n -o, --output <path> Output path\n --out <dir> Output directory (default: build/)\n --emit <kind> exe | obj | ir (default: exe)\n -O0..-O3 Optimization level (default: -O2)\n --ext <names> Comma separated extensions (e.g. node,gui,media)\n --ext-native <m> Register a C++/Rust extension from a JSON manifest\n (comma separated for several)\n --config <path> Use a project config (default: auto-detect\n xbintsc.config.json)\n --no-config Do not read any project config\n --icon <path> Embed an application icon (PNG/ICO/ICNS)\n --bundle macOS: also produce a .app bundle\n --app-name <name> Bundle / display name\n --app-id <id> macOS bundle identifier (e.g. com.example.demo)\n --force Ignore the incremental cache\n --verbose Print progress information\n --time Print per-phase build timings\n --debug Emit debug info (DWARF/CodeView) and keep frame pointers\n --check Run the semantic checker (default)\n --no-check Skip the semantic checker; only erase type syntax\n --lto Compile program and runtime to LTO bitcode; link with lld\n --pgo-generate [dir] Build an instrumented binary writing profiles to dir\n --pgo-use [dir] Build with the profiles collected from --pgo-generate\n --json Print diagnostics as a JSON array on stdout\n --no-hints Do not append the \"hint: \u2026 see <doc>\" line to failures\n\nxbintsc compiles a subset of TypeScript to a native binary. Types are erased;\nonly inference-free facts (names, redeclarations, call arity) are checked.\nNode built-ins need --ext node, packages in node_modules are bundled at build\ntime, and clang 16+ is required to link.\n\nInstalled as a project dependency (npm):\n npx xbintsc doctor\n npx xbintsc build <entry.ts> --out build\n npx xbintsc run <entry.ts>\nThe first build compiles the C runtime; later builds reuse the cache.\n\nDocs: doc/ai/README.md (task guide) - doc/ai/language-support.md (subset) -\ndoc/ai/troubleshooting.md (failures) - llms.txt (index of every document).\nWhen installed from npm, these live under node_modules/xbintsc/doc/ and\nnode_modules/xbintsc/doc/npm-package.md is the project guide.\n";
|
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
* `main`/`master` only (see `.githooks/pre-commit`), so feature branches never
|
|
10
10
|
* change this line and merging two of them cannot conflict here.
|
|
11
11
|
*/
|
|
12
|
-
export const COMPILER_VERSION = "0.5.
|
|
12
|
+
export const COMPILER_VERSION = "0.5.45";
|
|
13
13
|
//# sourceMappingURL=version.js.map
|
|
@@ -59,6 +59,28 @@ const WAV_HELPERS = `
|
|
|
59
59
|
describe.skipIf(!guiAvailable)("gui extension — Web Audio", () => {
|
|
60
60
|
beforeAll(() => harness.setup());
|
|
61
61
|
afterAll(() => harness.cleanup());
|
|
62
|
+
it("shuts an open context down before SDL quits", () => {
|
|
63
|
+
const { value } = harness.compileAndRun("audio-exit", `
|
|
64
|
+
import { createWindow, run } from "gui";
|
|
65
|
+
|
|
66
|
+
const win = createWindow({ title: "audio-exit", width: 200, height: 150 });
|
|
67
|
+
win.on("ready", () => {
|
|
68
|
+
const ctx = new AudioContext();
|
|
69
|
+
const osc = ctx.createOscillator();
|
|
70
|
+
osc.connect(ctx.destination);
|
|
71
|
+
osc.start();
|
|
72
|
+
window.setTimeout(() => {
|
|
73
|
+
console.log("state=" + ctx.state);
|
|
74
|
+
win.close();
|
|
75
|
+
}, 100);
|
|
76
|
+
});
|
|
77
|
+
win.loadHTML("<div>audio</div>");
|
|
78
|
+
run();
|
|
79
|
+
`, { autocloseMs: 2000 });
|
|
80
|
+
// The window closed with the graph still live: the engine must destroy the
|
|
81
|
+
// SDL audio stream before SDL_Quit, or the process crashes on exit.
|
|
82
|
+
expect(value("state")).toBe("running");
|
|
83
|
+
});
|
|
62
84
|
it("exposes the standard AudioContext surface", () => {
|
|
63
85
|
const { value } = harness.compileAndRun("audio-surface", `
|
|
64
86
|
async function main(): Promise<void> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui-audio.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-audio.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gui-audio.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-audio.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;AAEnC;;6EAE6E;AAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AACpD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzF,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;AAEjE,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC;AAEF,QAAQ,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC/D,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAElC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,YAAY,EACZ;;;;;;;;;;;;;;;;OAgBC,EACD,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAC;QACF,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,eAAe,EACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,aAAa,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,cAAc,EACd;QACE,WAAW;;;;;;;;;;;;;;;;;;;OAmBZ,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,WAAW,EACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,cAAc,EACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,CAAC,CAAC,cAAc,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CACnD,sDAAsD,EACtD,GAAG,EAAE;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,aAAa,EACb;;;sBAGc,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;;;;;;;;;;SAWvC,EACD,EAAE,UAAU,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAC/D,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,aAAa,EACb;;;;;;;;;;;OAWC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -40,6 +40,8 @@ describe.skipIf(!guiAvailable)("gui extension — browser globals", () => {
|
|
|
40
40
|
console.log("buffer=" + buffer.length + ":" + samples[3] + ":" + buffer.numberOfChannels);
|
|
41
41
|
// A renderer-only type answers \`undefined\`, so feature probes fall back.
|
|
42
42
|
console.log("webgl=" + (typeof WebGLRenderingContext));
|
|
43
|
+
// fetch is a core runtime global, not a gui extension export.
|
|
44
|
+
console.log("fetch=" + typeof fetch);
|
|
43
45
|
|
|
44
46
|
const win = createWindow({ title: "page", width: 320, height: 240 });
|
|
45
47
|
console.log("adopt=" + (window === win) + ":" + (document.defaultView === win));
|
|
@@ -75,6 +77,7 @@ describe.skipIf(!guiAvailable)("gui extension — browser globals", () => {
|
|
|
75
77
|
expect(value("audio")).toBe("48000:running:0.5");
|
|
76
78
|
expect(value("buffer")).toBe("8:0.25:1");
|
|
77
79
|
expect(value("webgl")).toBe("function");
|
|
80
|
+
expect(value("fetch")).toBe("function");
|
|
78
81
|
expect(value("adopt")).toBe("true:true");
|
|
79
82
|
expect(value("bound")).toBe("hi:hi");
|
|
80
83
|
expect(value("title")).toBe("ropes page:complete:false");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui-browser.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-browser.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;AAEnC,MAAM,IAAI,GAAG;;2CAE8B,CAAC;AAE5C,QAAQ,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,iCAAiC,EAAE,GAAG,EAAE;IACrE,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAElC,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,SAAS,EACT
|
|
1
|
+
{"version":3,"file":"gui-browser.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-browser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -130,13 +130,56 @@ describe.skipIf(!guiAvailable)("gui extension — effects", () => {
|
|
|
130
130
|
const list = stdout.slice(stdout.indexOf("list-start"), stdout.indexOf("list-end"));
|
|
131
131
|
expect(value("image")).toContain("radial-gradient()");
|
|
132
132
|
expect(value("image")).toContain("linear-gradient()");
|
|
133
|
-
//
|
|
134
|
-
//
|
|
133
|
+
// The radial layer is one rasterised gradient carrying its stops; the linear
|
|
134
|
+
// layer is still painted as solid bands.
|
|
135
|
+
expect(list).toContain("gradient=radial");
|
|
135
136
|
expect(list).toContain("#ff0000ff");
|
|
136
137
|
expect(list).toContain("#00ff00ff");
|
|
137
138
|
expect(list).toMatch(/#0000[0-9a-f]{2}ff/);
|
|
138
|
-
//
|
|
139
|
-
|
|
139
|
+
// Eighteen linear strips plus the background colour: the gradient image is
|
|
140
|
+
// not a stack of rectangles.
|
|
141
|
+
expect(Number(value("count"))).toBe(19);
|
|
142
|
+
});
|
|
143
|
+
it("rasterises a translucent radial vignette as one gradient image", () => {
|
|
144
|
+
const { value, stdout } = harness.compileAndRun("vignette", `
|
|
145
|
+
import { createWindow, run } from "gui";
|
|
146
|
+
|
|
147
|
+
const HTML = \`
|
|
148
|
+
<html><head><style>
|
|
149
|
+
body { margin: 0; }
|
|
150
|
+
#scene { position: relative; width: 200px; height: 100px; background: #3366cc; }
|
|
151
|
+
#dim {
|
|
152
|
+
position: absolute; inset: -5%; z-index: 2; pointer-events: none;
|
|
153
|
+
background: radial-gradient(ellipse at center,
|
|
154
|
+
transparent 45%, rgba(0, 0, 0, 0.46) 76%, rgba(0, 0, 0, 0.88) 100%);
|
|
155
|
+
}
|
|
156
|
+
</style></head><body>
|
|
157
|
+
<div id="scene"><div id="dim"></div></div>
|
|
158
|
+
</body></html>
|
|
159
|
+
\`;
|
|
160
|
+
|
|
161
|
+
const win = createWindow({ title: "vignette", width: 400, height: 300 });
|
|
162
|
+
win.on("ready", () => {
|
|
163
|
+
console.log("image=" + win.computedStyle("#dim", "background-image"));
|
|
164
|
+
console.log("count=" + win.paintCount());
|
|
165
|
+
console.log("list-start");
|
|
166
|
+
console.log(win.paintList());
|
|
167
|
+
console.log("list-end");
|
|
168
|
+
win.close();
|
|
169
|
+
});
|
|
170
|
+
win.loadHTML(HTML);
|
|
171
|
+
run();
|
|
172
|
+
`);
|
|
173
|
+
const list = stdout.slice(stdout.indexOf("list-start"), stdout.indexOf("list-end"));
|
|
174
|
+
expect(value("image")).toContain("radial-gradient()");
|
|
175
|
+
// A single op whose stops keep the alpha ramp. Painting this as nested
|
|
176
|
+
// translucent ellipses composited the alpha once per band and turned the
|
|
177
|
+
// whole scene solid black.
|
|
178
|
+
expect((list.match(/gradient=radial/g) ?? []).length).toBe(1);
|
|
179
|
+
expect(list).toContain("#00000000@0.4500");
|
|
180
|
+
expect(list).toContain("#000000e0@1.0000");
|
|
181
|
+
// Only the scene background is a rectangle; the vignette is not bands.
|
|
182
|
+
expect(value("count")).toBe("1");
|
|
140
183
|
});
|
|
141
184
|
it("tiles repeating gradients across the whole box", () => {
|
|
142
185
|
const { value, stdout } = harness.compileAndRun("repeating-gradient", `
|
|
@@ -231,6 +274,7 @@ describe.skipIf(!guiAvailable)("gui extension — effects", () => {
|
|
|
231
274
|
`);
|
|
232
275
|
const list = stdout.slice(stdout.indexOf("list-start"), stdout.indexOf("list-end"));
|
|
233
276
|
expect(value("image")).toBe("repeating-radial-gradient()");
|
|
277
|
+
expect(list).toContain("gradient=repeating-radial");
|
|
234
278
|
expect(list).toContain("#ff0000ff");
|
|
235
279
|
expect(list).toContain("#0000ffff");
|
|
236
280
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui-effects.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-effects.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gui-effects.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-effects.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -200,5 +200,72 @@ describe.skipIf(!guiAvailable)("gui extension — events", () => {
|
|
|
200
200
|
// dispatched object keeps its identity and gains its target.
|
|
201
201
|
expect(value("path")).toBe("capture1:true|target2:true:identity=true:target=true");
|
|
202
202
|
});
|
|
203
|
+
it("installs the browser host globals on window", () => {
|
|
204
|
+
const { value } = harness.compileAndRun("window-globals", `
|
|
205
|
+
import { createWindow, run } from "gui";
|
|
206
|
+
|
|
207
|
+
const win = createWindow({ title: "globals", width: 300, height: 200 });
|
|
208
|
+
win.on("ready", () => {
|
|
209
|
+
const w: any = window;
|
|
210
|
+
console.log("audio=" + typeof w.AudioContext);
|
|
211
|
+
console.log("image=" + typeof w.Image);
|
|
212
|
+
console.log("event=" + typeof w.Event);
|
|
213
|
+
console.log("secure=" + w.isSecureContext);
|
|
214
|
+
// The game-facing spelling: a page feature-detects through window.
|
|
215
|
+
const Ctor = w.AudioContext;
|
|
216
|
+
const ctx = new Ctor({ __offline: true });
|
|
217
|
+
console.log("ctx=" + (ctx != null) + ":" + (ctx instanceof AudioContext));
|
|
218
|
+
ctx.close();
|
|
219
|
+
win.close();
|
|
220
|
+
});
|
|
221
|
+
win.loadHTML("<div>globals</div>");
|
|
222
|
+
run();
|
|
223
|
+
`);
|
|
224
|
+
expect(value("audio")).toBe("function");
|
|
225
|
+
expect(value("image")).toBe("function");
|
|
226
|
+
expect(value("event")).toBe("function");
|
|
227
|
+
expect(value("secure")).toBe("true");
|
|
228
|
+
expect(value("ctx")).toBe("true:true");
|
|
229
|
+
});
|
|
230
|
+
it("delivers physical keys to document and window with browser names", () => {
|
|
231
|
+
const { value } = harness.compileAndRun("keyboard-dom", `
|
|
232
|
+
import { createWindow, run } from "gui";
|
|
233
|
+
|
|
234
|
+
const win = createWindow({ title: "keys", width: 300, height: 200 });
|
|
235
|
+
win.on("ready", () => {
|
|
236
|
+
// No element is focused: a browser targets <body>, and the event still
|
|
237
|
+
// bubbles to the document listener a game binds to.
|
|
238
|
+
const seen: string[] = [];
|
|
239
|
+
document.addEventListener("keydown", (e: any) => {
|
|
240
|
+
seen.push(e.code + ":" + e.key + ":" + e.shiftKey);
|
|
241
|
+
});
|
|
242
|
+
// A listener on the event target (body when nothing is focused) runs
|
|
243
|
+
// too: the engine must pick the real body, not the document root.
|
|
244
|
+
let bodySeen = 0;
|
|
245
|
+
document.body.addEventListener("keydown", () => { bodySeen += 1; });
|
|
246
|
+
|
|
247
|
+
// SDL scancodes: A = 4, Up = 82, Space = 44, P = 19.
|
|
248
|
+
win.sendEvent("keydown", { scancode: 4 });
|
|
249
|
+
win.sendEvent("keydown", { scancode: 82 });
|
|
250
|
+
win.sendEvent("keydown", { scancode: 4, shift: true });
|
|
251
|
+
win.sendEvent("keydown", { scancode: 44 });
|
|
252
|
+
win.sendEvent("keyup", { scancode: 4 });
|
|
253
|
+
console.log("dom=" + seen.join(","));
|
|
254
|
+
console.log("body=" + bodySeen);
|
|
255
|
+
|
|
256
|
+
let windowKey = "";
|
|
257
|
+
win.on("keydown", (e: any) => { windowKey = e.code + ":" + e.key; });
|
|
258
|
+
win.sendEvent("keydown", { scancode: 19 });
|
|
259
|
+
console.log("window=" + windowKey);
|
|
260
|
+
win.close();
|
|
261
|
+
});
|
|
262
|
+
win.loadHTML("<html><body><div id='box'>x</div></body></html>");
|
|
263
|
+
run();
|
|
264
|
+
`);
|
|
265
|
+
// `code` is the physical key ("KeyA"), `key` the produced value ("a"/"A").
|
|
266
|
+
expect(value("dom")).toBe("KeyA:a:false,ArrowUp:ArrowUp:false,KeyA:A:true,Space: :false");
|
|
267
|
+
expect(value("body")).toBe("4");
|
|
268
|
+
expect(value("window")).toBe("KeyP:p");
|
|
269
|
+
});
|
|
203
270
|
});
|
|
204
271
|
//# sourceMappingURL=gui-events.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui-events.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-events.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gui-events.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-events.test.ts"],"names":[],"mappings":"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"}
|
package/doc/ai/extensions.md
CHANGED
|
@@ -110,9 +110,11 @@ SPIRV-Cross on Metal — and drawn through SDL_GPU; the page composites the colo
|
|
|
110
110
|
texture without a CPU readback, and WebGL 2 adds VAOs, instancing, integer
|
|
111
111
|
attributes, sampler objects, `texStorage2D` and buffer copies (see
|
|
112
112
|
[../gui/webgl.md](../gui/webgl.md)). WebXR, `<video>`/`<audio>` without
|
|
113
|
-
`media`,
|
|
114
|
-
`typeof` answers `"undefined"` so a page takes its own fallback branch.
|
|
115
|
-
|
|
113
|
+
`media`, and streaming are **not** implemented:
|
|
114
|
+
`typeof` answers `"undefined"` so a page takes its own fallback branch. `fetch`
|
|
115
|
+
is **not** a GUI extension feature: the core runtime provides it (`http://`,
|
|
116
|
+
plus local `file://` and relative paths; no HTTPS or streaming), so GUI
|
|
117
|
+
programs can use it too. See [../implemented/fetch.md](../implemented/fetch.md).
|
|
116
118
|
|
|
117
119
|
### `media` — video/audio decoding
|
|
118
120
|
|
|
@@ -99,9 +99,10 @@ AudioParam 自动化,`decodeAudioData` 引擎内解码 WAV,压缩格式则
|
|
|
99
99
|
并通过 SDL_GPU 绘制;页面直接合成颜色纹理而无须 CPU 读回,WebGL 2 还增加
|
|
100
100
|
VAO、实例化、整数属性、采样器对象、`texStorage2D` 与缓冲拷贝(见
|
|
101
101
|
[../../zh-CN/gui/webgl.md](../../zh-CN/gui/webgl.md))。WebXR、未启用
|
|
102
|
-
`media` 时的 `<video>`/`<audio
|
|
103
|
-
`"undefined"
|
|
104
|
-
|
|
102
|
+
`media` 时的 `<video>`/`<audio>` 与流式接口**尚未实现**:`typeof` 会回答
|
|
103
|
+
`"undefined"`,让页面走自己的降级分支。`fetch` 不是 GUI 扩展的功能——它由核心
|
|
104
|
+
运行时提供(`http://`,以及本地 `file://` 与相对路径;不支持 HTTPS 与流式),
|
|
105
|
+
因此 GUI 程序同样可用。见 [../../implemented/fetch.md](../../implemented/fetch.md)。
|
|
105
106
|
|
|
106
107
|
### `media` —— 视频/音频解码
|
|
107
108
|
|
package/doc/gui/api.md
CHANGED
|
@@ -91,12 +91,13 @@ requestAnimationFrame(frame);
|
|
|
91
91
|
| `navigator` | `userAgent` (a desktop Chrome string ending in `xbintsc`), `platform`, `vendor`, `language(s)`, `hardwareConcurrency`, `maxTouchPoints`, `onLine`, `vibrate()` |
|
|
92
92
|
| `localStorage` | an in-memory `getItem` / `setItem` / `removeItem` / `clear` / `key` / `length` store |
|
|
93
93
|
| `AudioContext`, `webkitAudioContext` | a Web Audio graph with a real mixer and decoder (see below) |
|
|
94
|
+
| `fetch(input, init)` | the core runtime's HTTP/1.1 client, available to GUI programs too: `http://`, plus local `file://` and relative paths; `https://` and streaming are not supported. See [Implemented fetch](../implemented/fetch.md). |
|
|
94
95
|
| `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
96
|
| `AbortController`, `AbortSignal` | a real controller/signal pair for `{ signal }` listener removal, with `abort()`, `aborted`, `reason`, `onabort` and `throwIfAborted()` |
|
|
96
97
|
| `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
98
|
| `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
99
|
| `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
|
|
100
|
+
| `ImageData`, `XRWebGL*`, `Request`, `Headers`, `Response`, `ReadableStream`, `DOMParser` | `typeof` probes answer `"undefined"` (no XR, DOM parser or streaming backend), which lets a page take its "unsupported" branch instead of calling a no-op stub. `fetch` still works and resolves with a response-shaped object, but there is no `Response` constructor and `response.arrayBuffer()` currently returns a byte array rather than an `ArrayBuffer`. Three.js pages use its real renderer on this backend (see [Known issues](./known-issues.md)). |
|
|
100
101
|
| `requestAnimationFrame` / `cancelAnimationFrame` | queued on the window's frame list; see [Runtime integration](./runtime.md) |
|
|
101
102
|
| `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))`) |
|
|
102
103
|
|
|
@@ -163,17 +164,24 @@ Input handlers receive a single payload object (lifecycle handlers receive none)
|
|
|
163
164
|
```ts
|
|
164
165
|
win.on("click", (e) => console.log(e.x, e.y, e.button, e.target));
|
|
165
166
|
win.on("wheel", (e) => console.log(e.deltaX, e.deltaY));
|
|
166
|
-
win.on("keydown", (e) => console.log(e.key, e.code, e.
|
|
167
|
+
win.on("keydown", (e) => console.log(e.key, e.code, e.ctrlKey, e.shiftKey));
|
|
167
168
|
```
|
|
168
169
|
|
|
170
|
+
`document.addEventListener("keydown", handler)` receives the same event after it
|
|
171
|
+
bubbles from the focused element or `<body>`, before the window listeners run.
|
|
172
|
+
`code` is the physical key and uses the browser spelling (`"KeyW"`,
|
|
173
|
+
`"ArrowUp"`, `"Space"`); `key` is the produced value (`"w"`/`"W"`, `"ArrowUp"`,
|
|
174
|
+
`" "`). See [input.md](./input.md).
|
|
175
|
+
|
|
169
176
|
| Field | Events | Meaning |
|
|
170
177
|
| --- | --- | --- |
|
|
171
178
|
| `x`, `y` / `clientX`, `clientY` | pointer, wheel | viewport-relative logical pixels |
|
|
172
179
|
| `button` | pointer | `0` left, `1` middle, `2` right (`-1` for move) |
|
|
173
180
|
| `clicks` | pointer | click count reported by the OS |
|
|
174
181
|
| `deltaX`, `deltaY` | wheel | scroll amount (`deltaY` positive = down) |
|
|
175
|
-
| `key`, `code` | keyboard |
|
|
176
|
-
| `repeat`, `ctrl`, `shift`, `alt`, `meta` | keyboard | modifiers |
|
|
182
|
+
| `key`, `code` | keyboard | browser `KeyboardEvent` spellings: produced value and physical key |
|
|
183
|
+
| `repeat`, `ctrl`, `shift`, `alt`, `meta` | keyboard | modifiers (the legacy DOM spellings) |
|
|
184
|
+
| `ctrlKey`, `shiftKey`, `altKey`, `metaKey` | keyboard | modifiers (the current DOM spellings) |
|
|
177
185
|
| `target` | pointer, wheel | deepest element under the point as a CSS-like descriptor (`div#main.card`), or absent |
|
|
178
186
|
|
|
179
187
|
## Diagnostics
|
|
@@ -187,7 +195,7 @@ win.queryCount(selector) // number of matching elements
|
|
|
187
195
|
win.getBoundingClientRect(selector) // { x, y, width, height } (border box, transformed)
|
|
188
196
|
win.documentTree() // serialized DOM (debugging)
|
|
189
197
|
win.layoutTree() // serialized layout boxes (debugging)
|
|
190
|
-
win.paintCount() // number of
|
|
198
|
+
win.paintCount() // number of filled rectangles in the display list
|
|
191
199
|
win.paintList() // serialized display list (debugging)
|
|
192
200
|
win.inlineSvg(selector) // serialized inline <svg>: { markup, width, height, shapes }
|
|
193
201
|
win.measureText(text, fontSize?, family?) // shaped advance width in pixels
|
package/doc/gui/input.md
CHANGED
|
@@ -13,6 +13,13 @@ follows the artwork, not the box flow left behind.
|
|
|
13
13
|
|
|
14
14
|
- SDL pointer/wheel/key events are routed to the owning window, hit tested, and
|
|
15
15
|
delivered to the handlers registered with `on`. `mousedown` also moves focus.
|
|
16
|
+
- Keyboard events also follow the DOM path: the target is the focused element (or
|
|
17
|
+
`<body>` when nothing is focused), the event bubbles through its ancestors to
|
|
18
|
+
`document`, and finally reaches `window` listeners. This is what lets a page
|
|
19
|
+
written for a browser use `document.addEventListener("keydown", …)`. The
|
|
20
|
+
payload carries browser `KeyboardEvent` spellings — `code` is the physical key
|
|
21
|
+
(`"KeyW"`, `"ArrowUp"`, `"Space"`) and `key` the produced value (`"w"`, `"W"`,
|
|
22
|
+
`" "`) — not SDL's scancode/key names.
|
|
16
23
|
- `:hover` matches the hovered element **and its ancestors** (so hovering a child
|
|
17
24
|
lights up its parents); `:focus` matches the focused element. When either
|
|
18
25
|
changes, `XtDocument::setHover`/`setFocus` recompute styles and layout and mark
|
package/doc/gui/known-issues.md
CHANGED
|
@@ -72,9 +72,11 @@
|
|
|
72
72
|
silhouettes; at most two nested `clip-path` shapes are intersected (deeper
|
|
73
73
|
nesting keeps the outer two); and images/canvases are not colour-filtered
|
|
74
74
|
except for the brightness/opacity tint the image shader can carry. Canvas
|
|
75
|
-
textures are sampled nearest-neighbour.
|
|
76
|
-
bands (18
|
|
77
|
-
|
|
75
|
+
textures are sampled nearest-neighbour. A background linear gradient remains
|
|
76
|
+
solid bands (18 strips, 64 while repeating), so a large soft ramp may show
|
|
77
|
+
slight banding; a radial gradient is rasterised per pixel into a texture
|
|
78
|
+
(capped at 1024 px per edge, then stretched, so a hard stop in a very large
|
|
79
|
+
box comes out slightly soft).
|
|
78
80
|
- **SVG is NanoSVG's subset.** SVG *files* (`<img src="logo.svg">`) and inline
|
|
79
81
|
`<svg>` trees share the vendored NanoSVG parser/rasteriser
|
|
80
82
|
(`runtime/ext_gui/svg.cpp`, `inline_svg.cpp`), which renders
|
package/doc/gui/rendering.md
CHANGED
|
@@ -87,12 +87,16 @@ topmost), and both gradient kinds are supported:
|
|
|
87
87
|
length (`px`/`em`/…) offsets, the `color <start> <end>` shorthand and
|
|
88
88
|
multi-stop colours work (the band walk is axis-aligned, so an oblique angle
|
|
89
89
|
uses the nearest axis);
|
|
90
|
-
- a **radial** gradient is
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
90
|
+
- a **radial** gradient is resolved per pixel in `renderer_gradient.cpp` into one
|
|
91
|
+
RGBA texture that is drawn as a single image quad (`PaintGradient`). Nesting the
|
|
92
|
+
bands instead would composite their alpha once per band — since every band
|
|
93
|
+
covers the whole interior — so a vignette whose stops fade to `transparent`
|
|
94
|
+
painted an opaque disc over the scene. Shape/size keywords
|
|
95
|
+
(`circle`/`ellipse`, `closest-side`/`farthest-side`/`closest-corner`/
|
|
96
|
+
`farthest-corner`, explicit radii) and `at <position>` are parsed; a
|
|
97
|
+
keyword-sized ellipse keeps the box's aspect ratio and is scaled until it meets
|
|
98
|
+
the side or corner, as CSS does. Stops interpolate in premultiplied alpha, and
|
|
99
|
+
the last stop extends past the ending shape over the rest of the box.
|
|
96
100
|
|
|
97
101
|
`repeating-linear-gradient()` and `repeating-radial-gradient()` tile the stop
|
|
98
102
|
pattern from 0 to the last stop's offset across the whole box; the stop list is
|
|
@@ -101,8 +105,8 @@ gradient whose last stop is below 100% holds that colour for the rest of the box
|
|
|
101
105
|
as in CSS.
|
|
102
106
|
|
|
103
107
|
The background colour sits under every layer. Gradients are partially
|
|
104
|
-
transparent if their stops are
|
|
105
|
-
|
|
108
|
+
transparent if their stops are; a radial gradient is exact per pixel, while a
|
|
109
|
+
linear one still samples 18 bands and can show banding on a large soft ramp.
|
|
106
110
|
|
|
107
111
|
**Generated content** needs no new display-list kind: `::before`/`::after` are
|
|
108
112
|
ordinary layout boxes owned by the per-restyle arena in `style.cpp`, so their
|
package/doc/gui-scripts.md
CHANGED
|
@@ -334,7 +334,8 @@ legacy `target` field over the handle.
|
|
|
334
334
|
- **Top-level `await`** inside a deferred `<script src>` module is not
|
|
335
335
|
supported: the module body is wrapped in a synchronous init function.
|
|
336
336
|
- **Assets.** `<script src>` is resolved relative to the HTML asset; URL `src`
|
|
337
|
-
values are ignored.
|
|
337
|
+
values are ignored. The loader does not fetch network URLs; the runtime's
|
|
338
|
+
global `fetch` is a separate API.
|
|
338
339
|
|
|
339
340
|
## Testing
|
|
340
341
|
|
package/doc/gui.md
CHANGED
|
@@ -336,8 +336,9 @@ engine were Rust.
|
|
|
336
336
|
- Generated content: `::before`/`::after` selectors, inherited pseudo styles,
|
|
337
337
|
`content` strings/escapes/`attr()`, and synthetic layout boxes that never
|
|
338
338
|
leak into DOM traversal.
|
|
339
|
-
- Multi-layer `background-image` with linear
|
|
340
|
-
|
|
339
|
+
- Multi-layer `background-image` with linear gradients painted bottom-up as
|
|
340
|
+
solid bands (18 strips) and radial gradients rasterised per pixel into one
|
|
341
|
+
image texture (`renderer_gradient.cpp`).
|
|
341
342
|
- `text-shadow` as shadow text runs, including a nine-tap blur approximate.
|
|
342
343
|
- `clip-path` polygons (`inset`/`circle`/`ellipse`/`polygon`) resolved to
|
|
343
344
|
device space, ear-clipped and intersected with shape geometry in
|
|
@@ -503,8 +504,10 @@ engine were Rust.
|
|
|
503
504
|
pseudo styles into a per-restyle arena, resolves `content`, and layout inserts
|
|
504
505
|
their boxes before/after the DOM children. `gradient_values.cpp` models a
|
|
505
506
|
background layer list (linear/radial, shape/size/position/stops),
|
|
506
|
-
`paint_background.cpp` paints it
|
|
507
|
-
|
|
507
|
+
`paint_background.cpp` resolves and paints it (radial layers become one
|
|
508
|
+
`PaintGradient`, which `renderer_gradient.cpp` rasterises into a texture),
|
|
509
|
+
`paint_effects.cpp` applies filter colour functions plus nine-tap
|
|
510
|
+
blur/drop-shadow and emits `text-shadow` runs, and
|
|
508
511
|
`paint_clip.cpp`/`renderer_clip.cpp` clip geometry against triangulated
|
|
509
512
|
`clip-path` polygons. E2E: `tests/e2e/gui-effects.test.ts`.
|
|
510
513
|
- **M20** ✅ rendering performance. `@media` is evaluated once per rule per
|
package/doc/zh-CN/gui/api.md
CHANGED
|
@@ -88,12 +88,13 @@ requestAnimationFrame(frame);
|
|
|
88
88
|
| `navigator` | `userAgent`(以 `xbintsc` 结尾的桌面 Chrome 字符串)、`platform`、`vendor`、`language(s)`、`hardwareConcurrency`、`maxTouchPoints`、`onLine`、`vibrate()` |
|
|
89
89
|
| `localStorage` | 内存中的 `getItem` / `setItem` / `removeItem` / `clear` / `key` / `length` |
|
|
90
90
|
| `AudioContext`、`webkitAudioContext` | 带真实混音器与解码器的 Web Audio 图(见下) |
|
|
91
|
+
| `fetch(input, init)` | 核心运行时的 HTTP/1.1 客户端,GUI 程序同样可用:支持 `http://`、本地 `file://` 与相对路径;不支持 `https://` 与流式响应。见[已实现的 fetch](../../implemented/fetch.md)。 |
|
|
91
92
|
| `Event`、`CustomEvent`、`ProgressEvent`、`MouseEvent`、`KeyboardEvent`、`PointerEvent`、`WheelEvent`、`FocusEvent`、`InputEvent`、`SubmitEvent` | 事件构造器;`init` 参数按原样保留(`detail`、`composed`、鼠标/键盘字段等) |
|
|
92
93
|
| `AbortController`、`AbortSignal` | 真实的 controller/signal 对,用于 `{ signal }` 移除监听器,支持 `abort()`、`aborted`、`reason`、`onabort` 与 `throwIfAborted()` |
|
|
93
94
|
| `HTMLCanvasElement`、`HTMLImageElement`、`WebGLRenderingContext`、`WebGL2RenderingContext`、`WebGLBuffer`/`WebGLTexture`/`WebGLShader`/`WebGLProgram`/`WebGLFramebuffer`/`WebGLRenderbuffer`/`WebGLUniformLocation`/`WebGLActiveInfo`/`WebGLVertexArrayObject`/`WebGLSampler`/`WebGLQuery`/`WebGLSync`/`WebGLTransformFeedback` | 真实的构造函数值。`canvas.getContext("webgl")` 与 `getContext("webgl2")` 返回 GPU 上下文(见 [WebGL](./webgl.md))。 |
|
|
94
95
|
| `ImageBitmap`、`createImageBitmap(source)` | 由已解码像素支撑的不可变位图(`<img>`、`<canvas>`、`<video>` 帧、`OffscreenCanvas` 与 `ImageData` 形状);promise 立即 settle,`texImage2D` 可直接接受该对象 |
|
|
95
96
|
| `OffscreenCanvas` | 真正的 2D 离屏位图,带 `getContext("2d")`、`width`/`height`、`transferToImageBitmap()` 与 `convertToBlob()`;`canvas.transferControlToOffscreen()` 会把元素位图交给它(见 [Canvas](./canvas.md))。离屏 WebGL 上下文不提供。 |
|
|
96
|
-
| `ImageData`、`XRWebGL*`、`Request`、`Headers`、`Response`、`ReadableStream`、`DOMParser` | `typeof` 探测返回 `"undefined"`(没有 XR
|
|
97
|
+
| `ImageData`、`XRWebGL*`、`Request`、`Headers`、`Response`、`ReadableStream`、`DOMParser` | `typeof` 探测返回 `"undefined"`(没有 XR、DOM 解析器或流式后端),让页面走自己的“不支持”分支,而不是调用空壳。`fetch` 仍然可用,并返回 response 形状的对象,但没有 `Response` 构造函数,且 `response.arrayBuffer()` 目前返回字节数组而不是 `ArrayBuffer`。Three.js 页面在本后端上使用真实渲染器(见[已知问题](./known-issues.md))。 |
|
|
97
98
|
| `requestAnimationFrame` / `cancelAnimationFrame` | 排入窗口的动画帧列表,见[运行时集成](./runtime.md) |
|
|
98
99
|
| `alert` / `confirm` / `prompt`、`matchMedia`、`getComputedStyle`、`escape` | 宿主实现。`matchMedia` 返回**实时**列表(按查询缓存):`matches` 在窗口尺寸变化时重新求值,翻转时触发 `change` 监听器。`confirm`/`prompt` 仅在 `XT_GUI_DIALOGS=1` 时使用原生对话框,否则把消息写到 stderr 并返回文档化的默认值(Annex B `escape` 按 UTF-16 码元编码,与 `decodeURIComponent(escape(bytes))` 一致) |
|
|
99
100
|
|
|
@@ -152,17 +153,23 @@ const samples = ctx.__render(480); // 交错立体声 Float32Array
|
|
|
152
153
|
```ts
|
|
153
154
|
win.on("click", (e) => console.log(e.x, e.y, e.button, e.target));
|
|
154
155
|
win.on("wheel", (e) => console.log(e.deltaX, e.deltaY));
|
|
155
|
-
win.on("keydown", (e) => console.log(e.key, e.code, e.
|
|
156
|
+
win.on("keydown", (e) => console.log(e.key, e.code, e.ctrlKey, e.shiftKey));
|
|
156
157
|
```
|
|
157
158
|
|
|
159
|
+
`document.addEventListener("keydown", handler)` 会在事件从聚焦元素或 `<body>`
|
|
160
|
+
冒泡后收到同一个事件,早于 window 监听器。`code` 是物理键并采用浏览器写法
|
|
161
|
+
(`"KeyW"`、`"ArrowUp"`、`"Space"`);`key` 是产生的值(`"w"`/`"W"`、
|
|
162
|
+
`"ArrowUp"`、`" "`)。见 [input.md](./input.md)。
|
|
163
|
+
|
|
158
164
|
| 字段 | 事件 | 含义 |
|
|
159
165
|
| --- | --- | --- |
|
|
160
166
|
| `x`、`y` / `clientX`、`clientY` | pointer、wheel | 相对于视口的逻辑像素 |
|
|
161
167
|
| `button` | pointer | `0` 左键、`1` 中键、`2` 右键(移动时为 `-1`) |
|
|
162
168
|
| `clicks` | pointer | 操作系统报告的点击次数 |
|
|
163
169
|
| `deltaX`、`deltaY` | wheel | 滚动量(`deltaY` 为正表示向下) |
|
|
164
|
-
| `key`、`code` | keyboard |
|
|
165
|
-
| `repeat`、`ctrl`、`shift`、`alt`、`meta` | keyboard |
|
|
170
|
+
| `key`、`code` | keyboard | 浏览器 `KeyboardEvent` 写法:产生的值与物理键 |
|
|
171
|
+
| `repeat`、`ctrl`、`shift`、`alt`、`meta` | keyboard | 修饰键(旧版 DOM 写法) |
|
|
172
|
+
| `ctrlKey`、`shiftKey`、`altKey`、`metaKey` | keyboard | 修饰键(现行 DOM 写法) |
|
|
166
173
|
| `target` | pointer、wheel | 该点下最深的元素,表示为类 CSS 描述符(`div#main.card`),可能缺省 |
|
|
167
174
|
|
|
168
175
|
## 诊断
|
|
@@ -175,7 +182,7 @@ win.queryCount(selector) // 匹配元素的数量
|
|
|
175
182
|
win.getBoundingClientRect(selector) // { x, y, width, height }(边框盒,含变换)
|
|
176
183
|
win.documentTree() // 序列化的 DOM(调试用)
|
|
177
184
|
win.layoutTree() // 序列化的布局盒(调试用)
|
|
178
|
-
win.paintCount() //
|
|
185
|
+
win.paintCount() // 显示列表中填充矩形的数量
|
|
179
186
|
win.paintList() // 序列化的显示列表(调试用)
|
|
180
187
|
win.inlineSvg(selector) // 序列化的内联 <svg>:{ markup, width, height, shapes }
|
|
181
188
|
win.measureText(text, fontSize?, family?) // 整形后的推进宽度(像素)
|
package/doc/zh-CN/gui/input.md
CHANGED
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
- SDL 指针/滚轮/键盘事件会被路由到所属窗口,进行命中测试,并投递给用 `on`
|
|
14
14
|
注册的处理器。`mousedown` 还会移动焦点。
|
|
15
|
+
- 键盘事件同时走 DOM 路径:目标为聚焦元素(没有焦点时为 `<body>`),事件沿祖先
|
|
16
|
+
冒泡到 `document`,最后到达 `window` 监听器。因此按浏览器写的
|
|
17
|
+
`document.addEventListener("keydown", …)` 可以直接工作。负载使用浏览器
|
|
18
|
+
`KeyboardEvent` 的写法:`code` 是物理键(`"KeyW"`、`"ArrowUp"`、`"Space"`),
|
|
19
|
+
`key` 是产生的值(`"w"`、`"W"`、`" "`),而不是 SDL 的扫描码/键名。
|
|
15
20
|
- `:hover` 匹配悬停元素**及其祖先**(因此悬停子元素会点亮其父元素);
|
|
16
21
|
`:focus` 匹配聚焦元素。当任一改变时,`XtDocument::setHover`/`setFocus`
|
|
17
22
|
重新计算样式与布局,并把窗口几何标记为脏,因此改动会在下一帧绘制。
|
|
@@ -51,8 +51,9 @@
|
|
|
51
51
|
`filter: blur()` 是按图形做九次偏移的近似,而不是真正的组模糊,重叠的子元素会加深;
|
|
52
52
|
`drop-shadow` 用盒子轮廓近似;最多只交叉两层嵌套 `clip-path`(更深时保留外侧两层);
|
|
53
53
|
图像/画布除图像着色器能携带的亮度与透明度染色外不做颜色滤镜。Canvas 纹理使用
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
最近邻采样。背景线性渐变仍是纯色带(18 条,重复渐变 64 条),较大的柔和渐变
|
|
55
|
+
可能出现轻微条带;径向渐变则逐像素光栅化成纹理(每边最大 1024 px,超出后拉伸,
|
|
56
|
+
因此超大盒子上的硬色标会略微变软)。
|
|
56
57
|
- **SVG 是 NanoSVG 的子集。** SVG *文件*(`<img src="logo.svg">`)与内联
|
|
57
58
|
`<svg>` 子树共用 vendored 的 NanoSVG 解析/光栅化器(`runtime/ext_gui/svg.cpp`、
|
|
58
59
|
`inline_svg.cpp`),它会渲染 `path`/`rect`/`circle`/`ellipse`/`line`/
|