Commit Graph
8875 Commits
Author SHA1 Message Date
Don Omondi fdbd116577 EPS import: cvi and cvr read radix numbers
cvi and cvr read a string as the PostScript syntax reads a number
(PLRM 3rd ed., cvi, cvr), so (16#20) cvi is 32. The reader parsed strings
as decimal only. Ghostscript's eps2write prolog undoes a name's #20 escape
that way, so its files with a spot colour named with spaces stopped
reading at that colour.
2026-11-07 08:19:36 +07:00
Don Omondi 8c57a65ee0 EPS import: SubFileDecode reads counts past the allocation cap
The count of a SubFileDecode filter bounds what it passes through, not
what it allocates, but the reader refused counts over 4 MiB as a
rangecheck. Ghostscript's eps2write files read each content stream with
currentfile Length () /SubFileDecode filter, so a page whose stream is
longer than 4 MiB failed to open.
2026-11-07 08:19:33 +07:00
Don Omondi 06a035e86b EPS import: bind leaves the procedures it already bound alone
bind makes each procedure it goes into read-only and ignores read-only
procedures (PLRM 3rd ed., bind). The reader bound them again, so a prolog
that binds a procedure holding an earlier-bound one, after defining a name
such as M as an operator, turned that procedure's own variable M into
setmiterlimit. Ghostscript's eps2write prolog does this, and its files with
sampled functions (transfer, black generation) failed to open.
2026-11-07 08:19:29 +07:00
dotCooCoo 1e2ff653b5 Save: the save commands' params text names the notes on options
document.save's params text, which file.saveAs, file.saveCopy and
file.saveAsTemplate share, now says that the warnings also name each key
given in `options` that the format doesn't read.
2026-11-07 08:19:25 +07:00
dotCooCoo 7ee6b429ba MCP: save_file notes name the legacy or non-PDF-compatible .ai
save_file's note for a key in `options` that the written format doesn't
read named every .ai file a PDF-compatible .ai, also when the save wrote
a version 7 file (`aiVersion: "7"`) or one without PDF content
(`pdfCompatible: false`).

The save itself now writes that note, beside its note on a top-level
`compress`, `version`, `preview` or `precision`, and names the file it
writes, including when it reuses the options the document was last saved
with. save_file returns the save's reply unchanged, and
`run_command document.save` and the other save commands give the same
notes.
2026-11-07 08:19:24 +07:00
dotCooCoo 3d7dda200e .ai import: opacity mask art of one object opens as that object
The reader put an opacity mask's art in a group every time, so a mask
made from one path came back from a saved .ai as a group holding the
path, while Make Opacity Mask keeps one object as the art. This also
changes how existing files with single-object masks open, because
the editing data of a .ai, an EPS and a PDF goes through this reader:
the art is the object.

A hidden object or a guide stays in a group, because the canvas draws
the art's root whether it is shown or not and whether guides show. A
clipping path alone stays a clipping group.

The editing copy writes a plain group of one object as a group (u, the
object, U), so it reads back as a group. Its other plain groups are
still written as their members. Hidden mask art is written shown,
because the canvas draws it and a group read back would not.
2026-11-07 08:19:20 +07:00
dotCooCoo ad5ef55b30 Docs: PDF password export says when the file ID and the bytes vary
Encryption keeps the /ID already in the trailer and draws one from the
seed only when there is none. A PDF 1.3 export draws no random bytes, so
it repeats with SOURCE_DATE_EPOCH set, while PDF 1.4 and later differ
between runs. Their random bytes are in the encryption dictionary and,
at PDF 1.6 and later, in the AES initialization vectors.
2026-11-07 08:19:16 +07:00
dotCooCoo f4576de615 Artboards: the panel menu's New Artboard makes the new artboard active
The panel menu's item added the artboard and left the active artboard
where it was, while the panel's button, the Control bar and Properties
made the new one active. All four now call one helper. With the Artboard
tool, the new artboard is then the only one selected.
2026-11-07 08:19:12 +07:00
BFlat 9592b6a5ca Merge pull request #5982 from dotCooCoo/fix/link-watch-worker-gone
Links: a link check whose worker ends without a result no longer stops later checks
2026-11-07 09:11:28 +08:00
BFlat 60f1bff1d8 Merge pull request #5978 from dotCooCoo/fix/ai-image-knockout-shape
.ai import: images, meshes, blends and styled objects keep the knockout shape flag
2026-11-07 09:11:07 +08:00
BFlat d0d915a721 Merge pull request #5977 from kylekanouse/fix/svg-textpath-anchor
SVG: centred and right-aligned type on a path keeps its place
2026-11-07 09:10:51 +08:00
BFlat 4e16340f2c Merge pull request #5946 from ruchirguitar/fix/4947-indic-hyphenation
Add hyphenation for eleven Indian languages
2026-11-07 09:10:37 +08:00
BFlat 4b29225c30 Merge pull request #5965 from dotCooCoo/feat/ai-editing-data-s5
.ai save: the editing copy keeps type as type
2026-11-07 09:10:24 +08:00
BFlat 51aea90f07 Merge pull request #5972 from dotCooCoo/fix/selection-overlay-per-frame
Canvas: selection outlines and anchors are reused between frames
2026-11-07 09:10:03 +08:00
BFlat afdc490d3a Merge pull request #5971 from slafebre/fix/5964-gradient-dash-corner
Part of #5964: stroke gradients cover an arrowhead to the end of its reach
2026-11-07 09:09:47 +08:00
BFlat 073923ee30 Merge pull request #5969 from dotCooCoo/fix/eyedropper-keeps-story-selection
Type: switching to the Eyedropper keeps a whole-story selection
2026-11-07 09:09:33 +08:00
BFlat 085bbf5495 Merge pull request #5968 from slafebre/fix/5714-smooth-width-profiles
Fix #5714: widths run smoothly between width points
2026-11-07 09:09:19 +08:00
BFlat ee4f711fbe Merge pull request #5967 from dotCooCoo/fix/ai-brushed-paths
.ai import: paths with an Art brush open with the brush on their stroke
2026-11-07 09:09:01 +08:00
BFlat 7adc7fa40c Merge pull request #5966 from dotCooCoo/fix/ai-envelope-stroked-box
.ai import: envelopes map from their stroked box when the file saves its size
2026-11-07 09:08:45 +08:00
BFlat 9950bde2e7 Merge pull request #5963 from dotCooCoo/fix/pdf-export-cost
PDF export: members of a plain group or layer are measured once to leave out off-page art, and the link walk measures only what it reads
2026-11-07 09:08:28 +08:00
BFlat e940a55cb6 Merge pull request #5959 from dotCooCoo/fix/ai-symbol-section-strings
.ai import: ASCII85 data in a section does not hide the section's end
2026-11-07 09:08:13 +08:00
BFlat aeb697c8ea Merge pull request #5958 from FractalEncrypt/fix/shape-tool-centre-and-rotate
Shape tools: move the selection from its centre point and turn it outside a corner
2026-11-07 09:07:57 +08:00
BFlat b59e31203e Merge pull request #5957 from FractalEncrypt/fix/transform-fields-tab-order
Transform fields: Tab moves from one field to the next, one press each
2026-11-07 09:07:42 +08:00
BFlat 5a07696a8e Merge pull request #4732 from SofiaAFigueredo/feat/4684-unify-home-screen-ui
UI: centre the Home screen and use the accent for the Discord button (#4684)
2026-11-07 09:07:26 +08:00
BFlat 4244b96afc Merge pull request #5955 from dotCooCoo/fix/open-text-layout
Type: layout keeps each font face's shaping plans
2026-11-07 09:07:10 +08:00
BFlat 8df48df103 Merge pull request #5953 from mockydevs/fix/legacy-ai-smooth-image-clip-5264
Legacy .ai export: a flattened transparent image's clip follows its edge smoothly
2026-11-07 09:06:50 +08:00
BFlat 4db8bbc97c Merge pull request #5952 from dotCooCoo/feat/ai-pathfinder-effect-commands
.ai import: the other Effect › Pathfinder operations open as live effects on a group
2026-11-07 09:06:14 +08:00
BFlat 3bceade119 Merge pull request #5951 from dotCooCoo/fix/ai-active-artboard
.ai save: the editing copy names the active artboard
2026-11-07 09:05:42 +08:00
BFlat 76eca8e98e Merge pull request #5950 from mockydevs/feat/progress-indicator-5930
Opening a slow file shows a progress window with Cancel and Continue in Background
2026-11-07 09:05:27 +08:00
BFlat b497793902 Merge pull request #5948 from Hamza0101/feat/bulgarian-text-language
Languages: Bulgarian, with its quote marks and the fonts' Bulgarian forms (#5945)
2026-11-07 09:05:15 +08:00
BFlat 98c6e8ab5d Merge pull request #5947 from mockydevs/fix/grid-snap-anchors
Direct Selection: with Snap to Grid, a dragged straight segment lands its anchors on the grid
2026-11-07 09:04:57 +08:00
BFlat 0ebce55584 Merge pull request #5942 from mockydevs/feat/paste-spreadsheet-table
Paste: cells copied from a spreadsheet paste as a table of type over gridlines
2026-11-07 09:04:38 +08:00
BFlat d79c3574af Merge pull request #5940 from dotCooCoo/fix/paint-without-bounds
Appearance and Eyedropper: reading an object's paint does not measure its bounds
2026-11-07 09:04:16 +08:00
BFlat af4f590b6b Merge pull request #5939 from mockydevs/feat/alt-numpad-codes-5108
Type: Alt + numeric-keypad codes (Alt+0176 → °) type their character on Windows; type.insert takes a code
2026-11-07 09:03:59 +08:00
BFlat 84fc4b74ac Merge pull request #5938 from mockydevs/feat/3d-effects-on-groups
3D effects: Extrude & Bevel, Inflate and Rotate apply to groups, turned about one shared axis
2026-11-07 09:03:47 +08:00
BFlat e688fbea0e Merge pull request #5937 from mockydevs/feat/glyph-bounds-corners-5112
Snap to Glyph: each glyph's bounding-box corners are snap points, and the box turns with rotated type
2026-11-07 09:03:27 +08:00
BFlat bc57bdaee3 Merge pull request #5932 from Hamza0101/fix/paste-into-new-type-keeps-formatting
Type: pin that a Type-range paste into new point type keeps its formatting (#5929)
2026-11-07 09:03:09 +08:00
BFlat 8029748283 Merge pull request #5931 from mockydevs/fix/perspective-plane-offsets
Perspective grid: a grid dragged off its preset reports no preset name
2026-11-07 09:02:47 +08:00
BFlat c14ec164a2 Merge pull request #5928 from adikshan11/fix/library-untitled-format-copies
Don't copy a library on every save when its format keeps no title
2026-11-07 09:02:27 +08:00
BFlat d074756192 Merge pull request #5927 from mockydevs/fix/transform-effect-copies-5920
Effects: a Transform effect's copies of a filled and stroked path stack one above another
2026-11-07 09:02:10 +08:00
BFlat 0f0ded95b4 Merge pull request #5924 from jayzed80/fix/text-huge-gutter-stall
fix(text): a gutter too huge to step past no longer stalls area type layout
2026-11-07 09:01:34 +08:00
BFlat 145a10c2db Merge pull request #5922 from Hamza0101/fix/find-whole-word-across-runs
Find Whole Word: a change of style inside a word is not a word boundary (#5901)
2026-11-07 09:01:14 +08:00
BFlat 9ef87c19e5 Merge pull request #5921 from Hamza0101/fix/find-replace-respects-group-lock
Find and Replace: type inside a locked or hidden group is left alone (#5900)
2026-11-07 09:00:51 +08:00
BFlat 4166d31a54 Merge pull request #5918 from mockydevs/feat/drop-shadow-colour-picker
Drop Shadow: a swatch beside Color opens the Color Picker (#5364)
2026-11-07 09:00:28 +08:00
BFlat c0a40216ce Merge pull request #5917 from mockydevs/fix/boolean-area-check
Path booleans: check the windings against the operands' areas and resolve the operands when they don't add up (#5478)
2026-11-07 08:59:49 +08:00
bflatastic 53b40161f3 Docs: record kept selection marks in the parity status 2026-11-07 07:36:26 +07:00
bflatastic ccdccb1299 Tests: an image next to type keeps its knockout shape flag 2026-11-07 07:36:26 +07:00
dotCooCoo d323716068 Links: a link check whose worker ends without a result no longer stops later checks
When the link-watch worker unwound before storing its stamps,
poll_link_scan returned None on every frame and left link_scan set. The
app then asked for a repaint every 100 ms and start_link_scan returned
early, so the app did not look for changed linked files in the
background again for the rest of the session.

poll_link_scan now clears a look that has ended without stamps. The new
ended_without_stamps helper holds the slot's lock across its read of the
stamps and its read of the ended flag, so a look whose worker stores its
stamps during the check is applied. The app goes back to its two-second
wake, and the next look starts on schedule. A look still running and a
look that stored its stamps behave as before.
2026-11-07 07:36:26 +07:00
dotCooCoo 0be78766f4 .ai import: a compound of clipping paths keeps their knockout shape flag
Clipping paths in a compound path that holds a drawn look become one
compound path. It took the paths' shared stroke, opacity and blend mode
but dropped the knockout shape flag. It now has the flag when every
clipping path has it.
2026-11-07 05:15:19 +07:00
dotCooCoo a9b49f716b .ai import: images, meshes and blends keep the knockout shape flag
An `Xy` whose shape operand is set now reaches an image (embedded or
linked) and a gradient mesh when it is written before the object, and a
mesh or blend when it is written after the object's end. A live blend
takes the flag from its drawn steps. Before, the reader dropped the flag
on these objects, so an image saved with Opacity & Mask Define Knockout
Shape lost it on reopening, with no warning.

A styled object takes the flag written on its drawn look. For a text
object, the flag goes to the object when the look draws only its type,
and otherwise to the group that holds the look and the type. An opaque
look that draws more than the type and sets the flag now goes into that
group as well.
2026-11-07 05:15:19 +07:00