Commit Graph
11784 Commits
Author SHA1 Message Date
BFlat a15a4abc5c Merge pull request #6751 from dotCooCoo/feat/eps-save-use-artboards
EPS: Save As shows Use Artboards, off by default, and the box fits all visible art
2026-11-13 00:51:58 +07:00
BFlat c62d1d8713 Merge pull request #6908 from dotCooCoo/fix/actions-toggle-limits
Actions: recording, step exclusions and set edits keep sets that Load Actions reads
2026-11-13 00:50:37 +07:00
BFlat a4357a7ad5 Merge pull request #6915 from dotCooCoo/fix/assign-profile-keeps-color-settings
Color management: assigning the working profiles keeps the active color settings
2026-11-13 00:50:24 +07:00
BFlat 30fbb81778 Merge pull request #6918 from dotCooCoo/fix/blend-steps-interpolate-pen-data
Blend: steps of brushed strokes interpolate the pen pressure, tilt and angles
2026-11-13 00:50:15 +07:00
BFlat 8c44d414cd Merge pull request #6922 from dotCooCoo/fix/file-format-editing-data-paragraph
Docs: the file-format doc's editing-copy paragraph and summary rows appear once
2026-11-13 00:50:05 +07:00
BFlat f63827478c Merge pull request #6892 from dotCooCoo/fix/trace-gray-photos-smoothed
Image Trace: gray photos are smoothed before tracing, as color photos are
2026-11-13 00:49:52 +07:00
BFlat 80359e415f Merge pull request #6874 from dotCooCoo/fix/script-failed-run-keeps-no-place
Scripts: a named engine keeps no source map for a run whose script does not compile
2026-11-13 00:49:38 +07:00
BFlat 77d8113073 Merge pull request #6924 from dotCooCoo/fix/followup-5139
.ai import: cite the sources of the Distort & Transform effect keys
2026-11-13 00:49:28 +07:00
BFlat 8bf4de0a5a Merge pull request #6919 from dotCooCoo/feat/bbox-follows-move-and-draw
Selection: Show Bounding Box While Moving and Drawing shows the box during moves and shape drawing
2026-11-13 00:49:17 +07:00
dotCooCoo 2d46dcc533 Actions: a deleted recording action does not limit recorded commands
When the action New Action made for the recording in progress is deleted,
Stop Playing/Recording keeps none of the recorded steps. The step and
file limits measured a new action in the original set instead, so a
recorded command could be refused while the set's file was near 8 MiB.
The recording now has no target in that case, and no limit applies.
2026-11-12 08:59:08 -08:00
dotCooCoo 5a7d445807 Merge main into fix/script-failed-run-keeps-no-place 2026-11-12 08:55:15 -08:00
BFlat 2304b38f19 Merge pull request #6907 from dotCooCoo/feat/art-brush-width-pen-pose
Brushes: Art Brush Options' Width can follow the pen's tilt, bearing and rotation
2026-11-12 23:54:29 +07:00
BFlat 3fed6e3380 Merge pull request #6911 from dotCooCoo/fix/canvas-zoom-ignores-ui-scaling
View: the art keeps its size at a zoom whatever the UI Scaling
2026-11-12 23:54:20 +07:00
BFlat dc68ae950c Merge pull request #6912 from dotCooCoo/fix/new-document-side-limit
New Document: file.new and artboard.new take the same largest artboard side
2026-11-12 23:54:11 +07:00
BFlat 6a695a01ec Merge pull request #6847 from dotCooCoo/feat/weed-box-and-lines
Cutting Tools: Weed Box and Lines adds a weed box and weeding lines around art
2026-11-12 23:54:01 +07:00
BFlat edfc6c6588 Merge pull request #6891 from dotCooCoo/fix/set-corners-shortcut
Keyboard Shortcuts: a command that a menu bar item runs can take a shortcut, Set Corners… among them
2026-11-12 23:53:51 +07:00
dotCooCoo 0a13aca6ee Docs: gray photos need an eight-color error over 6 levels to count as continuous tone 2026-11-12 08:53:48 -08:00
BFlat a6aac579c0 Merge pull request #6904 from dotCooCoo/feat/ai-editing-data-s6c
.ai save: the editing copy keeps brushes and brushed paths
2026-11-12 23:53:38 +07:00
BFlat ab50f06909 Merge pull request #6914 from dotCooCoo/fix/kept-tiles-test-flake
Render tests: the kept-tile decode-failure test passes while other tests add fonts
2026-11-12 23:53:22 +07:00
BFlat e618783377 Merge pull request #6084 from Taha-Mahmoodi/feat/glyph-alternates
Glyphs: alternates keep the word joined (feature values, one-piece shaping, unencoded glyphs)
2026-11-12 23:53:13 +07:00
BFlat 1c50241ddd Merge pull request #6702 from danngreen/fix/mac-cursor-after-move
macOS: the canvas cursor stays after the pointer moves (#6362)
2026-11-12 23:53:03 +07:00
BFlat 5f3c7f5425 Merge pull request #6906 from ruchirguitar/fix/pdf-indic-text-5235
PDF import: Indic type that would not draw as the file does keeps the file's glyphs (#5235)
2026-11-12 23:52:49 +07:00
dotCooCoo 0ae706c592 Docs: the file-format doc's editing-copy paragraph and summary rows appear once
docs/file-format-parity.md held 36 copies of the paragraph on the
editing copy of a file. #6202 and #6249 each added a combined copy
without removing the copies it replaced, so the count went from 34 to
35 and then to 36. The section now holds one copy: #6249's combined
copy, with the Align to Path distance clause that seven of the other
copies carry from #6247. Every other clause of the removed copies is in
the kept one, word for word or in the newer, longer form another copy
wrote. The older Align to Path clause, with its measurements for one
font at 24 pt, is removed because #6247's wording replaces it. The
paragraph now starts with a capital letter.

The summary table also repeated its "Formats opened or placed" and
"Formats saved (Save As)" rows. The older row of each is removed: the
one that still lists HEIC/HEIF as missing, and the one that lists fewer
contents of the editing copy that `.ai` saves write.
2026-11-12 08:50:41 -08:00
dotCooCoo 5006ba5a2e Merge main into feat/eps-save-use-artboards 2026-11-12 08:45:42 -08:00
dotCooCoo 1bb6582194 .ai import: cite the sources of the Distort & Transform effect keys
The doc comments of the Transform, Free Distort, Tweak and Zig Zag
readers, and the Pucker & Bloat and Twist arms, now name the public
pages that list each effect's dictionary keys. No code changes.
2026-11-12 08:38:10 -08:00
dotCooCoo a17acb852f Selection: Show Bounding Box While Moving and Drawing shows the box during moves and shape drawing
The new General preference Show Bounding Box While Moving and Drawing
(`boundingBoxWhileMovingAndDrawing`, off by default) keeps the bounding
box and its handles visible during two kinds of drag, with View › Show
Bounding Box on. While a drag moves the selection (a Selection tool
move, an Alt-drag copy, or a shape tool's move by the center point),
the box is drawn where the drag has moved the selection. The box is
measured once when the drag starts and offset by each step's move.
While the Rectangle, Rounded Rectangle, Ellipse, Polygon and Star tools
draw a shape, the box is drawn around the shape. A rotation and a
widget drag still hide the box until the release. The Line Segment
tool, the Pen, the Pencil and the Paintbrush draw no box.

With the preference off, the box hides during a move (#737, for #712)
and while a shape is drawn (#5839), as before. A Selection tool move
with Real-time Drawing off still moves the box with the pointer, and a
shape tool's move by the center point hides it in both modes.

With Real-time Drawing off, the box of a shape being drawn is measured
from the pending preview, in the color of the layer the shape goes on.
A shape being drawn shows no box until a preview step has succeeded,
so a failed preview does not show the box of the selection from before
the drag. The preference's label has a row in every catalog.

Session::deferred_move() is replaced by Session::move_drag_box(), which
returns the moved box, and Session::deferred_transform_box() now also
returns the layer color of the box.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 08:28:21 -08:00
dotCooCoo 1bf8bce083 Actions: Begin Recording params name the command that passes a limit only as it runs
ui.action.record's params text now says that a recorded command whose
step passes a limit only from the values it adds as it runs keeps its
edit and result, that later recorded commands are an error and do not
run, and that ui.action.stop leaves its step out.

crates/mcp/src/ui_catalog.rs now matches the desktop table again
(cargo xtask ui-commands --check), including the action-limit params
texts of the earlier commit.
2026-11-12 08:27:21 -08:00
dotCooCoo a5541ab42a Blend: steps of brushed strokes interpolate the pen pressure, tilt and angles
A blend between two strokes drawn with a pressure-sensitive brush gave
every step the pen recording of the nearer key, so the brush jumped at
the middle step. The steps now interpolate the pressure, tilt, bearing
and rotation at every position either key has a sample. A key without a
recording counts as half pressure, half tilt and 0 degrees, as brushes
read it. Angles turn the shorter way round, and steps and whole turns in
a recording stay in the steps. Different brushes still switch halfway.
2026-11-12 08:26:32 -08:00
BFlat 932830283d Merge pull request #6841 from dotCooCoo/feat/docinfo-spot-color-objects
Document Info: Spot Color Objects lists the objects that use spot colors
2026-11-12 23:10:59 +07:00
BFlat b85f546ace Merge pull request #6893 from dotCooCoo/test/command-sweep-path-keys
Plug-ins: `diffPath` is a file key and Slice Options' `url` is not; the command sweep uses these keys
2026-11-12 23:10:48 +07:00
BFlat fbcf7e9f5f Merge pull request #6879 from dotCooCoo/fix/palette-opens-menu-dialog
Palette: a pick opens the dialog its menu item opens
2026-11-12 23:10:36 +07:00
BFlat cc6509827d Merge pull request #6878 from dotCooCoo/fix/opacity-mask-follows-reshape
Opacity masks: linked masks follow group effects, the Free Transform distort and envelopes
2026-11-12 23:10:24 +07:00
BFlat 0cb73d0d66 Merge pull request #6845 from dotCooCoo/feat/linux-screen-color-portal
Color: Sample Color from Screen works on Linux through the desktop portal
2026-11-12 23:10:13 +07:00
BFlat 3df161a972 Merge pull request #6903 from dotCooCoo/feat/gradient-repeat
Gradients: repeat or reflect a gradient's stops a set number of times
2026-11-12 23:10:02 +07:00
BFlat 12d72b3eb0 Merge pull request #6901 from dotCooCoo/fix/trace-smooth-area-contours
Image Trace: band borders in smooth areas follow the image's contours
2026-11-12 23:09:43 +07:00
BFlat 4920df33c0 Merge pull request #6885 from dotCooCoo/fix/screens-preset-folder-background
Export for Screens: an export into a preset's folder runs in the background
2026-11-12 23:09:16 +07:00
BFlat 39045f8542 Merge pull request #6778 from dotCooCoo/fix/warp-styles-map
Warp: bend each style as one Bézier patch, and keep saved warps' look
2026-11-12 23:09:04 +07:00
BFlat da3affd8bf Merge pull request #6897 from dotCooCoo/fix/number-wheel-smoothing-tail
Number fields: the rest of a wheel notch a field took no longer scrolls the panel
2026-11-12 23:08:54 +07:00
BFlat 3a1426eff3 Merge pull request #6898 from dotCooCoo/feat/justify-cluster-gap
Type: letter spacing and Full Justify keep shaped clusters together
2026-11-12 23:08:43 +07:00
BFlat a38903aa72 Merge pull request #6900 from dotCooCoo/feat/global-edit-highlight-similar
Global Edit: selecting one object highlights the similar objects before the start
2026-11-12 23:08:32 +07:00
BFlat f43d00aa11 Merge pull request #6902 from dotCooCoo/fix/eps-named-cid-show-operators
EPS import: charpath, cshow, kshow and glyphshow read named CIDFont type by its CMap
2026-11-12 23:08:23 +07:00
dotCooCoo 71851c251f Render tests: the kept-tile decode-failure test passes while other tests add fonts
pattern::tests::kept_tiles_count_the_images_they_could_not_decode
draws a pattern whose art is an image three times and expects one tile
to be rasterized. A tile of art with an image is kept only while
FontDb::global().generation() is the one it was drawn at (Deps::current
in pattern.rs). The render tests that hold adding_fonts() add fonts,
which increases it (tests/fontchange.rs, tests/typeedges.rs,
tests/alternate.rs, tests/colrglyphs.rs and tests/bitmapglyphs.rs).
When one of them added a font between the frames, the next frame drew
the tile again and the test failed with left 2 or 3, right 1. Run with
the tests in tests/fontchange.rs and tests/typeedges.rs, it failed in
23 of 30 runs on main.

The test now holds fonts_steady() and takes its counts from
with_fonts_unchanged(), as the other render tests that count kept work
do. Each run builds a new document, so its first frame does not find a
tile from an earlier run. Run with the same tests, it passed in all 30
runs.
2026-11-12 08:02:32 -08:00
dotCooCoo e242eeb609 Actions: progress doc names the command that passes a limit only as it runs
A recorded command whose step passes a limit only from the values it adds
as it runs keeps its edit. The status bar names the limit, later recorded
commands do not run, and Stop Playing/Recording leaves its step out.
2026-11-12 08:01:39 -08:00
dotCooCoo d3b18465f9 New Document: file.new and artboard.new take the same largest artboard side
file.new refused a side over 163,830 pt, while artboard.new took larger
artboards. Both now take each side more than 0 and at most 3,999,856 pt:
the 4,000,000 pt the canvas reaches from the origin, less a 72 pt bleed
on both sides. A side outside that range is refused with an error that
names the limit in points and, when the document's units are not points,
in those units, rounded down so the value shown is accepted.

artboard.new now refuses a supplied width or height of 0 or less instead
of making a 1 pt side, and refuses a size taken from a larger artboard.
Saved and Recent presets are read with sides up to the new limit.

Follows #6643.
2026-11-12 07:45:32 -08:00
dotCooCoo fc8d4472e6 Color management: assigning the working profiles keeps the active color settings
edit.assignProfile replaced the active color context whenever it tagged a
document, even when the profiles it assigned were the working spaces
already in use. The new context has the same settings, but renderers key
their cached effect images on it, so every open document was redrawn and
every cached blur, shadow or glow image was drawn again.

The command now sets the active settings, and raises the open documents'
revisions so they redraw, only when the working spaces it assigns differ
from the active ones, as edit.colorSettings already does.

This also fixes an intermittent failure of the test
canvas::tests::a_drag_over_a_wide_blur_draws_the_blur_from_the_still_frame.
The Document Setup tests assign the working profiles while it runs, and
its drag frames then drew the blur again instead of reusing the still
frame's image.
2026-11-12 07:34:57 -08:00
ruchirguitar b732d4f4b2 Merge remote-tracking branch 'upstream/main' into fix/pdf-indic-text-5235
# Conflicts:
#	docs/file-format-parity.md
2026-11-12 21:01:38 +05:30
dotCooCoo 04fd1b127b Brushes: Art Brush Options' Width can follow the pen's tilt, bearing and rotation
The Width menu now offers Tilt, Bearing and Rotation beside Fixed and
Pressure, each with the second width. Tilt goes from Width with the pen
lying flat to the second width upright; Bearing and Rotation go from
Width at -180 degrees to the second width at 180 degrees, as Scatter
Brush Options' modes do. A stroke drawn without that input is half way
between the two widths. brush.options takes width_mode tilt, bearing
or rotation.
2026-11-12 07:28:26 -08:00
ruchirguitar f18fb4e92d PDF import: Indic type that would not draw as the file does keeps the file's glyphs (#5235)
Gujarati text from a PDF came in jumbled even with its fonts installed:

- A glyph with no advance (a vowel sign or anusvara set over its letter)
  was taken for vertical type and opened as an object of its own, which
  type then drew on a dotted circle. In a font the file writes
  horizontally it now stays on its line.
- A line read glyph by glyph is not always the text that was set: the
  file draws a vowel sign before the consonant it follows, and may not
  name a conjunct. A line with characters of U+0900 to U+0DFF is now set
  again and its glyphs compared with the ink the file drew; when they
  differ the line keeps the file's glyphs as outlines, with a note.

Tests: crates/pdf/src/tests/reshaped.rs (two fail without the change).
2026-11-12 20:56:16 +05:30
Taha-Mahmoodi 2d62c35d69 Merge remote-tracking branch 'origin/main' into feat/glyph-alternates
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-12 19:55:05 +04:30
dotCooCoo 5d40a1c6d0 View: the art keeps its size at a zoom whatever the UI Scaling
Preferences > User Interface > UI Scaling sets egui's zoom factor, and the
canvas mapped one document point to one of the interface's points at
100%. A document point then covered UI Scaling times as many device pixels,
so the art grew and shrank with the interface.

The canvas now maps the document at the view's zoom divided by the UI
zoom (View::screen_zoom, Xf::at). The rendered frame, the pointer, rulers,
grids, Fit and Actual Size, pan, scroll, zoom and turn about a point, the
Zoom tool's marquee, Pixel Preview's check, tiled panes, the Navigator's
view box and the tools' tolerances use that mapping. The zoom value means
the same at every UI Scaling, and the interface still follows UI Scaling.
fit_zoom, zoom_about, rotate_about, pan_pixels and scroll_by take the UI
zoom, and Xf::new is now test-only.

Found while looking into a report by bortek about the art's size at 100%.
2026-11-12 07:24:43 -08:00