tawasuyu

tawasuyu/llimphi

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

Rust 229TOML 101Markdown 82Shell 24052 Definitions

⎇ 168cd187519c0ad575d3ce63baee2f164c38d9d1 llimphi-svg/LEEME.md Markdown · 44 lines · 1.6 KB History raw

chore: refresco desde el monorepo — 27 crates nuevos (anim, lottie, svg, mesh, image, layer, test, wire-view, widgets rag-sidebar/router/lazy-list/rive-button) y sync de los 95 existentes 93253cc22 · Sergio ·

1# llimphi-svg
2
3*Read this in English: [README.md](README.md).*
4
5Puente fino entre `vello_svg` y Llimphi.
6
7`llimphi-icons` cubre el set canónico de ~50 íconos a mano (BezPath en
8grid 24×24). Para lo demás — íconos de apps `.desktop` arbitrarias,
9logotipos, assets de marca, exports vectoriales de pineal/cosmos — hace
10falta cargar SVG real. Este crate es el puente: parsea una vez con
11`vello_svg` y stampea la `vello::Scene` resultante en cualquier `View`
12escalándola al rect del nodo.
13
14## Uso
15```ignore
16use llimphi_svg::SvgAsset;
17
18// Parsea UNA vez (al cargar la app o el ícono):
19let svg = SvgAsset::from_str(include_str!("logo.svg")).expect("logo válido");
20
21// Pintalo en un View tantas veces como quieras (escala al rect):
22View::new(style).children(vec![svg.view::<Msg>()])
23```
24El parse cuesta — el `view()` no. Si vas a stampear el mismo SVG en muchos
25nodos (lista de apps con el mismo ícono fallback), parsea una sola vez y
26clonea el `SvgAsset` (es barato: `Arc` internamente).
27
28## Por qué no parsear en cada paint
29
30`vello_svg::render` corre el parser de `usvg` (~ms por SVG no trivial). En
31una lista con 80 íconos `.desktop`, parsear en cada frame mata el thread
32de UI. La regla: **el asset se parsea una vez**, la `Scene` resultante se
33retiene en memoria y se stampea con `scene.append(&inner, Some(xf))` —
34cuesta lo mismo que dibujar el resto del UI.
35
36## Errores
37
38`SvgAsset::from_str` devuelve `Result<Self, SvgError>` — si el XML está
39corrupto o usa features que `usvg` no soporta. Las apps típicas tratan el
40error como "fallback a glyph genérico" — no rompen.
41
42---
43
44Parte de **llimphi** — ver [llimphi](../LEEME.md).

LEEME.md

llimphi-svg

Read this in English: README.md.

Puente fino entre vello_svg y Llimphi.

llimphi-icons cubre el set canónico de ~50 íconos a mano (BezPath en grid 24×24). Para lo demás — íconos de apps .desktop arbitrarias, logotipos, assets de marca, exports vectoriales de pineal/cosmos — hace falta cargar SVG real. Este crate es el puente: parsea una vez con vello_svg y stampea la vello::Scene resultante en cualquier View escalándola al rect del nodo.

Uso

use llimphi_svg::SvgAsset;

// Parsea UNA vez (al cargar la app o el ícono):
let svg = SvgAsset::from_str(include_str!("logo.svg")).expect("logo válido");

// Pintalo en un View tantas veces como quieras (escala al rect):
View::new(style).children(vec![svg.view::<Msg>()])

El parse cuesta — el view() no. Si vas a stampear el mismo SVG en muchos nodos (lista de apps con el mismo ícono fallback), parsea una sola vez y clonea el SvgAsset (es barato: Arc internamente).

Por qué no parsear en cada paint

vello_svg::render corre el parser de usvg (~ms por SVG no trivial). En una lista con 80 íconos .desktop, parsear en cada frame mata el thread de UI. La regla: el asset se parsea una vez, la Scene resultante se retiene en memoria y se stampea con scene.append(&inner, Some(xf)) — cuesta lo mismo que dibujar el resto del UI.

Errores

SvgAsset::from_str devuelve Result<Self, SvgError> — si el XML está corrupto o usa features que usvg no soporta. Las apps típicas tratan el error como "fallback a glyph genérico" — no rompen.


Parte de llimphi — ver llimphi.