tawasuyu

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 660Markdown 302TOML 157RON 312382 Definiciones

⎇ main llimphi-compositor/Cargo.toml TOML · 112 líneas · 6.5 KB Historia crudo

chore: refresco desde el monorepo — 128 miembros, los 76 widgets y los 11 módulos b3f12e136 · Sergio ·

1[package]
2name = "llimphi-compositor"
3version.workspace = true
4edition.workspace = true
5license.workspace = true
6authors.workspace = true
7publish.workspace = true
8description = "llimphi-compositor — el núcleo declarativo de Llimphi sin winit: el árbol `View<Msg>`, el mount sobre taffy, el paint a `vello::Scene` y el hit-test. No depende de llimphi-hal ni de una surface concreta, así que la misma composición sirve sobre winit (llimphi-ui) o, a futuro, sobre el framebuffer del kernel wawa. `wgpu` entra sólo por la firma de `GpuPaintFn` (tipos, no windowing)."
9
10repository.workspace = true
11[dependencies]
12# El modelo de ENTRADA, como dato puro y sin vecinos. Estaba adentro de este
13# crate (módulo `input`) hasta el 24-ago-2026; se mudó porque el cable de la
14# jaula lo necesita serializable y no puede depender de un crate que exige elegir
15# backend de pintura. Se re-exporta desde `crate::input`, así que nadie cambia.
16llimphi-entrada = { path = "../llimphi-entrada", version = "0.1.0" }
17llimphi-layout = { path = "../llimphi-layout", version = "0.1.0" }
18# El mapa sin sistema operativo — el mismo que `std::collections::HashMap` usa
19# por dentro, así que en Linux no cambia nada.
20hashbrown = { version = "0.17", default-features = false, features = ["default-hasher", "inline-more"] }
21# El hasher de las memoizaciones. `std::collections::hash_map::DefaultHasher`
22# no existe sin std, y el default de hashbrown va sembrado al azar por proceso.
23# `FixedState` es DETERMINISTA, que es lo que estos hashes necesitan: comparan
24# el mismo subárbol entre fotogramas.
25foldhash = { version = "0.2", default-features = false }
26# `ceil`/`sqrt` sobre f32/f64 no existen sin `std`: son métodos que aporta la
27# stdlib, no el lenguaje. Se piden a libm en el perfil bare-metal.
28libm = { version = "0.2", optional = true }
29# Sin `default-features`: su default enciende el backend vello, y acá el backend
30# lo elige la feature de ESTE crate. Se reenvía abajo.
31llimphi-text = { path = "../llimphi-text", version = "0.1.0", default-features = false }
32# Reloj monotónico portable de las animaciones (ver `crate::Instant`). En
33# targets nativos es un re-export literal de `std::time::Instant`: mismo tipo,
34# coste cero. En wasm32 es `performance.now()`, donde el de std panica.
35web-time = { version = "1", optional = true }
36# vello declarado DIRECTO (no `{ workspace = true }`) y sin `default-features`.
37#
38# Es la mitad que faltaba para sacar wgpu de verdad: hacer opcional la dep
39# DIRECTA no alcanzaba, porque wgpu volvía a entrar por la puerta de atrás —
40# `vello` lo trae en su `default` (features `wgpu` + `wgpu_default`). Y como
41# apagar `default-features` desde un miembro no hace nada si el workspace no lo
42# declaró, había que declararlo acá.
43#
44# Lo que el compositor usa de vello es `Scene`, `kurbo` y `peniko`, y NINGUNO
45# está detrás de la feature `wgpu` (`vello/src/lib.rs:146`). O sea: el árbol de
46# escena de vello nunca necesitó una GPU, sólo venía en el mismo paquete.
47#
48# OPCIONAL desde W3.b: el compositor ya no nombra a `vello::Scene` sino al
49# alias `Lienzo`, que en wawa es `llimphi_cpu::Escena`. vello entra sólo con la
50# feature del backend homónimo.
51# Versión desde el workspace, NO pinneada acá. Tenerla suelta fue lo que
52# metió DOS vello en el grafo al migrar a 0.9 (2026-07-28) y produjo el
53# error más desorientador de la tanda: «expected Scene, found
54# llimphi_raster::vello::Scene» — el mismo tipo, de dos crates distintos.
55vello = { workspace = true, default-features = false, optional = true }
56# Sólo para los tipos de la firma de GpuPaintFn (Device/Queue/Encoder/View).
57# wgpu NO depende de winit — el compositor sigue libre de windowing.
58#
59# OPCIONAL desde W1 (PLAN-LLIMPHI.md): en wawa no hay wgpu que valga, y era la
60# única dependencia del compositor atada a una GPU concreta. Con `default` la
61# feature está encendida, así que para todo consumidor de hoy no cambia nada.
62wgpu = { workspace = true, optional = true }
63
64[features]
65# El default reproduce lo de siempre: backend vello, fuentes del sistema y el
66# hook de GPU directa. Ningún consumidor de hoy nota W3.b.
67default = ["std", "vello", "system", "gpu"]
68
69# --- El backend de pintura. Excluyentes; `llimphi-text` lo vigila con un
70#     `compile_error!` si se encienden los dos. ---
71# Linux: se pinta en una `vello::Scene`.
72# `std` da el reloj (`web-time`) y la stdlib. Sin él, el compositor usa su
73# propio `Instant` de microsegundos (ver `crate::reloj`).
74std = ["dep:web-time", "llimphi-text/std"]
75vello = ["dep:vello", "llimphi-text/vello", "std"]
76# wawa: se pinta en una `llimphi_cpu::Escena`, sin GPU y sin std.
77cpu = ["llimphi-text/cpu"]
78# App enjaulada (W4): no se pinta — se GRABA en una `EscenaWire` que cruza la
79# frontera WASM, y el texto viaja sin shapear. `render.rs` no distingue: la
80# costura está en `llimphi-text::wire`, que le da otro `Typesetter` con las
81# mismas firmas.
82#   cargo check -p llimphi-compositor --no-default-features --features wire,std
83wire = ["llimphi-text/wire"]
84
85# Fuentes del sistema (fontique). Sólo tiene sentido con std.
86system = ["llimphi-text/system"]
87# Matemática por libm — el perfil bare-metal.
88libm = ["llimphi-text/libm", "dep:libm"]
89
90# El hook de pintura GPU directa (`View::gpu_paint_with`). Encendido por
91# defecto: apagarlo es la excepción (el camino CPU de wawa), no la norma.
92# Implica el backend vello: sin `vello::Scene` no hay pasada sobre la que
93# encimar el render de wgpu.
94gpu = ["vello", "dep:wgpu", "vello/wgpu_default"]
95
96[dev-dependencies]
97# Volcado headless del paint a PNG (llvmpipe) para VER sombra/gradiente/borde
98# sin levantar ventana. Sólo capas inferiores — no llimphi-ui (sin ciclo).
99llimphi-hal = { path = "../llimphi-hal", version = "0.1.0" }
100llimphi-raster = { path = "../llimphi-raster", version = "0.1.0" }
101llimphi-theme = { path = "../llimphi-theme", version = "0.1.0" }
102png = { workspace = true }
103pollster = { workspace = true }
104# Widgets REALES para el showreel: el `View<Msg>` que devuelven es el mismo
105# tipo (`llimphi_compositor::View`, re-exportado por llimphi-ui), así que
106# montan con el mount/paint/measure de este mismo crate. Dev-only → sin ciclo
107# en el grafo normal (llimphi-ui depende de este crate, no al revés).
108llimphi-widget-switch = { path = "../widgets/switch", version = "0.1.0" }
109llimphi-widget-slider = { path = "../widgets/slider", version = "0.1.0" }
110llimphi-widget-progress = { path = "../widgets/progress", version = "0.1.0" }
111llimphi-widget-button = { path = "../widgets/button", version = "0.1.0" }
112llimphi-widget-segmented = { path = "../widgets/segmented", version = "0.1.0" }