Commit Graph
7686 Commits
Author SHA1 Message Date
BFlat e2d7988b02 Merge pull request #5268 from dotCooCoo/fix/release-frame-moves
Canvas: moves after the button-up do not join a stroke
2026-11-03 16:32:18 +07:00
BFlat 3c854c7289 Merge pull request #5277 from dotCooCoo/fix/measure-shift-snap
Measure: a Shift-drag snaps its end point on its 45° step
2026-11-03 16:32:02 +07:00
BFlat ee46dea2d4 Merge pull request #5257 from dotCooCoo/fix/text-setstyle-stroke
Type: text.setStyle sets the text's stroke as well as its fill
2026-11-03 16:31:45 +07:00
BFlat b3bfb3ae56 Merge pull request #5276 from dotCooCoo/fix/keymap-iso-key
Fix #4559: shortcuts can use the ISO key next to left Shift
2026-11-03 16:31:30 +07:00
BFlat 1c47e8386e Merge pull request #5288 from storytold/fix/sec-dxf-import-budgets
DXF import: budget dash patterns, copied text and names, and block items looked at
2026-11-03 16:31:13 +07:00
BFlat aa5f7ece8e Merge pull request #5299 from storytold/fix/sec-icc-duplicate-tags
ICC: refuse a profile whose tag table lists a tag twice
2026-11-03 16:30:57 +07:00
BFlat 8e9e79afc7 Merge pull request #5305 from storytold/fix/sec-export-settings-no-passwords
Export for Screens: keep PDF passwords out of remembered settings
2026-11-03 16:30:42 +07:00
BFlat 6b53f115a4 Merge pull request #5307 from storytold/fix/sec-flatten-overlap-index
Flatten Transparency: group overlapping objects without comparing every open pair
2026-11-03 16:30:27 +07:00
BFlat 2aba975488 Merge pull request #5301 from storytold/fix/sec-clipboard-png-side
Clipboard: leave out the PNG of art too large to scale to 4096 pixels
2026-11-03 16:30:11 +07:00
BFlat 05a189b8e8 Merge pull request #5323 from JonRC/fix/eps-currentfile-executed-file
Fix #5321: `currentfile` in a file being run is that file
2026-11-03 16:29:55 +07:00
BFlat 431958668b Merge pull request #5319 from JonRC/fix/eps-known-composite-key
Fix #5318: `known` answers false for keys no dictionary holds
2026-11-03 16:29:40 +07:00
BFlat 18b2acd426 Merge pull request #5317 from JonRC/fix/eps-encoding-resources
Fix #5316: StandardEncoding and ISOLatin1Encoding are Encoding resources
2026-11-03 16:29:24 +07:00
BFlat 8e4a865bd6 Merge pull request #5306 from storytold/fix/sec-place-queue-scope
Place: the place cursor reads its files within the roots it was loaded in
2026-11-03 16:29:13 +07:00
BFlat 1836abe4cb Merge pull request #5303 from storytold/fix/sec-thread-reflow-unique-frames
Threaded text: a frame listed twice flows the story once
2026-11-03 16:28:57 +07:00
BFlat 44ecfcc655 Merge pull request #5293 from storytold/fix/sec-brush-mask-root-symbol
Brushes: leave out an opacity mask whose root symbol draws a brushed stroke
2026-11-03 16:28:42 +07:00
BFlat 139fb217f4 Merge pull request #5329 from cybermaxwel/fix/zh-hans-luminosity-20261103
Fix Simplified Chinese translation of Luminosity
2026-11-03 16:28:24 +07:00
dotCooCoo 49477f8be5 Canvas: keep the last move before the button-up when it is elsewhere
When the release frame held moves after the button-up, the last move
before it was dropped as the pointer's position, although the release
event carries its own position. That move's sample was lost from the
stroke. It is now kept unless it is at the button-up's position, and its
tilt and rotation still give the release's pose.
2026-11-03 16:03:38 +07:00
dotCooCoo 76f0a8c615 Measure: a Shift-drag snaps its end point on its 45° step
The Measure tool and the Measure & Inspect tool snapped the end point of
a drag without Shift, but with Shift held they only turned the pointer
onto its 45° step and kept its distance: with Snap to Grid on the
measurement ended off the grid, with Smart Guides on it did not land in
line with an anchor, and with no snapping a drag of (37.3, 12.1) measured
39.2 pt at 0°.

Both now project the pointer onto the 45° step nearest its direction and
snap it there as the Line Segment tool snaps a Shift-drawn end, so it
stays on the step: (37.3, 12.1) measures 36 pt at 0° on a 9 pt grid, and
37.3 pt with no snapping. With Snap to Point alone, the anchor the pointer
snaps to is projected onto the step instead, so the end lands on an
anchor on the step and in line with one beside it.
2026-11-03 16:03:38 +07:00
dotCooCoo 58e6ce9f02 Type: a text.setStyle stroke gives unstroked characters 1 pt
A stroke color given without strokeWidth left characters at weight 0, so
nothing was drawn. As paint.setStroke does, a painted stroke now gives a
run with no weight 1 pt, for the characters and for the label styles a
graph keeps; an explicit strokeWidth still sets the weight.
2026-11-03 16:03:38 +07:00
dotCooCoo 6228446e9e Fix #4559: shortcuts can use the ISO key next to left Shift
Squashed from #5276 onto main.
2026-11-03 16:03:38 +07:00
bflatastic a9ce928f06 Format with rustfmt 2026-11-03 16:03:38 +07:00
bflatastic 1bd47ea30d Format with rustfmt 2026-11-03 16:03:38 +07:00
bflatastic c59cd281db Format with rustfmt 2026-11-03 16:03:38 +07:00
bflatastic 47bc3dd58c Flatten Transparency: iterate the test's groups directly (clippy needless_range_loop) 2026-11-03 16:03:38 +07:00
dotCooCoo df61ee2f84 Canvas: moves after the button-up do not join a stroke
A Pencil or brush stroke takes every pointer move of a frame. In the
frame that releases the button, the moves that came after the button-up
were sent as drags before the release, so the stroke ran out to them
and back. The moves now stop at the primary button-up, and the pen pose
for the end of the stroke is the one kept for the last move before it.
2026-11-03 16:03:38 +07:00
dotCooCoo b1dc20b811 Type: text.setStyle sets the text's stroke as well as its fill
text.setStyle takes stroke (a color or "none") and strokeWidth (the character
stroke's weight in document points, as stroke.set gives it), with keepModel
for both colors. They apply to all the text or to the start..end range, and
to graph label styles, in the same undo step as the command's other keys.
A stroke key was ignored before.
2026-11-03 16:03:38 +07:00
Dylan M. Taylor cd1afaf1cf DXF import: budget dash lengths, copied text and names, and block items looked at
A drawing could make the importer keep far more than its own size: every dashed path held its
own copy of its linetype, every text object and symbol instance of an array copied its text,
font family or block name, and each placement of a block looked at all of its items, hidden or
not, without charging the work budget.

- Dash lengths kept across the import are capped; past the cap lines are drawn solid.
- Text, font family and block-name bytes copied into objects share one 64 MB budget, and a
  font family longer than 256 bytes falls back to the default.
- Each block placement charges one visit per item it looks at, and stops once the budget is spent.
2026-11-03 16:03:38 +07:00
Dylan M. Taylor 8e692d83ed ICC: refuse a profile whose tag table lists a tag twice
moxcms parses every entry of the tag table, so a profile listing one
description, copyright or table tag thousands of times, each pointing at
the same large data, made it decode and copy that data once per entry.
The ICC specification allows each tag signature once; such a table is now
refused before parsing.
2026-11-03 16:03:38 +07:00
Dylan M. Taylor 06139d0011 Export for Screens: keep PDF passwords out of remembered settings
A successful Export for Screens stored its params in the document's
export settings, which native saves write, PDF security passwords
included, although the PDF settings themselves are saved without them.
Saved export presets kept them in the preferences the same way. Both now
drop openPassword and permissionsPassword wherever they appear in the
settings, keeping the other security choices.
2026-11-03 16:03:38 +07:00
bflatastic 6b30867eba Flatten Transparency: use is_multiple_of (clippy) 2026-11-03 15:57:57 +07:00
Dylan M. Taylor e505bccd5e Format with rustfmt 2026-11-03 15:57:52 +07:00
Dylan M. Taylor b032766a66 Flatten Transparency: group overlapping objects without comparing every open pair
The overlap grouping swept left to right comparing each object's bounds
with every box still open at its left edge, so many objects sharing a
horizontal extent (stacked in a column) cost a comparison per pair
before any of the flattener's geometry limits applied, and the grouping
could not be cancelled.

Open boxes are now kept in a tree by their tops that knows the lowest
bottom below each branch, so each box meets only the open boxes it
overlaps; an open box inside a later box of its group, ending no further
right, is closed early. The grouping checks for cancellation as it goes.
Groups are unchanged: a test compares them with every-pair grouping.
2026-11-03 15:57:52 +07:00
bflatastic 4ab16b7760 Clipboard: compare the PNG scale directly (clippy neg_cmp_op_on_partial_ord) 2026-11-03 15:57:51 +07:00
Dylan M. Taylor 15cd642be8 Clipboard: leave out the PNG of art too large to scale to 4096 pixels
Copy scaled its PNG down to fit 4096 pixels a side but never below 0.01
pixels a point, so art over 409,600 pt across produced a PNG far past
that side, up to the general raster export limit of a gigabyte of
pixels, on an ordinary copy. Such art now gets no PNG flavour.
2026-11-03 15:57:05 +07:00
JonRC 400a49666a Pending filters read the file they were made over
A filter over `currentfile` waits until it is first read, and it took
its data from whichever file was running by then. One made over the
program's own file and first read inside a file run with `cvx exec`
read that file instead, and one made over a file being run, first read
in a file that one runs, read the inner file. The pending stream now
records the file it was made over (a chained filter inherits it), and
`materialize` decodes from that file.
2026-11-03 15:57:03 +07:00
JonRC 6fc82a141f Fix #5321: currentfile in a file being run is that file
A file run with `cvx exec` was read whole and run as a separate
program, while `currentfile` stayed the outer EPS. The PLRM has
`currentfile` return the topmost file being run, positioned after the
last token read. Ghostscript's eps2write runs each page's content and
each Type 3 glyph from a SubFileDecode filter, and its `ID` reads the
inline image's samples through `currentfile`, so they were read from
the outer file and then ran as program.

A file being run is now read object by object from its own data, and
while it runs it is `currentfile`. A filter made over it waits to
read, as one over the program's own file does, so it starts where the
program is when the filter is first read.
2026-11-03 15:57:03 +07:00
JonRC d627a776de Cite the PostScript Language Reference by its public URL 2026-11-03 15:57:00 +07:00
JonRC 8fb394ca16 Fix #5318: known answers false for keys no dictionary holds
`known` raised a typecheck for any key that can't be a key here (an
array, a dictionary, a real with a fraction). The PLRM allows any
object but null as a key, and since `put` refuses such keys, no
dictionary holds one: `known` now answers false, and null still raises
the typecheck. Ghostscript's eps2write prolog looks each inline-image
value up in a dictionary of abbreviations, and an image with two
filters has an array there.
2026-11-03 15:57:00 +07:00
JonRC eca414044b Cite the PostScript Language Reference by its public URL 2026-11-03 15:56:58 +07:00
JonRC 097b013ea7 Fix #5316: StandardEncoding and ISOLatin1Encoding are Encoding resources
The standard encodings were names in systemdict only, and the Encoding
category was empty, so `/StandardEncoding /Encoding findresource`
failed with undefinedresource. The PLRM (3rd ed.) has both as
instances of the Encoding category, the same arrays as the names.
Ghostscript's eps2write prolog takes StandardEncoding that way for a
font whose encoding is a Differences dictionary with no BaseEncoding,
so files with its Type 3 text stopped there.
2026-11-03 15:56:58 +07:00
Dylan M. Taylor 2fec613353 Place: the place cursor reads its files within the roots it was loaded in
An agent confined to automation roots could load the place cursor, with
file.place.queue or tool.setOption, and the files were placed later, by
a click of the person at the keyboard, outside any roots. tool.setOption
checked a queued path but not files given inline, whose linked files (an
SVG's referenced images) were then read with the keyboard user's
unrestricted access.

The session now keeps the automation roots in force when the cursor's
queue is loaded, and both the engine's own placement and the desktop
app's background placement read the queued file within them. A queue
loaded outside any roots places as before.
2026-11-03 15:56:55 +07:00
Dylan M. Taylor a4aa1960cf Threaded text: a frame listed twice flows the story once
Reflow copied each listed frame's text into its thread's story, so a
document that listed one frame several times in a thread, or in several
threads, repeated that text in the story and wrote the grown story back
for the next thread to copy again, growing the text with every
repetition while the document opened. Reflow now keeps each frame at its
first place in the thread list only.
2026-11-03 15:56:53 +07:00
Dylan M. Taylor d9e3df23b1 Brushes: leave out an opacity mask whose root symbol draws a brushed stroke
The filter that keeps brush pieces from drawing a brush again walked a
mask's art but never looked at the mask's root itself. A symbol instance
at the root of a mask, whose symbol draws a stroke with the brush, then
survived and re-entered the brush while the mask was rendered, without
end. The mask goes now, as such an instance goes among the children.
2026-11-03 15:56:50 +07:00
Maxwell Wang 4a0a3701b0 Fix Simplified Chinese translation of Luminosity 2026-11-03 15:56:48 +07:00
Brandon Thomas 065a646799 Merge pull request #5280 from dotCooCoo/feat/symbol-nine-slice-guides-on-canvas
Symbols: 9-slice guides are shown and dragged on the canvas while editing a symbol
2026-11-03 00:19:44 -05:00
Brandon Thomas 2ef386c924 Merge pull request #5249 from dotCooCoo/feat/recolor-wheel-display
Recolor Artwork: the Edit tab shows the colors on a smooth wheel, a segmented wheel or as color bars
2026-11-03 00:19:40 -05:00
Brandon Thomas d232a29591 Merge pull request #5237 from dotCooCoo/feat/global-edit-shift-exclude
Global Edit: a Shift-click on a highlighted match leaves it out of the edit
2026-11-03 00:19:36 -05:00
Brandon Thomas 0b0a9c43c9 Merge pull request #5310 from storytold/fix/sec-affinity-field-index
Affinity import: index the fields of large objects and read four rectangle corners
2026-11-03 00:19:32 -05:00
Brandon Thomas 7f484253d2 Merge pull request #5304 from storytold/fix/sec-export-name-linear
Export for Screens: name patterns and taken names take linear work
2026-11-03 00:19:29 -05:00
Brandon Thomas 69fa98dc94 Merge pull request #5302 from storytold/fix/sec-affinity-master-copy-cost
Affinity import: count path segments and masks in master page copies; range-check vector masks
2026-11-03 00:19:26 -05:00