[package] name = "llimphi-cpu" version.workspace = true edition.workspace = true license.workspace = true authors.workspace = true publish.workspace = true description = "llimphi-cpu — el rasterizador de Llimphi sin GPU. Graba las órdenes de dibujo en una `Escena` (misma forma que `vello::Scene`) y las rinde con `vello_cpu` a un `Pixmap`, que se vuelca a cualquier framebuffer. `no_std + alloc`: es la pieza que deja correr Llimphi sobre el kernel bare-metal de wawa, donde no hay wgpu ni winit. W1 de 03_ukupacha/wawa/PLAN-LLIMPHI.md." [dependencies] # El rasterizador de sparse strips de Linebender, en modo bare-metal: # # default-features = false — su `default` trae `std` + `png`, y `png` FUERZA # `std` a través de vello_common. # libm — la matemática de coma flotante sin sistema. # u8_pipeline — hace falta AL MENOS un pipeline o el crate emite # `compile_error!`. Con sólo u8, el render debe # pedir `RenderMode::OptimizeSpeed` (OptimizeQuality # exige el pipeline f32). vello_cpu = { version = "0.0.9", default-features = false, features = ["u8_pipeline", "text"] } # `force_support_fallback` es lo que habilita `Level::fallback()`, que es # `const fn`. La alternativa, `Level::new()`, usa `is_x86_feature_detected!` — # que REQUIERE std y por lo tanto no existe en el kernel. fearless_simd = { version = "0.4.1", default-features = false, features = ["force_support_fallback"] } # ----------------------------------------------------------------------------- # `std` vs `libm`: hay que elegir UNA, y no es preferencia de estilo. # ----------------------------------------------------------------------------- # `vello_common` importa `peniko::kurbo::common::FloatFuncs` — el trait que da # `round`/`sqrt`/etc. sin sistema operativo. kurbo SÓLO define ese trait cuando # su feature `std` está APAGADA; con `std` puesto, la stdlib ya provee esos # métodos y kurbo configura el trait fuera del binario. # # De ahí sale una regla que no se puede desobedecer: **el perfil de este crate # tiene que coincidir con el de kurbo en el mismo build**. Y en cuanto `vello` # entra en la unificación de features, kurbo TIENE std —vello declara `peniko` # con `default-features = true`—, así que pedir `libm` acá revienta con # «no `FloatFuncs` in `common`» en cuatro archivos de vello_common. # # Por eso `std` es el default: en Linux, donde vello convive con vello_cpu (o # sea, el workspace entero), es el único perfil coherente. wawa pide el otro # explícitamente, y ahí no hay vello que unifique nada. [features] default = ["std"] # Linux: además de resolver lo de kurbo, permite detectar el nivel SIMD en # tiempo de ejecución en vez de conformarse con el escalar. std = ["vello_cpu/std", "fearless_simd/std"] # Bare-metal (wawa). Se pide así: # cargo check -p llimphi-cpu --target x86_64-wawa \ # --no-default-features --features libm -Z build-std=core,alloc libm = ["vello_cpu/libm", "fearless_simd/libm"] # Sin dev-dependency sobre `llimphi-text`, a propósito: el puente que camina un # `parley::Layout` y emite glifos vive del OTRO lado (feature `cpu` de # llimphi-text), y el test de punta a punta con él. Así la flecha va en un solo # sentido —llimphi-text → llimphi-cpu— y no hay ciclo que cargo tenga que # tolerar. Este crate no sabe qué es parley, y está bien que no lo sepa.