Rewrite into a vectorization framework (pillars 1–4)

Replace the 0.6.x single-pipeline crate with a stage-based framework, per
docs/design/. Implements Motivation pillars 1–4 (frontend, curve fitting,
color fitting, optimizer); mosaic (5) and bindings are deferred.

Workspace:
- crates/vtracer      — the framework library (wasm-safe, no I/O)
- crates/vtracer-cli  — thin CLI wrapper (clap 4 + image I/O)
- cmdapp/ and webapp/ excluded from the workspace (git-preserved)

Stages behind object-safe traits, composed by a Pipeline driver:
- Frontend: ColorClusterFrontend (+ transparency keying), BinaryFrontend
- CurveFitter: Pixel / Polygon / Spline (region tracing via visioncortex)
- ColorFitter: Identity, FixedPalette (OKLab-nearest), AutoQuantize
  (area-weighted median cut), MergeAdjacent
- OptimizerPass: QuantizePass, SimplifyPass
- SvgWriter: relative/absolute shortest encoding, H/V/S shorthands,
  compact number formatting, <g fill> grouping

visioncortex is a path dependency on the local 0.9.0 checkout.

Verified: 14 unit/integration tests pass; framework builds for
wasm32-unknown-unknown; CLI output renders faithfully via rsvg.
This commit is contained in:
Chris Tsang
2026-07-23 22:27:24 +01:00
parent 913d0ac7e0
commit e46c971845
26 changed files with 2463 additions and 2 deletions
+22 -1
View File
@@ -1,7 +1,28 @@
[workspace]
members = [
"crates/vtracer",
"crates/vtracer-cli",
]
# The pre-1.0 crates are kept in the tree for git history but are no longer
# part of the build. They are replaced by the crates/ workspace above.
exclude = [
"cmdapp",
"webapp",
]
resolver = "2"
resolver = "2"
[workspace.package]
version = "1.0.0-alpha.1"
authors = ["Chris Tsang <chris.2y3@outlook.com>"]
edition = "2021"
license = "MIT OR Apache-2.0"
homepage = "http://www.visioncortex.org/vtracer"
repository = "https://github.com/visioncortex/vtracer/"
[workspace.dependencies]
# visioncortex 0.9.0 is currently unreleased; developed against the local
# checkout. Releases will pin a published 0.9.x.
visioncortex = { version = "0.9", path = "../visioncortex" }