replace webview with 2D canvas builtins (winit + tiny-skia + fontdue)

Removes wry/tao WebView layer. Adds a pixel-level canvas API so Engram
programs can drive the window directly — fill rects, draw text, handle
mouse/keyboard input — enabling the UI framework to be written in Engram.

Dependencies: winit 0.29 (rwh_05), softbuffer 0.3, tiny-skia 0.11, fontdue 0.8.
This commit is contained in:
Will Anderson
2026-04-28 14:31:32 -05:00
parent b9d096ef5b
commit 36f4c222d9
5 changed files with 1256 additions and 1634 deletions
+16 -6
View File
@@ -262,12 +262,22 @@ impl TypeEnv {
env.functions.insert("cursor_col".into(), str_fn(vec![i.clone()], Type::Void));
env.functions.insert("http_sse_post".into(), str_fn(vec![s.clone(), s.clone(), s.clone()], s.clone()));
// Native window / WebView builtins
env.functions.insert("window_open".into(), str_fn(vec![s.clone(), i.clone(), i.clone()], Type::Void));
env.functions.insert("webview_load_url".into(), str_fn(vec![s.clone()], Type::Void));
env.functions.insert("webview_load_html".into(), str_fn(vec![s.clone()], Type::Void));
env.functions.insert("webview_eval".into(), str_fn(vec![s.clone()], Type::Void));
env.functions.insert("window_run".into(), str_fn(vec![], Type::Void));
// Canvas / native window builtins
env.functions.insert("canvas_open".into(), str_fn(vec![s.clone(), i.clone(), i.clone()], Type::Void));
env.functions.insert("canvas_clear".into(), str_fn(vec![s.clone()], Type::Void));
env.functions.insert("canvas_fill_rect".into(), str_fn(vec![i.clone(), i.clone(), i.clone(), i.clone(), s.clone(), i.clone()], Type::Void));
env.functions.insert("canvas_stroke_rect".into(), str_fn(vec![i.clone(), i.clone(), i.clone(), i.clone(), s.clone(), i.clone(), i.clone()], Type::Void));
env.functions.insert("canvas_line".into(), str_fn(vec![i.clone(), i.clone(), i.clone(), i.clone(), s.clone(), i.clone()], Type::Void));
env.functions.insert("canvas_text".into(), str_fn(vec![i.clone(), i.clone(), s.clone(), i.clone(), s.clone()], Type::Void));
env.functions.insert("canvas_text_width".into(), str_fn(vec![s.clone(), i.clone()], i.clone()));
env.functions.insert("canvas_text_height".into(), str_fn(vec![i.clone()], i.clone()));
env.functions.insert("canvas_clip".into(), str_fn(vec![i.clone(), i.clone(), i.clone(), i.clone()], Type::Void));
env.functions.insert("canvas_unclip".into(), str_fn(vec![], Type::Void));
env.functions.insert("canvas_size".into(), str_fn(vec![], Type::Unknown));
env.functions.insert("canvas_mouse_pos".into(), str_fn(vec![], Type::Unknown));
env.functions.insert("canvas_events".into(), str_fn(vec![], s.clone()));
env.functions.insert("canvas_swap".into(), str_fn(vec![], Type::Void));
env.functions.insert("canvas_run_loop".into(), str_fn(vec![s.clone()], Type::Void));
// Math
for name in &["math_abs","math_floor","math_ceil","math_round","math_sqrt"] {