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-text/Cargo.toml TOML · 122 líneas · 6.1 KB Historia crudo

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

1[package]
2name = "llimphi-text"
3version.workspace = true
4edition.workspace = true
5license.workspace = true
6authors.workspace = true
7publish.workspace = true
8
9# vello directo (no llimphi-raster): el motor de texto sólo necesita
10# Scene/peniko/kurbo para construir y pintar layouts — nada del Renderer ni
11# de llimphi-hal. Eso mantiene llimphi-text (y quien lo use: el compositor)
12# libre de winit, condición para correr sobre el framebuffer de wawa.
13description = "Text shaping for llimphi over parley (Inter default, DejaVu Sans symbol fallback)."
14repository.workspace = true
15[dependencies]
16# Sin `default-features`: de vello acá se usan `Scene`, `Glyph`, `kurbo` y
17# `peniko`, y ninguno vive detrás de su feature `wgpu`. Con el default puesto,
18# este crate arrastraba wgpu entero al árbol y anulaba —por unificación de
19# features— el trabajo de sacarlo de `llimphi-compositor` (W1 de
20# PLAN-LLIMPHI.md). Declarado directo porque apagar `default-features` desde un
21# miembro no surte efecto si el workspace no lo declaró así.
22#
23# OPCIONAL desde W2: `vello` es std-only (no tiene perfil no_std), y el kernel de
24# wawa no lo puede enlazar. Sólo lo necesitan las SIETE funciones de dibujo
25# (`draw_layout*`, `draw_block`, `paint_decoration`); todo el shaping —
26# `Typesetter`, `layout`, `measurement`— está limpio de vello. Esa es la
27# frontera, y resultó estar ya dibujada sola.
28# Versión desde el workspace, NO pinneada acá. Tenerla suelta fue lo que
29# metió DOS vello en el grafo al migrar a 0.9 (2026-07-28) y produjo el
30# error más desorientador de la tanda: «expected Scene, found
31# llimphi_raster::vello::Scene» — el mismo tipo, de dos crates distintos.
32vello = { workspace = true, default-features = false, optional = true }
33
34# El IR de escena (W4): el tercer backend. Igual que `vello` y `llimphi-cpu`, es
35# opcional — sólo lo enlaza quien compila el camino de la app enjaulada.
36llimphi-wire-escena = { path = "../llimphi-wire-escena", version = "0.1.0", default-features = false, optional = true }
37
38# parley DIRECTO y sin defaults: su `default = ["system"]` arrastra
39# fontconfig/objc2/windows por fontique. Se recupera con la feature `system` de
40# acá, que el default enciende — en Linux el fallback CJK/emoji del sistema NO
41# se resigna.
42parley = { version = "0.6", default-features = false, optional = true }
43
44# peniko directo. Antes llegaba VÍA vello (`use vello::peniko`), y eso ataba los
45# tipos de color al crate que justamente hay que poder apagar.
46peniko = { version = "0.6", default-features = false }
47
48# El caché de shaping. `std::collections::HashMap` ES hashbrown por dentro, así
49# que esto no cambia el comportamiento en Linux: sólo lo vuelve expresable sin
50# sistema operativo.
51hashbrown = { version = "0.17", default-features = false, features = ["default-hasher", "inline-more"] }
52
53# El backend CPU (W3). Opcional y apagado por default: en Linux el camino normal
54# sigue siendo vello. Se enciende en wawa, que es donde `vello::Scene` no existe.
55llimphi-cpu = { path = "../llimphi-cpu", version = "0.1.0", default-features = false, optional = true }
56
57[features]
58# El default reproduce EXACTAMENTE lo de antes: dibujo con vello, fuentes del
59# sistema, std. Ningún consumidor nota W2.
60default = ["std", "vello", "system"]
61# ¿Este build SHAPEA? Es el gate honesto: `parley` (con fontique y swash detrás)
62# sólo hace falta si alguien va a resolver ligaduras y line-break de este lado.
63# Los backends que pintan lo necesitan; el backend `wire` NO — su typesetter
64# pregunta en vez de shapear, y arrastrar el shaper igual sería meter en la jaula
65# justo lo que W4 sacó de ella.
66shaping = ["dep:parley"]
67std = ["parley?/std", "peniko/std", "llimphi-cpu?/std", "llimphi-wire-escena?/std"]
68# Pintar el texto shapeado en una `llimphi_cpu::Escena` en vez de en una
69# `vello::Scene`. Es el camino de wawa: mismo layout de parley, otro pincel.
70cpu = ["dep:llimphi-cpu", "shaping"]
71# Emitir hacia el IR de escena en vez de rasterizar: el camino de una app `.wasm`
72# que compone dentro de la jaula y manda el resultado. Excluyente con los otros
73# dos backends. NO shapea — ver el módulo `wire`.
74#   cargo check -p llimphi-text --no-default-features --features wire,std
75wire = ["dep:llimphi-wire-escena"]
76# Las fuentes del sistema (fontique/system → fontconfig · objc2 · windows). Es
77# lo que da el fallback CJK/emoji más allá de las tres fuentes embebidas.
78system = ["std", "shaping", "parley?/system"]
79# Las siete funciones que pintan en `vello::Scene`.
80vello = ["dep:vello", "std", "shaping"]
81# Bare-metal (wawa): matemática por libm, sin sistema de fuentes — sólo los
82# blobs que el crate ya embebe y registra a mano.
83#   cargo check -p llimphi-text --target x86_64-wawa \
84#     --no-default-features --features libm -Z build-std=core,alloc
85libm = ["parley?/libm", "peniko/libm", "llimphi-cpu?/libm", "llimphi-wire-escena?/libm"]
86
87[dev-dependencies]
88llimphi-raster = { path = "../llimphi-raster", version = "0.1.0" }
89llimphi-hal = { path = "../llimphi-hal", version = "0.1.0" }
90pollster = { workspace = true }
91
92[[example]]
93name = "hello_text"
94path = "examples/hello_text.rs"
95# Pinta con `draw_block`, que sólo existe con la feature `vello` (W2).
96required-features = ["vello"]
97
98# W4.1 de 03_ukupacha/wawa/PLAN-LLIMPHI.md — el costo del shaping del lado app,
99# el único número que le faltaba a la decisión de ABI de W4.
100[[example]]
101name = "medir_shaping"
102path = "examples/medir_shaping.rs"
103# Mide el costo del shaping: pide `parley`, o sea la feature `shaping`. Faltaba
104# declararlo, así que bajo `wire` el ejemplo existía y no compilaba — la misma
105# clase de cosa que una feature declarada y nunca construida.
106required-features = ["shaping"]
107
108# Mide el caché de shaping (`cache_stats`), que sólo existe donde se shapea. No
109# estaba declarado —cargo lo descubría solo— y por eso nadie había notado que no
110# compila sin `shaping`.
111[[example]]
112name = "bench_cache"
113path = "examples/bench_cache.rs"
114required-features = ["shaping"]
115
116# Mide con `measure`, que sólo existe donde se shapea. Mismo caso que los
117# ejemplos: no estaba declarado, así que nadie había notado que no compila bajo
118# el backend `wire`.
119[[test]]
120name = "mono_ancho_fijo"
121path = "tests/mono_ancho_fijo.rs"
122required-features = ["shaping"]