mirror of
https://github.com/storytold/cadcraft.git
synced 2026-11-02 16:31:48 -06:00
* Thai text: stacked marks, Thai fonts first, MTEXT word wrap, Windows fonts under WSL Thai text in DWG/DXF files decoded correctly but laid out badly. Vowels and tone marks stacked on one consonant collided (ดิ์), because only right-to-left text went through the shaper. - Thai lines go through the harfrust shaper (complex::needed). Shaped left-to-right glyphs keep their characters (TextGlyph) for PDF text. - Thai fallback fonts: Cordia, Angsana and Browallia first (Thai drawings are laid out with their widths), then IBM Plex Sans Thai, Noto Sans/Serif Thai and the fonts each OS ships. - The web build embeds the craft-fonts Thai regular faces. - MTEXT wraps a run of Thai between words when the run is too wide for the column by itself. Text that fits at its spaces keeps those line breaks, so existing drawings lay out as before. Word breaks come from icu_segmenter's LSTM model (about 410 KB). ICU's dictionary segmenter was not used: after loanwords it breaks inside words, even between a consonant and its tone mark. Breaks inside a character cluster are dropped, and results are cached. - Under WSL the font scan also reads /mnt/c/Windows/Fonts, at the lowest priority, so drawings find the Windows fonts they name (Cordia New). The scan reads entry types from the directory listing instead of a stat per file. * Thai fallback: match older Angsana and Browallia file names; document touched functions Today's Windows ships Angsana New and Browallia New as angsana.ttc and browalia.ttc. Older Windows used single faces (angsa.ttf, angsab.ttf, browa.ttf, ...), which still turn up when fonts are copied to Linux machines. The Thai fallback list now matches the shorter stems `angsa` and `browa`, which cover both. Review feedback on #2591. Doc comments for scan, plain_lines and the paragraph layout's word_width and place. * MTEXT: wrap a Thai run after a first-line indent or a tab A Thai run that fit a line at the left indent, but not the room left after a first-line indent or a tab stop, wasn't split between its words: the first line of a paragraph can't wrap, so it ran out of the column. An empty line now measures the run from where it starts. Review feedback on #2591. Also restores the space in `image = {` in Cargo.toml. * Font scan: take the WSL font folder out of this change Thai text doesn't depend on it: with no Windows or system fonts, the craft-fonts Thai faces (Noto Sans Thai, IBM Plex Sans Thai) stack marks and wrap MTEXT the same way. Reading the Windows host's /mnt/c/Windows/Fonts under WSL is a separate decision, so the scan is back to main's: Linux system and user font folders only.
124 lines
6.3 KiB
TOML
124 lines
6.3 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*", "apps/*", "xtask"]
|
|
# default-members
|
|
|
|
[workspace.package]
|
|
version = "0.16.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
repository = "https://github.com/storytold/cadcraft"
|
|
|
|
[workspace.dependencies]
|
|
# internal
|
|
cadcraft-geom = { path = "crates/geom" }
|
|
cadcraft-dxf = { path = "crates/dxf" }
|
|
cadcraft-dwg = { path = "crates/dwg" }
|
|
cadcraft-color = { path = "crates/color" }
|
|
cadcraft-doc = { path = "crates/doc" }
|
|
cadcraft-constraints = { path = "crates/constraints" }
|
|
cadcraft-fonts = { path = "crates/fonts" }
|
|
cadcraft-render = { path = "crates/render" }
|
|
cadcraft-io = { path = "crates/io" }
|
|
cadcraft-engine = { path = "crates/engine" }
|
|
cadcraft-ui-egui = { path = "crates/ui-egui" }
|
|
cadcraft-mcp = { path = "crates/mcp" }
|
|
# Which paths stored in a drawing (xrefs, data links) may be opened.
|
|
craft-docpath = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0" }
|
|
# PDF writing (krilla) for plots, and reading them back in tests. The root patches below pin
|
|
# craft-pdf's patched backends to the same revision (Cargo ignores dependency-local patches).
|
|
craft-pdf = { version = "=0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", default-features = false }
|
|
clap = { version = "4", features = ["derive", "env"] }
|
|
clap_complete = "4.6.11"
|
|
clap_mangen = { version = "0.3.3", features = ["env"] }
|
|
|
|
# foundation
|
|
thiserror = "2"
|
|
same-file = "1"
|
|
serde = { version = "1", features = ["derive", "rc"] }
|
|
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
log = "0.4"
|
|
# 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"] }
|
|
rayon = "1"
|
|
|
|
# rendering / formats
|
|
tiny-skia = { version = "0.12", default-features = false, features = ["std", "simd", "png-format"] }
|
|
lyon_tessellation = "1.0.22"
|
|
skrifa = "0.48"
|
|
# Text shaping (OpenType GSUB/GPOS, HarfBuzz port on read-fonts; egui's epaint is still on 0.12,
|
|
# so the graph has both) and the Unicode Bidirectional Algorithm for right-to-left drawing text.
|
|
harfrust = "0.14"
|
|
unicode-bidi = "0.3.18"
|
|
# Line-break opportunities between Thai words for MTEXT word wrap (Thai writes no spaces between
|
|
# words): UAX #14 with ICU4X's compiled-in LSTM word model (not its dictionaries).
|
|
icu_segmenter = { version = "~2.3", default-features = false, features = ["compiled_data", "lstm"] }
|
|
image = { version = "0.25", default-features = false, features = ["png", "jpeg"] }
|
|
encoding_rs = "0.8.35"
|
|
# XML for the SVG reader (streaming parser, no entity expansion beyond the five predefined ones)
|
|
quick-xml = "0.42"
|
|
|
|
# ui
|
|
craft-ui = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", features = ["serde"] }
|
|
craft-window = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", features = ["egui"] }
|
|
egui = { version = "0.37", default-features = false, features = ["default_fonts", "monochrome_emoji_fonts"] }
|
|
egui_kittest = "0.37"
|
|
eframe = { version = "0.37", default-features = false }
|
|
egui-wgpu = "0.37"
|
|
# Monotonic time on native and web (performance.now on wasm).
|
|
web-time = "1.1"
|
|
# 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 = "c5a1cbfb5f9049f9270955caffb5bee5997aebf7", features = ["egui"] }
|
|
rfd = "0.17"
|
|
arboard = { version = "3.6", default-features = false }
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[workspace.lints.clippy]
|
|
cognitive_complexity = "deny"
|
|
too_many_arguments = "deny"
|
|
wildcard_imports = "deny"
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
type_complexity = "allow"
|
|
|
|
[profile.dev.package."*"]
|
|
opt-level = 2
|
|
debug = false
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
debug = "line-tables-only"
|
|
|
|
[profile.release]
|
|
opt-level = 3
|
|
lto = "thin"
|
|
codegen-units = 16
|
|
debug = 0
|
|
|
|
# PDF backends for craft-pdf: pinned to the same reviewed craft-libs revision as craft-pdf itself
|
|
# (Cargo ignores dependency-local patches).
|
|
[patch.crates-io]
|
|
krilla = { version = "=0.8.2", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0" }
|
|
hayro-syntax = { git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0" }
|
|
hayro-jbig2 = { git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0" }
|
|
|
|
# Keep the complete egui family and native event bridge on reviewed fork commits.
|
|
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" }
|