PNG export (and everything else drawn by raster::render) stroked every
polyline primitive with its own tiny-skia stroke_path call: a new path
and a newly built paint pipeline per primitive. Hatch patterns, linetype
dashes and text strokes produce long runs of short polylines in one
colour, so that per-call setup dominated the render.
Consecutive hairline polylines (zero width, or at most one pixel when
anti-aliased; the default for PNG export) with the same colour, alpha
and width are now collected into one path and stroked once. tiny-skia
draws hairlines segment by segment straight onto the pixmap with the
same per-contour round caps, so the pixels and their blending order are
unchanged. Thicker strokes (filled outlines), fills, points, infinite
lines and polylines with non-finite or far-out screen coordinates break
the run and are drawn exactly as before.
Adds crates/io/examples/export_bench.rs, which exports examples/
apartment.dxf repeated on a grid (10x10: 5,800 entities) and reports
median/min wall time per format.
PNG export, 10x10 grid, 11 interleaved runs (Ryzen, 16 threads, Linux):
before: median 1790.7 ms, min 1703.3 ms
after: median 1037.6 ms, min 926.0 ms (-42.1 %)
A/A noise on the same setup: 1.1 %. Output PNGs are byte-identical
(bench at 10x10 and 20x20, CLI export of apartment.dxf and a 23,200-
entity drawing). New tests compare render() against stroking each
primitive on its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AREA's next-point prompt and DIST's Multiple points prompt offered Arc,
and MEASUREGEOM's Distance, Area and Volume options ask the same
prompts, but Arc printed "Arc: not available yet". Arc now turns on arc
mode with PLINE's arc options (Angle, CEnter, CLose, Direction, Line,
Radius, Second pt, Undo; CEnter takes an end point, Angle or chord
Length), and the arcs count in the distance, area, perimeter and
volume. A point in arc mode ends an arc tangent to the
last segment, Length after an arc continues along its end tangent, and
Undo removes the last arc. CLose ends with an arc back to the first
point. A point straight behind the last segment is refused with
"Invalid arc endpoint.".
In a DIST measured through one viewport, an arc's computed end, a typed
radius and a typed chord length are in the viewport's model units, as
Length's distance is.
* Pin craft-libs at craft-libs#312's head (4dc543c) for the dock-column move
* Side panels dock in left and right dock columns
Tool Sets sits in a left dock column and Layers above Properties in a right
one, at the widths of the old side frames. Palettes dock only into those
columns: a window edge without a dock makes one, and neither the drawing nor
the top and bottom edges take a drop. A palette opened with no recorded place
goes into its dock group (External References below Properties). Iconic
columns show CADCraft's own code-drawn icons.
* Workspace file: dock layout version; split-frame layouts reset to the default
The workspace file saves dockingVersion next to the panel layout. A layout
saved without it, or with an older one, is dropped with its hidden panels on
load; the other workspace settings are kept.
* Floating panels open in their own OS windows on the desktop
- craft-ui's native-windows feature is on for the desktop app (not the web build)
and for the UI crate's tests.
- While the Save changes prompt, Drawing Recovery or another egui modal is up,
the panels' OS windows take no input.
- Keys, text and clipboard events typed in a panel's OS window go into the main
window's next input, so shortcuts, the command line and the canvas get them.
- Files dropped on a panel's OS window open like files dropped on the main window.
* Floating windows stay below the macOS title row
A drag in that row moves the whole app window, so a floating panel drawn over it
could not be moved or used. The dock area keeps floating windows, flyouts and
drag ghosts below it.
* Opening a floating panel from a menu or command brings its window to the front
* Workspace saves are spaced at least 500 ms apart, so dragging a floating window doesn't write the file every frame
* Pin craft-libs at #312's head b6d35e28
* Pin craft-libs at #313's head cdc67131 (result-rectangle drop preview)
* The title row is craft-window's title bar
Its empty part moves the window and follows the macOS double-click setting,
and does nothing in full screen. On macOS the window's movable flag follows
the pointer, so AppKit's title-band drag leaves the window still under the
row's controls and under floating panels. Floating panels may therefore go
over the title row again.
craft-window is pinned at craft-libs#316's head, which is not stacked on the
craft-ui pin.
* Pin craft-libs at 189b4ffe (#313 and #316 merged)
* macOS menu choices and their shortcuts run at once
A menu choice is no window event, so the app ran it only at its next frame
for another reason: File ▸ Close (Cmd+W) on an edited drawing showed
"Save changes?" and dimmed the floating palettes a second or two late. The
menu's event handler now wakes the app.
* Pin craft-libs at pin-round3 d24e4bcc
* Cargo.lock and the native-window test helper after the egui 0.37 merge
* Pin craft-libs at #334 (4638095): the title bar's empty area takes no keyboard focus
* Pin craft-libs at main 271594c0
* A modifier the main window changes while panel keys are forwarded is the one put back