An Illustrator EPS (version 9 on) carries the document as the app keeps
it after its printed page (%AI9_PrivateDataBegin: Zstandard or zlib data
in ASCII85 comment lines, or plain), and a .ai file in its first page's
/PieceInfo /Illustrator /Private streams (%AI24_ZStandard_Data,
%AI12_CompressedData or plain, after header comments). Both now open from
it: layers and sublayers (name, order, visibility, lock, printing,
preview, dimming, colour), groups as they were nested, compound paths,
clipping groups and layer clipping, object names, hidden and locked
objects, fills and strokes (grey, CMYK, RGB, spot colours as spot
swatches, caps, joins, dashes, fill rule), linear and radial gradients,
opacity, blend modes, isolation and knockout, embedded images with their
alpha channel, guides and every artboard where it is.
Objects with several fills or strokes, effects or brushes come in as
their drawn look, named after them, with a warning. Type, symbols,
pattern fills, placed files and operators the reader doesn't know are
errors: the file opens as before (the EPS page, the .ai file's PDF
content) with a first warning saying what was left out. A .ai opened with
pages picked, and a .pdf, read the PDF as before.
Reading is bounded (512 MB decompressed, nesting, objects, points, stack,
image sizes checked against their data) and fuzzed in import_fuzz.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A PDF or PDF-compatible .ai whose ToUnicode map gives some glyphs U+FFFD (as
some files do for the digits of an embedded CID font) imported those glyphs as
type showing the replacement character, so every digit came in as "�".
U+FFFD now counts as no mapping. Such a glyph takes its character from the
embedded font where it can (Adobe's CID tables for CID-keyed CFF, as before,
then the font program's own cmap), and otherwise keeps its outline from the
embedded font, so it looks as the file draws it. The import warns which font
had characters the file doesn't name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New from Template... and Save as Template opened their dialog in
~/Documents/VectorCraft Templates. On desktops whose documents folder has
another name (Italian ~/Documenti) or where the folder was never made, the
dialog started in a folder that doesn't exist and showed an error.
- The default Templates folder is now in the user's documents folder: on Linux
and the BSDs the one XDG_DOCUMENTS_DIR names in user-dirs.dirs, elsewhere
~/Documents.
- The folder a dialog starts in is made when missing; where it can't be, the
dialog starts in the nearest folder above it that exists, else home.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A program that re-encodes a font in an EPS sets the copy under a name with a
`*<n>` suffix (`KBKNNM+RollerBabyBV*1`). The suffix was part of the family
name, so the installed font was never found and text fell back to a
substitute. The suffix is dropped when `*` is followed only by digits.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The rotate cursor drew an arc with a large triangle under each end, both
pointing straight down and away from the arc, so it didn't read as an arrow.
Each end now has a slim arrowhead pointing on along the arc's tangent, with
the same halo as the other cursors.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Transform fields were sized from the row's room, the rotation field was
70 pt, the corner radius 80, Opacity 64, the stroke weight 90 and Keyboard
Increment 80, so the fields didn't line up. One `panels::field_width`, the
Transform fields' width measured from the full row, now sizes all of them (and
the Edit Artboards fields, and the Transform panel's corner radius).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening a PDF-compatible .ai (or a PDF saved with Preserve Editing) that has more than one
page showed the Import PDF dialog and imported pages, although the file carries its
VectorCraft document. Opening now restores that document (every artboard and layer) without
asking, as the engine already does when no pages are picked. Placing still asks for the page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The brands check keeps other products' names out of user-facing text; #694's
SVG warnings called Radial Blur, Smart Blur and Unsharp Mask "Photoshop-style
raster effects". They are "pixel effects" now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Shaper fits a hexagon's rotation by scoring 0, 90, 180 and 270
degrees, but a hexagon at 180 is the one at 0 (and 270 the one at 90):
those pairs score the same up to rounding, so the platform's atan2 picked
between them. FreeBSD's libm gave 270 where Linux gives 90, failing
tilted_rectangles_ellipses_and_hexagons_snap_to_their_angle_steps on the
FreeBSD build+test job. Candidates a whole number of periods from an
earlier one are now dropped. A new test reproduces the flip on Linux
with the old code (180 instead of 0 at tilt -9).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GQPh8UDgMyARR5Hat9UchC
- A press with a selection tool inside an artboard makes it the active one, as
the Artboard tool's does; before, only the navigator and the Artboards panel
changed it.
- Paste in Place, in Front and in Back take `artboard` (the UI passes the active
one): the objects go where they were on the artboard they were copied from,
on that artboard. Without it, they paste where they were, as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Effect › Blur › Radial Blur (spin/zoom, draft/good/best) and Smart Blur
(Normal mode), Effect › Sharpen › Unsharp Mask: Photoshop-style filters in
vectorcraft_effects::pixel, run by the renderer on the object's pixels in
stack order with Gaussian Blur and Feather, cached while panning; lengths in
points, bounded work per pixel. PDF, Expand Appearance and SVG export write
the effected objects as images. Dialogs with preview (method/quality
dropdowns, fields in documented order), menu entries, translations, tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Windows shows a window's big icon (ICON_BIG) in the taskbar and Alt+Tab.
eframe sets only the window icon (the small one, in the title bar), so the
taskbar showed a generic window instead of VectorCraft's icon. The app now sets
the big icon from the same 256 px image when the window is created.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cmd+, is how every Mac app opens its settings. It now opens Preferences on
macOS beside its own Cmd+K, unless a command or one of the user's shortcuts
already has the chord.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The toolbar names its tool groups (Select, Shapes, Draw, Modify...). A new
preference, on by default, turns the names off for a cleaner toolbar: a faint
dash then separates the groups.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Document tabs drew their close box before the title on every platform, the
macOS convention. On Windows, Linux and the web it now comes after the title,
as those platforms' tabs (and Adobe's own apps there) put it; macOS keeps it
before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- artboard.rearrange takes layout (gridByRow, gridByColumn, row, column;
byColumn stays as an alias of gridByColumn) and order (leftToRight,
rightToLeft); Columns is the row count of a grid by column and is
ignored by row and column. It returns {artboards, rows, columns}.
- A Rearrange All Artboards dialog: Layout and Layout Order toggles drawn
in code (widgets::layout_button, previewing the order), Columns/Rows,
Spacing, Move Artwork with Artboard and the artboard count.
- One click: Rearrange All in the Properties panel (Document section with
several artboards, Edit Artboards' Quick Actions); the Artboards panel's
Rearrange button and menu item now open the dialog too.
- Tests for every layout x order (artboards, art riding along, one undo
step), the dialog, the Properties button; the command sweep covers the
new params. Translations for ja, es, it, ru, fr, zh-hans, zh-hant and
pt-br; ROADMAP updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The crate README now spells out the provenance the review on
storytold/vectorcraft#667 asks the owner to decide on: no Affinity
software; afread's MIT description re-described without translating
code; every structure confirmed on public files (CRC-32 per entry,
self-typed fields); semantics fitted to Affinity's own thumbnails; how
the sample documents were licensed; read-only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GQPh8UDgMyARR5Hat9UchC
Conflicts: ROADMAP (main's guides and file-format rows, with the Affinity
items kept); fileio/load.rs (main's physical-size raster documents, kept
visible to the Affinity preview fallback).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GQPh8UDgMyARR5Hat9UchC
Preferences > User Interface > Canvas Color offered Match User Interface
Brightness and White only: with a dark interface the first is a high-contrast
dark canvas around the white page, and White hides where the page ends. Light
Gray, Medium Gray and Dark Gray keep the page's edge in view at a gentler
contrast.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The census behind the limit counted duplicate copies of the same public
files: there are 189 distinct documents, the largest still decoding 3.3
million values.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GQPh8UDgMyARR5Hat9UchC
VectorCraft found fonts only in the system's font folders (and, on Windows,
those font services activate). A new preference names one more folder, read
with its subfolders after the platform's: its fonts are listed in the font
menus and used as if installed, without installing them.
- vectorcraft_text::set_user_font_dirs / user_font_dirs: folders
system_font_dirs adds to every scan (none on wasm).
- prefs fontsFolder (Type > Options > Additional Fonts Folder), trimmed; when
it changes after the first scan, the fonts are scanned again at once, so the
folder's fonts appear (or go) and type in them lays out again.
- The label is translated where Additional Plug-ins Folder is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#677 lets one image decode take up to 2 GB, so large print sheets open on the
desktop. wasm32 can address only 4 GB and aborts when an allocation fails, so
the web app keeps the decoder's default 512 MB and reports larger images as an
error instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the Artboard tool, the Properties panel showed the active artboard's name,
position and size but no quick way to turn it between portrait and landscape.
It now has a row with:
- Preset: New Document's saved and built-in presets, by category, matched in
either orientation (Custom when none matches); choosing one sizes the
artboard in its current orientation;
- Portrait and Landscape (the New Document toggle): the other one swaps the
artboard's width and height.
The artboard's top-left corner stays put, so no art moves with it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>