tawasuyu

tawasuyu/llimphi

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

Rust 229TOML 101Markdown 82Shell 24052 Definiciones

⎇ main llimphi-text/examples/hay_negrita.rs Rust · 66 líneas · 2.3 KB Historia Quién tocó qué crudo

chore: refresco desde el monorepo — 132 miembros, 79 widgets, la galería vuelve y licencia dual d8edd9a9c · Sergio ·

1//! **¿La negrita existe de verdad en esta máquina?**
2//!
3//! CÑ3 (2026-10-05). El operador ve el texto de claude plano y en otros IDEs lo
4//! ve con negritas. Ya está medido que el camino entero existe: el bold de la
5//! celda del PTY viaja a `StyledSpan { weight: 700 }`, el text-editor lo pasa a
6//! `TextSpanStyle`, y de ahí sale a `parley::FontWeight`. Lo que falta saber es si
7//! **la fuente resuelve otra cara** — porque si la mono del sistema no tiene
8//! variante bold, pedir 700 no cambia un píxel y todo lo anterior es correcto y
9//! no se ve.
10//!
11//! No alcanza con medir el ancho: en una monoespaciada la negrita mide **lo
12//! mismo** por definición. Lo que distingue es la **cara resuelta** (el id de la
13//! fuente que parley eligió) y, si eso no basta, el id de los glifos.
14//!
15//! ```text
16//! cargo run -p llimphi-text --example hay_negrita
17//! ```
18
19fn caras(ts: &mut llimphi_text::Typesetter, texto: &str, familia: Option<&str>, peso: f32) -> Vec<String> {
20    let l = ts.layout(
21        texto,
22        13.0,
23        None,
24        llimphi_text::Alignment::Start,
25        18.0,
26        false,
27        familia,
28        peso,
29        false,
30        false,
31        0.0,
32        0.0,
33    );
34    let mut out = Vec::new();
35    for linea in l.lines() {
36        for item in linea.items() {
37            if let parley::PositionedLayoutItem::GlyphRun(g) = item {
38                let run = g.run();
39                let f = run.font();
40                out.push(format!("{:?}#{}", f.data.id(), f.index));
41            }
42        }
43    }
44    out
45}
46
47fn main() {
48    let mut ts = llimphi_text::Typesetter::new();
49    let texto = "Negrita de prueba";
50    // Las familias que importan: la que pide la terminal (mono) y la de la UI.
51    for familia in [None, Some("monospace"), Some("DejaVu Sans Mono"), Some("Liberation Mono")] {
52        let normal = caras(&mut ts, texto, familia, 400.0);
53        let negra = caras(&mut ts, texto, familia, 700.0);
54        let nombre = familia.unwrap_or("(por defecto)");
55        let distinta = normal != negra;
56        println!(
57            "{nombre:22} 400={normal:?}\n{:22} 700={negra:?}   → {}",
58            "",
59            if distinta {
60                "✓ resuelve OTRA cara: la negrita existe"
61            } else {
62                "✗ MISMA cara: pedir 700 no cambia nada"
63            }
64        );
65    }
66}