mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-11-14 14:52:22 +00:00
New L3 crate over pdfcraft-prc: assemble places every product-tree tessellation into world space with its colours (pure `place` does the transform), Camera fits a view to the model, and render fills depth-buffered triangles with headlight or unlit shading into an RGBA image. Opaque triangles draw first, translucent ones blend over them; perspective views clip at a near plane. Never panics: MAX_RENDER_PIXELS and MAX_ASSEMBLED_TRIANGLES cap the work, every pixel and vertex index is checked, and damage returns RenderError. Single-threaded. Tests: 24 unit tests (two drive the product-tree placement path) plus an end-to-end one that builds a synthetic PRC stream in-test, renders it, and checks the background, the nearer triangle and the farther one by pixel; every truncation of that stream parses and assembles without panicking. Reverting the depth test or the placement transform fails the matching tests. Adapted from pdfcer (MIT, same author) at 912437c3, trimmed to the camera, raster and headlight parts and rewritten to the pdfcraft-prc types. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SqmHYx8FiWM5PcsoiErgp9
164 lines
8.8 KiB
TOML
164 lines
8.8 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*", "apps/*", "xtask"]
|
|
exclude = ["vendor"]
|
|
default-members = ["crates/*", "apps/pdfcraft", "apps/pdfcraft-cli", "xtask"]
|
|
|
|
[workspace.package]
|
|
version = "0.18.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
repository = "https://github.com/storytold/pdfcraft"
|
|
|
|
[workspace.dependencies]
|
|
# Shared frontend components; engines remain independent of egui.
|
|
craft-ui = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff", features = ["serde"] }
|
|
# Quit the macOS way (#1136): ⌘Q asks about unsaved changes, and closing quits through `terminate:`.
|
|
craft-quit = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff" }
|
|
# One menu definition for the native macOS menu bar and the in-window bar elsewhere.
|
|
craft-menu = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff" }
|
|
craft-keymap = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff", default-features = false }
|
|
# Interface translations: lookup, fallback, CLDR plurals and language names over the craft-i18n
|
|
# catalogs that `crates/ui-egui/build.rs` embeds from `CRAFT_I18N_DIR` (storytold/craft-i18n, at
|
|
# the commit in `craft-i18n.rev`). Already in the tree through craft-ui.
|
|
craft-i18n = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff" }
|
|
# Shared system spooler; document composition remains in pdfcraft-print.
|
|
craft-print = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff" }
|
|
# Whether a path stored in a document may be opened (GoToR link targets).
|
|
craft-docpath = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff" }
|
|
# craft-update: app-specific pretend versions apply to startup and manual checks.
|
|
craft-update = { git = "https://github.com/storytold/craft-libs", version = "=0.1.0", rev = "787a7a0f972fd1d7a7618fdbeca3a5267a0407ff", features = ["egui"] }
|
|
# internal
|
|
pdfcraft-geom = { path = "crates/geom", version = "0.18.0" }
|
|
pdfcraft-filters = { path = "crates/filters", version = "0.18.0" }
|
|
pdfcraft-cos = { path = "crates/cos", version = "0.18.0" }
|
|
pdfcraft-crypt = { path = "crates/crypt", version = "0.18.0" }
|
|
pdfcraft-organize = { path = "crates/organize", version = "0.18.0" }
|
|
pdfcraft-measure = { path = "crates/measure", version = "0.18.0" }
|
|
pdfcraft-annot = { path = "crates/annot", version = "0.18.0" }
|
|
pdfcraft-audit = { path = "crates/audit", version = "0.18.0" }
|
|
pdfcraft-fonts = { path = "crates/fonts", version = "0.18.0" }
|
|
pdfcraft-model = { path = "crates/model", version = "0.18.0" }
|
|
pdfcraft-content = { path = "crates/content", version = "0.18.0" }
|
|
pdfcraft-redact = { path = "crates/redact", version = "0.18.0" }
|
|
pdfcraft-print = { path = "crates/print", version = "0.18.0" }
|
|
pdfcraft-xfdf = { path = "crates/xfdf", version = "0.18.0" }
|
|
pdfcraft-sign = { path = "crates/sign", version = "0.18.0" }
|
|
pdfcraft-optimize = { path = "crates/optimize", version = "0.18.0" }
|
|
pdfcraft-a11y = { path = "crates/a11y", version = "0.18.0" }
|
|
pdfcraft-oracle = { path = "crates/oracle", version = "0.18.0" }
|
|
pdfcraft-testkit = { path = "crates/testkit", version = "0.18.0" }
|
|
pdfcraft-ocr = { path = "crates/ocr", version = "0.18.0" }
|
|
pdfcraft-js = { path = "crates/js", version = "0.18.0" }
|
|
pdfcraft-compare = { path = "crates/compare", version = "0.18.0" }
|
|
pdfcraft-preflight = { path = "crates/preflight", version = "0.18.0" }
|
|
pdfcraft-export = { path = "crates/export", version = "0.18.0" }
|
|
pdfcraft-edit = { path = "crates/edit", version = "0.18.0" }
|
|
pdfcraft-create = { path = "crates/create", version = "0.18.0" }
|
|
pdfcraft-forms = { path = "crates/forms", version = "0.18.0" }
|
|
pdfcraft-xfa = { path = "crates/xfa", version = "0.18.0" }
|
|
pdfcraft-render = { path = "crates/render", version = "0.18.0" }
|
|
pdfcraft-prc = { path = "crates/prc", version = "0.18.0" }
|
|
pdfcraft-prc-render = { path = "crates/prc-render", version = "0.18.0" }
|
|
pdfcraft-engine = { path = "crates/engine", version = "0.18.0" }
|
|
pdfcraft-platform = { path = "crates/platform", version = "0.18.0" }
|
|
pdfcraft-ui-egui = { path = "crates/ui-egui", version = "0.18.0" }
|
|
pdfcraft-automation = { path = "crates/automation", version = "0.18.0", default-features = false }
|
|
|
|
# pdf
|
|
hayro = "0.7.1"
|
|
hayro-syntax = "0.7.2"
|
|
lopdf = "0.45"
|
|
flate2 = { version = "1.1", default-features = false, features = ["rust_backend"] }
|
|
weezl = "0.2"
|
|
# CCITT Group 4 encoding (pdfcraft-filters); already in the tree through tiff.
|
|
fax = "0.2.7"
|
|
# Independent CCITT and JBIG2 codecs, already in the tree through hayro.
|
|
hayro-ccitt = "0.3"
|
|
hayro-jbig2 = "0.3"
|
|
|
|
# foundation
|
|
thiserror = "2"
|
|
serde = { version = "1", features = ["derive", "rc"] }
|
|
serde_json = "1"
|
|
log = "0.4"
|
|
kurbo = "0.13"
|
|
# All date/time conversion goes through chrono (no hand-rolled calendar code beyond the 400-year range extension; AGENTS.md).
|
|
chrono = { version = "0.4.45", default-features = false, features = ["std"] }
|
|
|
|
# testing
|
|
proptest = "1"
|
|
|
|
# ui
|
|
egui = "0.37"
|
|
egui_extras = { version = "0.37", default-features = false, features = ["svg"] }
|
|
eframe = { version = "0.37", default-features = false }
|
|
egui_kittest = "0.37"
|
|
rfd = "0.17"
|
|
# Monotonic time for logic-only work on native and web (`App::logic` runs without a UI pass).
|
|
web-time = "1.1"
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[workspace.lints.clippy]
|
|
cognitive_complexity = "deny"
|
|
too_many_arguments = "deny"
|
|
wildcard_imports = "deny"
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
|
|
# `"*"` matches every non-workspace package: crates.io dependencies and the
|
|
# vendored crates under `vendor/` (excluded from the workspace). Dependencies
|
|
# carry no debug info and our own crates only line tables: backtraces and
|
|
# panics still show file and line, while test binaries and the target dir stay
|
|
# small (each UI test binary had a 500-600 MB PDB on Windows, #454).
|
|
[profile.dev.package."*"]
|
|
opt-level = 2
|
|
debug = false
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
debug = "line-tables-only"
|
|
|
|
[profile.low-disk]
|
|
inherits = "dev"
|
|
incremental = false
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
|
|
# Vendored, patched third-party crates (see vendor/README.md). Each patch is meant to go upstream.
|
|
[patch.crates-io]
|
|
hayro-interpret = { path = "vendor/hayro-interpret" }
|
|
hayro = { path = "vendor/hayro" }
|
|
hayro-syntax = { path = "vendor/hayro-syntax" }
|
|
hayro-cmap = { path = "vendor/hayro-cmap" }
|
|
hayro-postscript = { path = "vendor/hayro-postscript" }
|
|
hayro-jbig2 = { path = "vendor/hayro-jbig2" }
|
|
lopdf = { path = "vendor/lopdf" }
|
|
vello_common = { path = "vendor/vello_common" }
|
|
vello_cpu = { path = "vendor/vello_cpu" }
|
|
# The egui and winit crates below are pinned to immutable storytold git revisions (egui
|
|
# 6d518fc799681571963842f95b55a6b68431b15a, winit a517b3846ee8457d84ee4975110bfda6797c44dc).
|
|
# Only the retained `vendor/winit` and `vendor/egui-wgpu` copies are provenance for the app's
|
|
# earlier patches and their source guards, not path patches; the other `vendor/` entries above
|
|
# remain real path patches. See vendor/README.md and the migration plan.
|
|
ecolor = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
emath = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
epaint = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
epaint_default_fonts = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui-winit = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui-wgpu = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_glow = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_extras = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_kittest = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_system_font_provider = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
eframe = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_demo_lib = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_inspection = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
winit = { git = "https://github.com/storytold/winit.git", rev = "a517b3846ee8457d84ee4975110bfda6797c44dc" }
|