tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
chore: refresco desde el monorepo — 132 miembros, 79 widgets, la galería vuelve y licencia dual
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}