Commit Graph
8316 Commits
Author SHA1 Message Date
BFlat f10ab42c05 Merge pull request #5674 from dotCooCoo/fix/glyph-grapheme-probe
Glyphs: a character with a combining mark reports the glyph it is drawn with
2026-11-05 02:20:20 +07:00
dotCooCoo b0d1ca4419 Glyphs: a character with a combining mark reports the glyph it is drawn with
text.setGlyphAlternate looked for the character's glyph only in a
cluster as long as the character. A character followed by a combining
mark is shaped in one cluster with the mark, so the lookup found
nothing: under a substituting feature such as salt, `gid: null`
reported the default glyph instead of the one drawn, and a request for
the default glyph changed nothing.

The lookup now also takes a cluster that holds the character's
grapheme, and in a cluster of several glyphs takes the character's
default glyph or one of its alternates. Text that overflows its area
is shaped with the whole grapheme.
2026-11-05 01:56:16 +07:00
BFlat 18490471a1 Merge pull request #5672 from dotCooCoo/fix/perceptual-pdf-help-cmyk-stops
Gradient: Perceptual PDF help counts stops as written, CMYK documents included
2026-11-05 01:43:29 +07:00
dotCooCoo 584b9706cc Gradient: Perceptual PDF help counts stops as written, CMYK documents included
The method help of paint.editGradient and docs/mcp.md said a Perceptual
gradient with spot stops becomes an image in PDF unless every other stop
is paper white, CMYK or gray. PDF export checks each stop's color as it is
written: a CMYK document, or an export that converts colors to a CMYK
destination profile, writes RGB and Lab stops in CMYK, so the gradient
becomes a DeviceN shading. Both texts now say so, and a test covers the
CMYK document and CMYK destination cases.
2026-11-05 01:31:24 +07:00
BFlat 66664020b0 Merge pull request #5671 from dotCooCoo/fix/package-status-fonts-background
Package: name every font left out when no dialog is shown
2026-11-05 01:30:38 +07:00
dotCooCoo bfe81407bc Package: name every font left out when no dialog is shown
A package written in the background that finished while another dialog
was open showed no Package created dialog, but its status line still cut
the list of fonts left out at 500 bytes, so the fonts past the cut were
named nowhere. The status line now cuts the list only when the dialog is
shown.
2026-11-05 01:22:06 +07:00
BFlat 487808cea6 Merge pull request #5670 from dotCooCoo/fix/kerning-parenthesized-thousands
Character: Kerning refuses (1,000) instead of reading it as 1
2026-11-05 01:17:23 +07:00
BFlat 091bd79a4e Merge pull request #5669 from dotCooCoo/fix/cmd-space-tool-drag-cursor
Keep drawing cursor during mid-drag Cmd+Space
2026-11-05 01:17:06 +07:00
dotCooCoo d4f3ec6c96 Character: Kerning refuses (1,000) instead of reading it as 1
field_number read a decimal comma before it dropped Kerning's pair of
parentheses, the suffix, % and degrees, so the thousands check saw
(1,000) and 1,000% and read the comma as a decimal point: (1,000)
committed 1. The comma is now read after those are dropped, so
(1,000), 1,000% and 1,000 degrees are refused as 1,000 already is,
while (1,5) and 12,5% still read as 1.5 and 12.5.
2026-11-05 01:08:30 +07:00
dotCooCoo 7f449cc3c8 UI-1628: Keep drawing cursor during mid-drag Cmd+Space 2026-11-05 01:08:26 +07:00
BFlat cd9f4d5320 Merge pull request #5668 from dotCooCoo/fix/tabs-unchanged-ends-typing
Tabs: setting the stops a paragraph already has ends the typing session
2026-11-05 01:07:37 +07:00
BFlat 4a21936339 Merge pull request #5667 from storytold/about-credits-refit-inputs
About: refit credits tables on what they measure
2026-11-05 01:07:21 +07:00
dotCooCoo be8438c13d Tabs: setting the stops a paragraph already has ends the typing session
text.tabs.set and text.tabs.clear return without an edit when every
targeted paragraph already holds the stops. That path skipped the
settlement Session::edit does first, so a typing session in progress
stayed open. The command now ends it first, as the Variables commands
do: the typing is its own undo step whether or not the stops change.
2026-11-05 00:55:35 +07:00
FredAppsandClaude Opus 5.5 178e4a00df Refit credits tables on what they measure, not the fitted widths
Comparing the fitted widths missed the case it was meant for. Name is the
only growing column, so a longer name takes its extra width from the
spare room and the fit comes out the same: a dragged Name width stayed,
clipping the longer name.

It could also drop dragged widths by accident. The fit comes from the
available width inside the scroll area, which scrolling can nudge, so
scrolling a widened table could reset it.

The table now compares the natural widths and the clip rect's width,
which scrolling does not move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 00:55:32 +07:00
BFlat d7690eba02 Merge pull request #5665 from d8abyte-dk/plugins-compound-guide-filter-and-color-profile
Plug-ins: compound guides aren't filter inputs; colors follow the working RGB space
2026-11-05 00:54:38 +07:00
d8abyte-dkandClaude Opus 5.5 ad93abd484 Plug-ins: compound guides aren't filter inputs; colors follow the working RGB space
A compound path a filter made a guide was still given to later filters, which
could change or delete it; compound paths of guide paths are now left out as
guide paths are. Hex colors and the color button's choice are display sRGB and
are now converted into the working RGB space, so they show as given whatever
the working profile; a color default is kept as written and read when used.

Follow-up to #5630.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 00:42:23 +07:00
BFlat a0ef97af40 Merge pull request #5664 from Janiz-zzz/fi-update-20261103
i18n(fi): translate the 5 labels Finnish lacks
2026-11-05 00:41:17 +07:00
Janiz-zzzandClaude Opus 5.5 28a46e96c7 i18n(fi): translate the 5 labels Finnish lacks
Check for Updates and its window, the panel-layout reset notice and the
Image Trace progress lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 00:32:31 +07:00
BFlat 7bb95a901a Merge pull request #5662 from ruchirguitar/fix/5548-plain-click-keeps-hidden
Select by Artboards dialog: a plain click keeps artboards the search hides
2026-11-05 00:24:59 +07:00
ruchirguitarandClaude Opus 5.5 7f3d2b6406 Select by Artboards dialog: a plain click keeps artboards the search hides (#5548)
A plain click chose only the clicked row and dropped artboards chosen
but hidden by the search. It now replaces only the rows shown, as None
and Select All already do, so hidden rows keep their state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 00:16:17 +07:00
BFlat 020275520c Merge pull request #5659 from dotCooCoo/fix/color-mode-rgb-spot-test
Tests: an RGB spot color converts with Document Color Mode and stays spot
2026-11-05 00:11:04 +07:00
BFlat c85b41a9dc Merge pull request #5657 from dotCooCoo/fix/glyph-alternates-default-and-graphemes
Glyphs: the default glyph can be chosen back under a substituting feature
2026-11-05 00:10:49 +07:00
dotCooCoo f026ebe686 Tests: an RGB spot color converts with Document Color Mode and stays spot
A spot swatch defined in RGB keeps its spot flag and its own plate when
the document changes to CMYK, and its definition converts like any other
swatch: a fill that uses it and a 40% tint stroke take the converted
color. The Lab spot test's comment now says it covers a Lab definition.
2026-11-04 23:58:58 +07:00
dotCooCoo fae49d31fd Glyphs: the default glyph can be chosen back under a substituting feature
Follows #5442.

- text.setGlyphAlternate keeps the default glyph as a choice when a
  feature of the character's style (salt, a stylistic set) draws another
  glyph for it, so the default glyph is drawn. A character that is not
  laid out (overflowing text) is shaped alone in its style to decide.
  gid: null reports the glyph the style draws.
- The Glyphs panel's alternates grid shows the default glyph first when
  the font does not list it, so a chosen alternate can be put back.
- A test for a chosen character that starts a longer grapheme (f with a
  combining acute), which is not split from its mark.
- The alternates tests in the engine hold the shared font lock while
  they add fonts to the global font database.
2026-11-04 23:58:54 +07:00
BFlat 285ce2d2e0 Merge pull request #5656 from dotCooCoo/fix/png-reader-growth-room
Images: a PNG read a row at a time counts the reader's buffer while it grows
2026-11-04 23:58:04 +07:00
BFlat 90f5e5714b Merge pull request #5655 from dotCooCoo/fix/control-bar-inline-fields-fit
Control bar: the inline X, Y, W and H fields show only when they fit
2026-11-04 23:57:48 +07:00
BFlat 1463f86ec4 Merge pull request #5652 from dotCooCoo/fix/add-new-item-comment
Appearance: Add New Fill and Add New Stroke comment names the paint they take
2026-11-04 23:57:30 +07:00
BFlat 488d37f3ab Merge pull request #5653 from dotCooCoo/fix/nativemenu-font-scan-race
Tests: native menu tests wait for the installed fonts' scan
2026-11-04 23:57:15 +07:00
dotCooCoo 0a65178696 Images: a PNG read a row at a time counts the reader's buffer while it grows
The png reader's stream buffer grows by doubling its reservation, and
while it grows the old reservation and the new one are both allocated.
The room estimate counted the buffer twice, for the doubled
reservation, but not the moment both are held, so a wide PNG could be
approved for a row-at-a-time decode with less room than reading it
takes. The estimate now counts the stream buffer three times.
2026-11-04 23:45:05 +07:00
dotCooCoo 2395a390b5 Control bar: the inline X, Y, W and H fields show only when they fit
The bar decided to show the inline fields against a fixed 440-point
width, smaller than the room the fields take, so just above that width
the H field ran past the bar's right margin and was clipped. The bar
now adds up the room from the values that draw the fields: the label
widths in the current language, the four 80-point fields, the W/H link
and the item spacing ahead of each. With less room it shows the
Transform link alone, as before.
2026-11-04 23:45:02 +07:00
dotCooCoo a9eae3a333 Appearance: Add New Fill and Add New Stroke comment names the paint they take
The comment in add_item said a new fill or stroke is a copy of the top
one. The code takes only the top item's paint, and for a stroke its
weight. The comment now says so, as the params text does.
2026-11-04 23:44:58 +07:00
dotCooCoo 539195d68b Tests: native menu tests wait for the installed fonts' scan
VectorcraftApp::new starts the installed fonts' scan in the background,
and Type > Font lists only the loaded fonts until it ends (#5483). When
the scan ended between two reads of the menus, the second read had the
installed families too, and every_in_window_item_is_in_the_mac_menu_bar_once
and documents_and_selections_change_state_not_structure failed. The
tests' app() helper now waits for the scan after making the app.
2026-11-04 23:44:55 +07:00
BFlat 1c8772d670 Merge pull request #5651 from sadkotheguest/fix/space-during-drawing-drag
Canvas: Space during a tool's drag keeps the tool's cursor
2026-11-04 23:43:08 +07:00
BFlat c647c0228d Merge pull request #5650 from storytold/about-credits-column-fixes
About: let every credits column be dragged and refit changed tables
2026-11-04 23:42:50 +07:00
BFlat 83cb464979 Merge pull request #5649 from dotCooCoo/fix/mcp-doc-byte-offset-commands
Docs: the byte-offset rule names only commands that take a range
2026-11-04 23:42:30 +07:00
Alex d2627b92b7 contributors: add my name for the About window 2026-11-04 23:24:59 +07:00
Alex cd50091212 Canvas: Space during a tool's drag keeps the tool's cursor
Space pressed after a tool's press has begun (Pencil, a brush, a shape, a
selection drag) switched the cursor to the hand but panned nothing: the pan
starts only with Space down at the press. It is ignored now, so the cursor keeps
the tool's own.

Test: space_during_a_pencil_drag_keeps_the_pencil_cursor (fails without the fix:
Grab instead of the pencil's crosshair).
2026-11-04 23:24:59 +07:00
FredAppsandClaude Opus 5.5 380366d3d2 Let every credits column be dragged, and refit changed tables
The last column was egui's remainder column, which has no drag handle, so
it could only be resized from the edge before it. It is now an ordinary
column with its own handle.

A table keeps its column widths, so switching to a longer name left the
Name column at its old width and clipped the text. The table now goes
back to the opening fit whenever that fit changes: a longer widest cell
or a resized window. Dragged widths are dropped at that point.

fit_widths could overflow the room when one column hit the minimum,
because the other columns did not take up its share. Columns now give
way in proportion to their width above the minimum.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 23:24:56 +07:00
dotCooCoo 40569eb267 Docs: the byte-offset rule names only commands that take a range
The type.size.* commands, type.resetTracking and type.resetHorizontalScale
do not take `id`, `start` or `end`, so they refuse those keys as unknown
parameters. The list in docs/mcp.md now leaves them out.
2026-11-04 23:24:54 +07:00
BFlat a3ce20b88f Merge pull request #5633 from ruchirguitar/feat/5525-select-by-artboards
Select by Artboards: select objects overlapping, inside or outside chosen artboards (#5525, #5548, #5549)
2026-11-04 23:23:04 +07:00
BFlat 4ac625b3e5 Merge pull request #5645 from dotCooCoo/fix/pxr-tile-pointer-table
File formats: Pixar tile pointers into the header or tile table are refused
2026-11-04 23:22:29 +07:00
BFlat 48f91f0650 Merge pull request #5644 from dotCooCoo/fix/linux-dialog-filters-any-case
File dialogs: Open and Place list files with capitalized extensions on Linux
2026-11-04 23:22:01 +07:00
BFlat 17eb727642 Merge pull request #5643 from dotCooCoo/fix/direct-cursor-long-path
Geometry: the nearest point on a long path skips segments whose box is farther than the best found
2026-11-04 23:21:45 +07:00
BFlat f488cffa9e Merge pull request #5640 from dotCooCoo/fix/tcy-settings-reject-bad-values
Type: Tate-chu-yoko Settings refuses a value that is not a length
2026-11-04 23:21:28 +07:00
ruchirguitarandClaude Opus 5.5 f140301aaa Select by Artboards dialog: None keeps hidden rows; translate its strings (#5548)
None now clears only the rows the search shows, as Select All adds only
those, so artboards hidden by the search stay chosen. The count reads
"Chosen: {n} of {total}". The dialog's new strings have rows in all 26
catalogs, written from their meaning with each catalog's own terms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:57:59 +07:00
ruchirguitarandClaude Opus 5.5 6e1c1c9377 Select by Artboards: test that a symbol instance is measured by its art (#5525)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:57:59 +07:00
ruchirguitarandClaude Opus 5.5 471cf3b81b Select by Artboards dialog: double-click a row to fit its artboard (#5549)
A double-click makes the row's artboard active and fits it in the
window (view.goToArtboard, as the Artboards panel does), keeping the
dialog open and the artboards chosen before it. Parity docs record the
Selection Tools add-on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:57:59 +07:00
ruchirguitarandClaude Opus 5.5 3a50b20b95 Select by Artboards dialog: artboard list, search and multi-select (#5548)
Object › Plug-ins › Selection Tools › Select by Artboards… lists each
artboard's number, name and size, filters by name, chooses rows with
click, Shift-click and Cmd/Ctrl-click, and runs addon.select.byArtboards
on OK.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:57:57 +07:00
ruchirguitarandClaude Opus 5.5 7e016a0bcc Select by Artboards: select objects overlapping, inside or outside several artboards (#5525)
addon.select.byArtboards {artboards, relation} in a new Selection Tools
add-on. Overlapping is All on Active Artboard's test, now one shared
helper (select::on_artboard); Fully inside is within one artboard, edges
included; Fully outside is on none. Objects are those Select All takes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:57:57 +07:00
dotCooCoo aee5671734 File formats: Pixar tile pointers into the header or tile table are refused
A nonzero tile pointer below the end of the tile pointer table made the reader decode header or table bytes as pixels. The table end is now computed with checked arithmetic, and such a pointer is refused as damaged image data.
2026-11-04 22:57:53 +07:00