feat(pineal): cierra stub export — PlanRecorder + exporter SVG

Fase F: primer stub de pineal cerrado.

pineal-render:
- PlanRecorder — un Canvas que graba cada llamada como RenderCmd en un
  RenderPlan. Es el puente painter→backend-diferido y la infraestructura
  de testing (snapshot de planes).

pineal-export:
- svg::to_svg(plan, w, h) — RenderPlan → documento SVG completo.
  Cubre FillRect/StrokeRect/StrokeLine/StrokePolyline/DrawText +
  FillTriangleStrip (strip→polígonos con color promedio). XML-escape
  en texto. v1: clips ignorados (documentado).
- pdf queda como placeholder documentado.

Tests: 1 recorder + 4 svg (well-formed, primitivas, xml-escape,
triangle-strip→polygons). cargo check --workspace verde.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-20 14:11:03 +00:00
parent 8cd8003dd5
commit b75e22fa91
4 changed files with 335 additions and 17 deletions
+15 -17
View File
@@ -1,23 +1,21 @@
//! `pineal-export` — exporters.
//! `pineal-export` — exporters de `RenderPlan`.
//!
//! Estrategia: implementar `pineal_render::Canvas` con un
//! adapter que emite elementos SVG (o instrucciones PDF). El mismo
//! painter que dibuja en pantalla escribe en el exporter — un sólo
//! camino de código.
//! Estrategia: el painter dibuja contra el trait `Canvas`; un
//! `PlanRecorder` (en `pineal-render`) lo graba como `RenderPlan`; este
//! crate consume el plan y emite el formato destino. Un solo camino de
//! código para screen y export.
//!
//! Decimación contextual:
//! ```text
//! target = width_inches × dpi × vertices_per_pixel
//! ```
//! Print (300 dpi) saca ~3× más vértices que screen (96 dpi) del
//! mismo source data (sección 3.10).
//!
//! - **`svg`** — exporter SVG.
//! - **`pdf`** — placeholder; cuando se implemente, vía `printpdf`
//! sobre el mismo `RenderPlan` que el SVG.
//! - [`svg`] — exporter SVG (implementado).
//! - [`pdf`] — placeholder; cuando se implemente, vía `printpdf` sobre
//! el mismo `RenderPlan`, con decimación contextual por DPI
//! (`target = width_inches × dpi × vertices_per_pixel`).
#![forbid(unsafe_code)]
#![allow(dead_code)]
pub mod svg {}
pub mod svg;
/// Exporter PDF — pendiente. Se implementará sobre `printpdf`
/// consumiendo el mismo `RenderPlan` que `svg`.
pub mod pdf {}
pub use svg::to_svg;