1# llimphi-lottie
2
3*Read this in English: [README.md](README.md).*
4
5Puente fino entre `velato` (reproductor de Lottie de Linebender) y Llimphi.
6
7`llimphi-svg` cubre el vector *estático* arbitrario (íconos `.desktop`,
8logos). `llimphi-motion` cubre el movimiento *generado por código* (tweens
9sobre el bucle Elm). Este crate cubre el hueco del medio: **animación
10vectorial autorada por fuera** — los `.json` de Lottie que exportan los
11diseñadores desde After Effects / lottiefiles (íconos animados,
12ilustraciones, estados vacíos, onboarding).
13
14Es el gemelo de `llimphi-svg`, con un eje de tiempo: `velato` parsea el JSON
15a una `Composition` y, para un `frame` dado, emite a la **misma**
16`vello::Scene` que usa `llimphi-raster`.
17
18## Uso
19```ignore
20use llimphi_lottie::LottieAsset;
21use std::time::Duration;
22
23// Parsea UNA vez (al cargar la app):
24let anim = LottieAsset::from_str(include_str!("spinner.json")).expect("lottie válido");
25
26// En el estado de la app guardas el tiempo transcurrido y lo avanzas con el
27// bucle Elm — exactamente el patrón de los workers de simulación:
28// handle.spawn_periodic(Duration::from_millis(16), || Msg::Tick);
29// y en update: self.t += 1.0 / 60.0;
30
31// Pintalo a su instante actual (escala + centra al rect, en loop):
32View::new(style).children(vec![anim.view_at_time::<Msg>(self.t)])
33```
34El parse cuesta (corre el importador serde de Lottie); el `paint`/`view` no.
35`LottieAsset` es `Clone` barato (`Arc` internamente) — el mismo asset en
36varios nodos no replica memoria.
37
38## Por qué un `Renderer` nuevo por paint
39
40`velato::Renderer` es `Default` y sólo guarda Vecs de scratch que se limpian
41en cada `append`. No tiene recursos de GPU (eso es trabajo de `llimphi-hal`).
42Crear uno por frame es despreciable frente a empujar la geometría — que se
43hace igual — y nos deja un `LottieAsset` `Send + Sync` sin `Mutex`.
44
45## Cobertura
46
47`velato` 0.9 implementa shapes, transforms animados, gradientes, trim paths,
48máscaras y precomposiciones — el grueso de los Lottie reales de íconos e
49ilustración. **No** implementa todavía capas de **texto**, **effects**
50(blur/drop-shadow) ni **expresiones** (declarado en su propio
51`schema/mod.rs`). Un asset que use esas features se pinta omitiéndolas, no
52rompe. Cuando un `.json` concreto las necesite, el camino es vendorizar
53`velato` como `shared/foreign-lottie` y completar el `todo` puntual.
54
55---
56
57Parte de **llimphi** — ver [llimphi](../LEEME.md).
LEEME.md
llimphi-lottie
Read this in English: README.md.
Puente fino entre velato (reproductor de Lottie de Linebender) y Llimphi.
llimphi-svg cubre el vector estático arbitrario (íconos .desktop,
logos). llimphi-motion cubre el movimiento generado por código (tweens
sobre el bucle Elm). Este crate cubre el hueco del medio: animación
vectorial autorada por fuera — los .json de Lottie que exportan los
diseñadores desde After Effects / lottiefiles (íconos animados,
ilustraciones, estados vacíos, onboarding).
Es el gemelo de llimphi-svg, con un eje de tiempo: velato parsea el JSON
a una Composition y, para un frame dado, emite a la misma
vello::Scene que usa llimphi-raster.
Uso
use llimphi_lottie::LottieAsset;
use std::time::Duration;
// Parsea UNA vez (al cargar la app):
let anim = LottieAsset::from_str(include_str!("spinner.json")).expect("lottie válido");
// En el estado de la app guardas el tiempo transcurrido y lo avanzas con el
// bucle Elm — exactamente el patrón de los workers de simulación:
// handle.spawn_periodic(Duration::from_millis(16), || Msg::Tick);
// y en update: self.t += 1.0 / 60.0;
// Pintalo a su instante actual (escala + centra al rect, en loop):
View::new(style).children(vec![anim.view_at_time::<Msg>(self.t)])
El parse cuesta (corre el importador serde de Lottie); el paint/view no.
LottieAsset es Clone barato (Arc internamente) — el mismo asset en
varios nodos no replica memoria.
Por qué un Renderer nuevo por paint
velato::Renderer es Default y sólo guarda Vecs de scratch que se limpian
en cada append. No tiene recursos de GPU (eso es trabajo de llimphi-hal).
Crear uno por frame es despreciable frente a empujar la geometría — que se
hace igual — y nos deja un LottieAsset Send + Sync sin Mutex.
Cobertura
velato 0.9 implementa shapes, transforms animados, gradientes, trim paths,
máscaras y precomposiciones — el grueso de los Lottie reales de íconos e
ilustración. No implementa todavía capas de texto, effects
(blur/drop-shadow) ni expresiones (declarado en su propio
schema/mod.rs). Un asset que use esas features se pinta omitiéndolas, no
rompe. Cuando un .json concreto las necesite, el camino es vendorizar
velato como shared/foreign-lottie y completar el todo puntual.
Parte de llimphi — ver llimphi.