Commit Graph
3057 Commits
Author SHA1 Message Date
dotCooCoo c246fc2f0e Clipboard: a .svgz file copied in a file manager pastes as its art
Paste takes a file copied in a file manager by its flavor, which
file_flavour tells from the file's first 4,096 bytes through
fileio::detect. detect names gzip data SVGZ unless it is a compressed
native file, and file_flavour gave no flavor for the format id svgz.
So a copied .svgz file did not paste as its art, although
clipboard.importSvg, the SVG flavor's command, reads SVGZ data.

A copied file whose gzip data unpacks to SVG markup now pastes through
the SVG flavor. file_flavour unpacks the head it is given with the
gzip decoder the SVGZ reader uses, up to where the head ends, and
checks the first 4,096 unpacked bytes with looks_like_svg, as detect
checks an uncompressed file, reading them as UTF-16 after a UTF-16
byte order mark. Other gzip files get no flavor, as before.

Docs: docs/target-app-parity.md.
2026-10-16 03:36:20 +07:00
dotCooCoo c5a1504e99 Clipboard: a .ai or .ait file copied in a file manager pastes as its art
Paste takes a file copied in a file manager by its flavor, which
file_flavour tells from the file's first 4,096 bytes through
fileio::detect. detect names PDF or PostScript bytes in a file called
.ai or .ait by that extension, and file_flavour gave no flavor for
the format ids ai and ait. So a copied .ai or .ait file did not paste
as its art, while the same bytes in a .pdf or .eps file did.

A copied .ai or .ait file whose bytes are a PDF now pastes through the
PDF flavor (clipboard.importPdf), and one whose bytes are PostScript
pastes through the EPS flavor (clipboard.importEps). Other files
with those extensions paste as before. A .ai saved without its PDF
part also gets the PDF flavor, and Paste answers it with
clipboard.importPdf's error, as it does for the same file named .pdf.

Docs: docs/control-protocol.md, docs/development.md,
docs/target-app-parity.md.
2026-10-16 03:36:20 +07:00
bflatastic b9341d3b3b i18n(bg): the PostScript file error names File › Open and File › Place 2026-10-16 03:36:20 +07:00
dotCooCoo 31ffbb2152 PDF/.ai import: the PostScript file error names File › Open and File › Place, which read the file
document.pdfInfo and clipboard.importPdf, given a PostScript file (an
EPS, or an .ai in an older PostScript format), failed with "this is a
PostScript file (...), which can't be opened yet: save it as PDF,
PDF-compatible .ai or SVG". document.open and file.place read the same
file through the EPS reader. The error told users to convert a file that
VectorCraft opens.

The error now says the file is not a PDF and that File › Open and
File › Place read it as EPS. The 13 catalogs that carry the message get
the new text.
2026-10-16 03:36:20 +07:00
EricKuckandClaude Opus 5.5 f3b4c3ec78 PDF import: an axial or radial shading keeps its function's curve when sampled into stops
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:20 +07:00
bflatastic 136810bee2 PDF/.ai import: the tint transform test passes no ink names to space_of 2026-10-16 03:36:20 +07:00
dotCooCoo ca145c5265 PDF/.ai import: spot inks with the same values and different names keep their own swatches
A PDF can define spot inks that have different names and the same
alternate space and tint transform, such as Blue1 and Blue2, both RGB
0 0 255. The interpreter drops the ink name, so the importer matches an
interpreted color to the file's Separation and DeviceN spaces by the
tint transform. The spaces of two such inks matched the same color, so
their paths imported as plain RGB and neither ink became a spot swatch.
This happened with both inks on one page, with each on its own page,
and in the PDF part of a .ai file.

The page walk in import_scan.rs, which follows the interpreter's order
for layers and overprint, now also records the ink of each path, from
the color space set by cs and CS or from the shading of the pattern set
by scn and SCN or drawn by sh, and the ink of the color space of the
text between two paths. When the spaces of several inks match a color,
the importer takes the space with the walk's ink names. It applies
these names to a page only when the page uses such an ink and a
counting pass of the interpreter draws as many paths there as the walk
counted. Otherwise the import works as before.

The file now opens with a spot swatch for each ink. Solid fills and
strokes of paths and type, and the stops of gradients on paths, link
to the swatch of their ink, the points of a gradient mesh keep the
ink's color, and PDF export writes each ink as its own separation.
Paint in these inks inside pattern cells, soft masks and type 3 glyphs,
and gradients on type in these inks, still import as RGB. Type in one
of these inks can also import as RGB when type in another Separation or
DeviceN ink is shown with no path drawn between them.
2026-10-16 03:36:20 +07:00
bflatastic 90e6ff3de1 PDF/.ai import: the tests added on main pass the page's unit to layered_ai 2026-10-16 03:36:20 +07:00
dotCooCoo 16b8aeb6b7 PDF/.ai import: a .ai whose page has a UserUnit opens with its layers at the page's size
A PDF page's UserUnit (PDF 1.6) sets the size of its user space unit
in multiples of 1/72 inch. The PDF reader has applied it since #1894, so
a page with /UserUnit 10 and a 36 × 50.4 media box opens at 360 × 504
pt. A .ai whose editing data has its artboards in the page's own units
then no longer matched its PDF part. It opened from the PDF part,
without its layers, its hidden objects and the art outside its
artboards, and with its artboards in a row instead of where the
editing data puts them. document.pdfInfo gave such a page's size in
points and its boxes in the file's numbers.

Editing data whose first artboard has the page's size in the page's
units, and not in points, is now compared with the PDF part scaled
down by the UserUnit. The document read from it is then scaled up by
the UserUnit, with its stroke weights, dashes, effects and pattern
tiles. When the layers can't be read, the artboard layout taken from
the editing data is scaled the same way. document.pdfInfo gives the
boxes in points, as it gives the size.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-16 03:36:20 +07:00
dotCooCoo dc179c3671 .ai import: CMYK images in the editing data keep their ink amounts
When a .ai file, or an EPS with editing data, opened from its editing
data, the reader converted each embedded 8-bit CMYK image to RGB and
stored it as a PNG, so the document lost the image's ink amounts. When
the same .ai opens from its PDF part, the PDF importer keeps them in a
CMYK TIFF.

The reader now stores those samples with ImageBlob::cmyk_tiff, as the
PDF importer does (crates/pdf/src/import_image.rs). An alpha channel
that hides part of the image becomes the image's opacity mask, a
grayscale image over it, as in PDF import. Grayscale, RGB and 1-bit
images still open as RGBA PNGs.

Docs: docs/file-format-parity.md, docs/target-app-parity.md.
2026-10-16 03:36:20 +07:00
bflatastic 8af0459232 AI import: a gradient mesh keeps at most 65,536 points, however its patches are cut 2026-10-16 03:36:20 +07:00
EricKuckandClaude Opus 5.5 76888366e7 AI import: a mesh patch's anchors run in the mesh's direction whatever their key
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:20 +07:00
EricKuckandClaude Opus 5.5 1682d59b65 AI import: a gradient mesh patch's edges bend through the anchors listed between its corners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:20 +07:00
EricKuck e93ba4c83f AI import: a gradient in a pattern's definition is placed from the canvas, as the file's PDF part draws it 2026-10-16 03:36:20 +07:00
EricKuckandClaude Opus 5.5 9ebd30b8bb AI import: a styled object read in place of its drawn look keeps the transparency written on the look
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:20 +07:00
EricKuckandClaude Opus 5.5 6545d8b886 AI import: a drawn look that is an image stands for its object, as one of paths does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:19 +07:00
EricKuckandClaude Opus 5.5 fb6fc437c3 AI import: a clipping path alone in a group clips the clipping group around it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:19 +07:00
midasmatterhorn d5a672fda2 eps: an opacity mask in the editing data is named, not drawn whole (#2004) 2026-10-16 03:36:19 +07:00
bflatastic 312a939646 eps: rustfmt the layer transparency change 2026-10-16 03:36:19 +07:00
midasmatterhorn 6feec01d85 eps: a layer's own transparency in the editing data is read (#2003) 2026-10-16 03:36:19 +07:00
NetterSilverandClaude Haiku 5.5 dfdb98463f Open PDFs and .ai files with an image over 256 MB decoded
Fixes #2005

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 03:36:19 +07:00
BFlat 2cdd00cf7b Merge pull request #2278 from storytold/fix/properties-flip-labels
Properties: the flip buttons keep the reference app's Properties names (#1910)
2026-10-16 03:23:19 +07:00
BFlat 8958dfe60a Merge pull request #2274 from dotCooCoo/feat/type-reset-tracking
Type: Cmd/Ctrl+Alt+Q resets tracking to 0 and kerning to Auto
2026-10-16 03:22:55 +07:00
BFlat e5c12d0487 Merge pull request #2272 from dotCooCoo/feat/layers-eye-outline-others
Layers: Ctrl/Cmd+Alt-click on an eye switches the other layers between Outline and Preview
2026-10-16 03:22:39 +07:00
BFlat e797b68220 Merge pull request #1920 from sanyamsingh001/codex/r65-width-finite
G1: Fix intermediate overflow in adjoining width adjustments
2026-10-16 03:22:21 +07:00
BFlat f4b0e0f27b Merge pull request #1926 from marcoarnulfo/fix/paste-in-place-off-artboard
Paste in Place: art copied from off the artboards goes back where it was
2026-10-16 03:22:02 +07:00
BFlat 2480017af0 Merge pull request #1939 from dotCooCoo/fix/issue-1692-hex-field-tab
Fix #1692: tabbing through a hex field no longer resets the color
2026-10-16 03:21:46 +07:00
BFlat 312456a769 Merge pull request #1937 from dotCooCoo/fix/issue-1692-tab-order
Part of #1692: Tab in the Color Picker goes through one color model's fields before the next
2026-10-16 03:21:29 +07:00
BFlat bbda88bc71 Merge pull request #1951 from marcoarnulfo/fix/type-color-while-typing
Type: a colour picked while typing keeps what was typed
2026-10-16 03:21:13 +07:00
BFlat a324b0e25f Merge pull request #1967 from switch87/fix/1952-optional-number-strings
Transform commands: a string for an optional number is an error (#1952)
2026-10-16 03:20:58 +07:00
BFlat 39faa02fe5 Merge pull request #1988 from MarekSpodBiedry/issue-1970
Paint: picking another pattern swatch keeps the pattern transform (#1970)
2026-10-16 03:20:40 +07:00
BFlat 57ec0e6d7f Merge pull request #2047 from AyberkA0/i18n-eps-layers-note
i18n: the notes for an EPS or .ai whose layers weren't read are translated (#2035)
2026-10-16 03:20:23 +07:00
BFlat 6341519444 Merge pull request #2048 from AyberkA0/doc-loadprofile-lifetime
color.loadProfile: say that a loaded profile lasts for the run (#1955)
2026-10-16 03:20:07 +07:00
BFlat d4fa50f262 Merge pull request #2146 from AyberkA0/add-anchor-plus
Shortcuts: + selects the Add Anchor Point tool (#2142)
2026-10-16 03:19:50 +07:00
BFlat 6c4804383a Merge pull request #2155 from dotCooCoo/fix/inflate-one-edge-index
3D and Materials: Inflate builds its edge index once
2026-10-16 03:19:34 +07:00
BFlat 263fcff7b1 Merge pull request #2157 from dotCooCoo/fix/export-params-list-ai
Export: the export commands' params and the MCP export tool list the .ai format
2026-10-16 03:19:18 +07:00
BFlat 3c9fda57df Merge pull request #2183 from dotCooCoo/fix/export-for-screens-formats-text
Export for Screens: the params text and the format error list every format a row writes
2026-10-16 03:19:03 +07:00
BFlat 59dfe0834c Merge pull request #2198 from marcoarnulfo/fix/pdf-title-document-name
PDF: an untitled document saved to a file exports titled after it
2026-10-16 03:18:47 +07:00
BFlat b70ba0f82b Merge pull request #2255 from dotCooCoo/docs/print-system-service
Docs: the Print section describes printing through the system's print service
2026-10-16 03:18:31 +07:00
BFlat 3a0d1ce970 Merge pull request #2261 from dotCooCoo/fix/ru-isolate-latin-letter
i18n: Russian Isolate and Sublayer rows use Cyrillic letters only
2026-10-16 03:18:14 +07:00
BFlat 6048fd6b8e Merge pull request #2275 from thejdubb02/fix/cmyk-page-group-isolated
PDF export: a CMYK page without blending through is an isolated group (#2156)
2026-10-16 03:17:57 +07:00
BFlat e479e62317 Merge pull request #2271 from gorkematlyn/upstream-pdf-panic
PDF.R1: never panic on a damaged array or dictionary in an imported PDF
2026-10-16 03:17:40 +07:00
BFlat 8f1d730ccb Merge pull request #2214 from dotCooCoo/feat/outline-object-type-art
Type: type drawn as glyph outlines keeps its underline, stroke weight, gradients and patterns
2026-10-16 03:17:22 +07:00
BFlat 043f2dff3c Merge pull request #2215 from dotCooCoo/fix/export-selection-keeps-effects
Export Selection: the crop takes in what each object's effects draw
2026-10-16 03:17:05 +07:00
BFlat b8d1bdea40 Merge pull request #2219 from dotCooCoo/feat/print-fallback-font-warning
Print: Print and Print Preview warn when type prints in the fallback font
2026-10-16 03:16:49 +07:00
BFlat 8ca5615dca Merge pull request #2242 from dotCooCoo/fix/data-set-sets-objects-in-groups
Variables: selecting a data set sets the objects inside a group that it shows
2026-10-16 03:16:35 +07:00
BFlat 0a0d22df57 Merge pull request #2250 from dotCooCoo/fix/variable-binding-errors
Variables: binding errors name the command and say when a layer is hidden
2026-10-16 03:16:19 +07:00
BFlat f3eab99283 Merge pull request #2226 from dotCooCoo/feat/update-data-set-keeps-own-values
Variables: Update Data Set writes only the variables the active data set holds
2026-10-16 03:16:03 +07:00
BFlat f253d2b3e3 Merge pull request #2229 from dotCooCoo/fix/pen-cursor-asterisk
Pen: the new-path asterisk leaves the pointer once a path is started
2026-10-16 03:15:47 +07:00
BFlat 70723a799b Merge pull request #2234 from dotCooCoo/feat/proof-setup-tritanopia
View: Proof Setup simulates tritanopia
2026-10-16 03:15:32 +07:00