Commit Graph
6179 Commits
Author SHA1 Message Date
BFlat eead185a75 Merge pull request #4403 from dotCooCoo/fix/kerning-tracking-catalog-terms
i18n: Character panel Kerning and Tracking terms agree in each catalog
2026-10-29 10:58:55 +07:00
BFlat 47e0fa2a41 Merge pull request #4395 from dotCooCoo/fix/issue-3235
Part of #3235: PDF import keeps the spot swatch of a DeviceN color that mixes inks
2026-10-29 10:58:33 +07:00
BFlat 4072363c22 Merge pull request #4394 from dotCooCoo/feat/export-pixel-width-height
Export: document.export takes a pixel width or height for raster files
2026-10-29 10:58:15 +07:00
BFlat b5f126a464 Merge pull request #4393 from dotCooCoo/feat/screens-zip-deflates
Export for Screens: a ZIP export deflates its files
2026-10-29 10:57:59 +07:00
BFlat daffac2c2d Merge pull request #4401 from dotCooCoo/feat/layers-alt-click-selects-layer
Layers: Alt-click on a layer name selects the layer's art
2026-10-29 10:57:39 +07:00
BFlat 59ba74067b Merge pull request #4400 from dotCooCoo/feat/gradient-reset-click
Gradient: Cmd/Ctrl-click on the Gradient Fill box or the Gradient button resets to White, Black
2026-10-29 10:57:18 +07:00
BFlat a04c068ae0 Merge pull request #4399 from dotCooCoo/feat/color-bar-complement-inverse-clicks
Color panel: Cmd/Ctrl-click and Cmd/Ctrl+Shift-click on the spectrum apply Complement and Invert
2026-10-29 10:56:40 +07:00
BFlat 372809c891 Merge pull request #4398 from dotCooCoo/fix/issue-4326
Part of #4326: a drag whose mouse-up was lost ends once macOS reports no button down
2026-10-29 10:56:17 +07:00
BFlat f96144c784 Merge pull request #4388 from dotCooCoo/feat/scissors-alt-add-anchor
Scissors: Alt held switches to the Add Anchor Point tool
2026-10-29 10:55:56 +07:00
BFlat fddec26707 Merge pull request #4387 from dotCooCoo/feat/type-tool-modifier-switch
Type tools: Shift switches between horizontal and vertical, and Alt switches between area and path type
2026-10-29 10:55:35 +07:00
BFlat a101ebe44d Merge pull request #4386 from dotCooCoo/feat/units-cycle-shortcut
Document: Cmd+Alt+Shift+U switches to the next unit of measurement
2026-10-29 10:55:09 +07:00
BFlat 301caf5851 Merge pull request #4385 from dotCooCoo/feat/width-tool-escape-deselects
Width tool: Escape deselects the selected width points
2026-10-29 10:54:45 +07:00
BFlat ef815a00d3 Merge pull request #4384 from dotCooCoo/feat/arc-tool-drag-keys
Arc tool: C, F and Up/Down change the arc while it is dragged out
2026-10-29 10:54:11 +07:00
BFlat c4dda01263 Merge pull request #4380 from dotCooCoo/feat/blob-brush-alt-smooth
Blob Brush: Alt switches to the Smooth tool while it is held
2026-10-29 10:53:57 +07:00
BFlat 63aa7fc38c Merge pull request #4376 from dotCooCoo/fix/pencil-alt-smooth-radius
Pencil: Alt smooths as far from the drag as the Smooth tool does
2026-10-29 10:53:40 +07:00
BFlat 575b3027f6 Merge pull request #4375 from dotCooCoo/fix/shape-builder-merge-fewer-passes
Shape Builder: a merge walks the arrangement once per batch of faces
2026-10-29 10:53:21 +07:00
BFlat 1da191ae76 Merge pull request #4367 from Silvertree2010/fix/4262-resize-bug-locked-ratio-scaling
Fix Shift-scaling a corner handle along a single axis
2026-10-29 10:53:00 +07:00
BFlat 1fb627749a Merge pull request #4363 from dotCooCoo/fix/stroke-weight-steps-off-list
Stroke Weight: a step from a weight between the presets goes to the next preset
2026-10-29 10:52:37 +07:00
BFlat 489790826d Merge pull request #4361 from dotCooCoo/fix/curvature-delete-reshapes
Curvature: deleting a point re-curves the path through the remaining points
2026-10-29 10:52:18 +07:00
BFlat 12f29b40f1 Merge pull request #4335 from ham9zah/test/properties-reference-point
Properties: test that typed transforms turn about the reference point (#4285)
2026-10-29 10:51:49 +07:00
BFlat 5464dc644c Merge pull request #4331 from Silvertree2010/fix/4206-bug-gradient-mesh-node-level-tra
Apply Transparency opacity to the clicked gradient mesh point
2026-10-29 10:51:23 +07:00
BFlat 340b8644b7 Merge pull request #4433 from el-j/fix/dxf-circular-sliver-4151
Fix #4151: DXF export: verify closed circular subpaths complete a full turn without reversing
2026-10-29 10:50:36 +07:00
BFlat fe45b77d69 Merge pull request #4425 from dotCooCoo/fix/cursor-idle-test-timing
Tests: the idle cursor test renders every frame on the test thread
2026-10-29 10:49:15 +07:00
BFlat 9309b2f6ed Merge pull request #4408 from dotCooCoo/fix/appearance-add-keys-empty-ids
Appearance: Add New Fill and Add New Stroke with an empty ids list run nothing without a selection
2026-10-29 10:48:07 +07:00
BFlat b095504986 Merge pull request #4316 from ham9zah/fix/appearance-mixed-fill-chip
Appearance: a mixed selection's object chip shows "?" when the fills differ
2026-10-29 10:47:43 +07:00
BFlat c40e641421 Merge pull request #4325 from Hassan1305/fix-4237-add-anchor-select
Fix #4237: Add Anchor Point selects the path it adds to
2026-10-29 10:47:20 +07:00
BFlat 9824a6459e Merge pull request #4328 from Silvertree2010/fix/4306-expand-does-not-work-as-intended
Expand the stroke of stroked type into filled outlines
2026-10-29 10:46:45 +07:00
BFlat 8e93bcb1bf Merge pull request #4362 from dotCooCoo/fix/issue-3773
Fix #3773: Offset Path offsets a path whose ends meet as a closed shape
2026-10-29 10:46:22 +07:00
BFlat 9392c872f5 Merge pull request #4501 from Silvertree2010/fix/4495-bug-eraser-tool-breaks-compound
Keep compound path holes when using the Eraser and Knife
2026-10-29 10:45:59 +07:00
BFlat cd64f6d14a Merge pull request #4512 from el-j/perf/canvas-upload-buffer-4504
perf(ui-egui): eliminate zero-filling allocation on canvas texture upload in color_image (#4504)
2026-10-29 10:43:58 +07:00
BFlat 4251afb7fa Merge pull request #4483 from dotCooCoo/fix/saturate-requires-intensity
Edit Colors: Saturate without an intensity is an error instead of a pass at 0
2026-10-29 10:43:31 +07:00
BFlat 1f452229cc Merge pull request #4429 from dotCooCoo/fix/layer-commands-refuse-text-booleans
Layers: the Layers panel's commands refuse a boolean given as text
2026-10-29 10:43:08 +07:00
BFlat e547aac113 Merge pull request #4448 from dotCooCoo/fix/artboard-commands-refuse-bad-numbers-and-names
Artboards: artboard.new and artboard.setProps refuse a number or name of the wrong type
2026-10-29 10:42:46 +07:00
BFlat ccf274b0c3 Merge pull request #4315 from Silvertree2010/fix/h3006-shape-rectangulargrid-and-shape
Accept whole-number floats as grid divider counts
2026-10-29 10:42:10 +07:00
BFlat 899b76ec74 Merge pull request #4436 from el-j/fix/svg-nested-images-node-cap-3564
Fix #3564: SVG import: cap converted objects and nested images
2026-10-29 10:41:46 +07:00
BFlat eb0a59a75f Merge pull request #4513 from mockydevs/fix/3579-nested-blend-memory
Blend: nested blends keep to a step budget (#3579)
2026-10-29 10:41:18 +07:00
dotCooCoo 77b2391f7a i18n: Reset Tracking and Kerning check matches each term once
A Tracking term that is part of the Kerning term no longer counts as
present when only the Kerning term appears in the row.
2026-10-29 10:10:58 +07:00
dotCooCoo ef8d178441 Part of #3235: PDF import keeps the spot swatch of an ink a shading paints only between its stops
An axial or radial shading's stops are the samples that linear
interpolation does not reproduce. An ink that changes nothing in RGB,
such as a varnish, could paint at dropped samples only, and its spot
swatch was then missing. Every sample now marks the inks it paints with
as used; the stops are unchanged.
2026-10-29 10:10:58 +07:00
dotCooCoo 512036a81d Export: the ppi, width and height descriptions name the formats that store no resolution
GIF, WebP and Targa files hold no resolution field, so document.formats and
the export docs now say that ppi, and the resolution that width or height
gives, are stored in the file except in those three formats.
2026-10-29 10:10:58 +07:00
dotCooCoo 946ed6f12d i18n: Character panel Kerning and Tracking terms agree in each catalog
In Brazilian Portuguese the Character panel's Kerning field was named
Entrelinhamento, the word the catalog uses for Leading, so the two
fields had the same name. In Danish, Turkish, Indonesian and Dutch the
Reset Tracking and Kerning command named tracking with a different word
from the Tracking field, and in Dutch, Bulgarian and Greek the Info
panel's type line did the same.

The pt-br Kerning field is now Kerning (0 = Automático). The reset row
in da, tr, id and nl and the Info panel row in nl, bg and el now use
the word of the catalog's Tracking field. A new test checks that the
three fields have different names in every catalog and that the reset
row and the Info panel row use the field words.
2026-10-29 10:10:58 +07:00
dotCooCoo 69ff3fc00e Part of #3235: PDF import keeps the spot swatch of a DeviceN color that mixes inks
A DeviceN color with a spot ink at a tint above 0 together with a process
plate or a second ink imports as RGB. The importer returned before marking
those inks as used, and only used inks become spot swatches, so the spot
ink was missing from the document and from every later export. Shading
stops take the same path, so a DeviceN gradient lost its ink the same way.

The art still imports as RGB with the existing warning; each ink it paints
with now becomes a spot swatch with its 100% color.
2026-10-29 10:10:58 +07:00
dotCooCoo 530cca3322 Export: document.export takes a pixel width or height for raster files
PNG, PNG-8, JPEG, WebP, GIF, TIFF, BMP, Targa and PSD exports take
`width` or `height` in pixels. Each file is scaled so that its own
artboard, `rect` or art bounds is that wide or high, so with
`useArtboards` every file gets its own scale. `width` wins over
`height`, and either wins over `ppi` and `scale`, in the order an
Export for Screens row reads its size. The scale stays within 0.01 to
64 pixels per point and the file stores the resolution that results.
A value that is not a positive number is refused.

The per-file scale comes from `ScreenSize::scale_for`, which Export for
Screens rows already use. Rows keep their own size: their format
settings still drop `width` and `height`. `document.formats` lists the
two options for every raster format.
2026-10-29 10:10:58 +07:00
bflatastic db982ad896 Package: drop the EngineError import #4393 left unused 2026-10-29 10:10:57 +07:00
dotCooCoo 1cecdfb985 Export for Screens: a folder export cancelled after its last file returns its files
The check after the last file returned the cancelled error for every
export. A folder export without a ZIP has written each file by then, so
a cancel that came during a final step that writes nothing (a row whose
file repeats the one before it) reported a finished export as
cancelled. The check now runs only for exports that still hold their
files: those without a folder and those that make a ZIP.
2026-10-29 10:03:27 +07:00
dotCooCoo 2731ffacdd Export for Screens: a cancel while the archive is made returns no archive
A cancel that came after the last file's check was not seen: an export
without a folder returned its files or its archive anyway. The export now
checks once more after the last file and again after deflating the
archive, so a cancel returns the cancelled error and nothing is written
or returned.

zip::deflate takes a `stop` callback that it calls before each 1 MiB of
a file. Export for Screens passes the cancel state, so deflating stops
at the next MiB. file.package passes one that never stops, so its
behavior does not change.
2026-10-29 10:03:27 +07:00
dotCooCoo 3b01769d46 Export for Screens: a ZIP export deflates its files
With `zip: true`, document.exportForScreens deflated nothing: every file
went into the archive stored. Each file is now deflated, or stored when
deflating does not make it smaller, as file.package's archive does. The
file list, the names and the reply's fields stay the same; `bytes` and
the archive's contents change. Entries keep the fixed 1980-01-01 date, so
the same files still give the same archive.

The deflating writer moves from package.rs into fileio/zip.rs as
`zip::deflate`, beside `zip::store`, and file.package calls it there with
its own date and error text. The test reader `zip::entries` reads
deflated entries too. The `zip` option's text in docs/mcp.md,
docs/control-protocol.md and the command's params says the files are
deflated.
2026-10-29 10:03:27 +07:00
dotCooCoo 71a67601a5 Layers: Alt-click selects only on the drawn name, and in an isolated layer
An Alt-click right of a short layer name, inside the wider rename
target, no longer replaces the selection. The isolated layer's own row
now selects the art inside it (layer.selectAll), where it cleared the
selection before. The doc line says the click selects visible, unlocked
art and clears the selection on a hidden or locked layer.
2026-10-29 10:03:20 +07:00
dotCooCoo ec988442b5 Layers: Alt-click on a layer name selects the layer's art
The reference app selects all objects on a layer with an Alt-click
(Option-click) on the layer's name in the Layers panel. In VectorCraft
an Alt-click on a name did what a plain click does: it highlighted the
row and made the layer current, and the art stayed unselected.

An Alt-click on the name of a layer or sublayer now also selects its
visible, unlocked art, as the row's selection square does
(layer.selectAll), and the layer still becomes current
(layer.setCurrent). On a locked or hidden layer the click clears the
selection, as that row's selection square does. On a group or object
row, beside the name, and with Shift or Ctrl/Cmd held as well, the
click does what it did before.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-29 10:03:20 +07:00
dotCooCoo 5c1ab5042f Gradient: the Cmd/Ctrl-click reset paints only the selected characters and gives an unpainted stroke its weight
The reset ran paint.editGradient, which changes every run of a type
object and leaves a stroke without paint at weight 0. It now runs
paint.setFill or paint.setStroke with the linear White, Black gradient:
characters selected with the Type tool take it and the rest keep their
paint, and a stroke without paint gets the 1 pt weight, as a plain click
on the Gradient button already does.
2026-10-29 10:03:12 +07:00
dotCooCoo 85d7913f10 Gradient: Cmd/Ctrl-click on the Gradient Fill box or the Gradient button resets to White, Black
The reference app resets a gradient to black and white when the
gradient button in the Tools panel is Cmd/Ctrl-clicked, and to the
default black and white linear gradient when the Gradient Fill box in
the Gradient panel is Cmd/Ctrl-clicked. In VectorCraft a Cmd/Ctrl-click
on either did what a plain click does, and the reset was only in the
Gradient panel menu.

A Cmd/Ctrl-click on the Gradient panel's thumbnail or on the Tools
panel's Gradient button now makes the gradient of the active Fill or
Stroke a linear gradient with the White, Black stops, through
paint.editGradient, as one undo step. A solid or no paint becomes that
gradient, and with nothing selected the default paint changes. A plain
click keeps its behavior, and the panel menu's Reset to White, Black
is unchanged.

Docs: docs/target-app-parity.md.
2026-10-29 10:03:12 +07:00