Commit Graph
14125 Commits
Author SHA1 Message Date
dotCooCoo a5493a1cd0 Paths: editing one anchor of a long path keeps one chunk of anchors for undo
A subpath's anchors are now an `Anchors` list held in chunks of up to
256 anchors behind `Arc`s. Copying a path copies the chunk table and
shares the chunks, and editing one anchor copies only the chunk that
holds it, so the undo step of a one-anchor edit no longer keeps a copy
of every anchor of the path. Inserting or removing an anchor copies the
chunk it is in and rebuilds the table. Reads and edits follow the Vec
and slice methods the code used; files write and read each subpath's
anchors as one list, as before, within the same anchor read budget.

The undo memory estimate counts only the chunks the other version of
the path does not hold, and the renderer's kept paths compare only the
chunks an edit copied when they look for moved anchors.

Moving one anchor of an open path of 10,000 or 200,000 anchors
(path.moveAnchor, path.setHandle, path.moveAnchors, a nudge) keeps at
most 48 KiB in its undo and redo steps, where it kept 56 bytes per
anchor.
2026-11-14 21:25:15 -08:00
BFlat 4830ea0e83 Merge pull request #7495 from dotCooCoo/fix/uk-color-library-label
i18n: Ukrainian Color Library names colors, not flowers
2026-11-15 09:47:47 +07:00
BFlat 78d45ee14a Merge pull request #7699 from dotCooCoo/fix/panel-view-command
Panels: ui.panelView sets the Swatches, Graphic Styles and Symbols panel views
2026-11-15 09:47:37 +07:00
BFlat 7c12d660af Merge pull request #7627 from dotCooCoo/feat/ai-save-graph-records
.ai save: live graphs are written as graph records
2026-11-15 09:47:28 +07:00
BFlat 40f096f32b Merge pull request #7213 from dotCooCoo/feat/rotated-box-scale-reflect
Transform: Scale and Reflect act along a rotated bounding box
2026-11-15 09:47:18 +07:00
BFlat 3e68e4117a Merge pull request #7712 from dotCooCoo/feat/rough-pastels-load-texture
Effects: Rough Pastels loads its texture from an image file
2026-11-15 09:47:09 +07:00
BFlat e81f676ef4 Merge pull request #7720 from dotCooCoo/feat/object-distribute-menu
Object: a Distribute submenu runs the Align panel's distribute buttons
2026-11-15 09:47:01 +07:00
BFlat b46fb077b7 Merge pull request #7566 from dotCooCoo/fix/tool-overlays-reuse-settled-outline
Blob Brush: a long drag's settled outline is reused from frame to frame
2026-11-15 09:46:53 +07:00
BFlat 237fe27e50 Merge pull request #7713 from dotCooCoo/feat/psd-clipping-path
PSD: a file's clipping path clips its merged image on Open and Place
2026-11-15 09:46:45 +07:00
BFlat 8317ab745f Merge pull request #7690 from dotCooCoo/fix/ai-pen-samples-test-after-path
.ai import: pen-samples test checks a brushed path after the samples
2026-11-15 09:46:37 +07:00
BFlat 563f075764 Merge pull request #7707 from dotCooCoo/feat/opentype-hv-style-roman-italics
OpenType panel: H or V Style and Roman Italics set kana and Latin forms
2026-11-15 09:46:29 +07:00
BFlat 55c2bb5194 Merge pull request #7511 from dotCooCoo/fix/live-paint-make-drawn-rows
Live Paint: Make keeps every fill and stroke row that draws on the source
2026-11-15 09:46:20 +07:00
BFlat 3f90b8ff4c Merge pull request #7719 from dotCooCoo/fix/unit-parse-long-expression
Units: a very long expression reads as nothing instead of overflowing the stack
2026-11-15 09:46:13 +07:00
BFlat 05019938c6 Merge pull request #7727 from storytold/fix/pixelspace-size-svg-defaults
Effects: give the SVG filter defaults' test raster its size (fix main)
2026-11-15 09:40:52 +07:00
bflatastic 3a608ae1e3 Effects: the default SVG filters' test raster gives PixelSpace its size
#7680 added PixelSpace::size and #7658's test helper, merged in an earlier batch, didn't
set it, so vectorcraft-effects' tests don't compile on main.
2026-11-15 08:33:38 +07:00
BFlat 6016d6200f Merge pull request #7206 from dotCooCoo/fix/hindi-label-senses
i18n: Hindi labels use the interface sense of their English
2026-11-15 08:25:53 +07:00
BFlat 34ffc46cb5 Merge pull request #7687 from dotCooCoo/feat/links-copy-info
Links: Copy Info in the panel menu copies the selected links' file names
2026-11-15 08:25:44 +07:00
BFlat a53891b846 Merge pull request #7291 from dotCooCoo/feat/live-paint-bucket-multi-click
Live Paint: double-click floods across unstroked edges, triple-click paints the same paint
2026-11-15 08:25:35 +07:00
BFlat b63b99ba1a Merge pull request #7606 from dotCooCoo/fix/monitor-profile-after-blending
Canvas: translucent art blends with the paper before the monitor profile
2026-11-15 08:25:27 +07:00
BFlat feaf72f2b1 Merge pull request #7692 from dotCooCoo/fix/graph-labels-embedded-newline-middle
Graphs: centered labels with a line break in their text stay centered
2026-11-15 08:25:19 +07:00
BFlat 42043f1dbb Merge pull request #7696 from dotCooCoo/fix/svg-code-selection
SVG Options: Show Code under Export Selection shows the selection
2026-11-15 08:25:10 +07:00
BFlat 3ca10982d5 Merge pull request #7697 from dotCooCoo/fix/ai-pen-sample-test-each-setting
.ai import: pen-sample test checks each Calligraphic setting on its own
2026-11-15 08:25:02 +07:00
BFlat 507b3a8961 Merge pull request #7714 from dotCooCoo/fix/solid-check-drawn-bounds-test
3D: a test checks that a filled shape builds about the bounds its solid draws
2026-11-15 08:24:54 +07:00
BFlat d593b41961 Merge pull request #7691 from dotCooCoo/feat/variable-library-every-kind
Variables: Load and Save Variable Library hold visibility, image and graph variables
2026-11-15 08:24:45 +07:00
BFlat 61091515b3 Merge pull request #7624 from dotCooCoo/fix/cmyk-tiff-alpha-and-extra-sample
TIFF: alpha after another extra sample places and opens as transparency
2026-11-15 08:24:36 +07:00
BFlat 2331fd44fa Merge pull request #7680 from dotCooCoo/feat/radial-blur-center
Effects: Radial Blur turns about a Blur Center set in its dialog
2026-11-15 08:24:28 +07:00
BFlat bb2322c568 Merge pull request #7678 from dotCooCoo/fix/optical-keeps-tsume
Type: Optical kerning keeps the space Tsume takes out
2026-11-15 08:24:19 +07:00
BFlat 905eb30384 Merge pull request #7716 from dotCooCoo/fix/svg-import-budget-shared
SVG import: bound selector matching and share the limits with linked and embedded SVGs
2026-11-15 08:24:10 +07:00
BFlat 69a9df31fe Merge pull request #7700 from dotCooCoo/fix/svg-clip-use-both-clips
SVG import: a use in a clip path clips by its own clip path and its text's
2026-11-15 08:24:03 +07:00
BFlat c6a085f20e Merge pull request #7704 from dotCooCoo/fix/perspective-repeated-ids
Perspective: a repeated id attaches, moves or transforms an object once
2026-11-15 08:23:55 +07:00
BFlat c18a83f028 Merge pull request #7698 from dotCooCoo/fix/save-checks-files-beside-read-file
Save: File > Save no longer writes over the file the document was read from through a file written beside the path
2026-11-15 08:23:45 +07:00
BFlat c605d0ded8 Merge pull request #7671 from dotCooCoo/fix/prefs-reset-row
Preferences: Reset Preferences shares the row of Export and Import
2026-11-15 08:23:38 +07:00
BFlat 17dfe41a7e Merge pull request #7672 from dotCooCoo/fix/export-selection-doc-save-panel
MCP: docs say document.exportSelection with options and no path still asks for the file
2026-11-15 08:23:31 +07:00
BFlat 40d1fc913a Merge pull request #7702 from dotCooCoo/fix/reverse-compound-stroke-records
Paths: Reverse Path Direction turns a compound path's own stroke width profile and pen records
2026-11-15 08:23:22 +07:00
BFlat dc870ecf9c Merge pull request #7686 from dotCooCoo/fix/export-places-symbols-in-masks
Export: symbol instances in opacity masks draw their art's live effects
2026-11-15 08:23:13 +07:00
BFlat 410bb908ce Merge pull request #7695 from dotCooCoo/fix/issue-7275-rename
Fix #7275: Rename artboards in Export for Screens by double-clicking their names
2026-11-15 08:23:04 +07:00
dotCooCoo a3cb4462af OpenType panel: checkboxes after Select All read every frame of the story
After Select All in a threaded story whose edited frame is empty, the
panel's commands style the text of every frame, but the checkbox rows,
Stylistic Sets and the East Asian items read only the empty frame. They
now read the runs of every frame, leaving out runs with no text while
any run has text, so a feature the story's text has shows checked and a
click turns it off.
2026-11-14 17:03:36 -08:00
dotCooCoo 8eded96792 PSD: transform a file's clipping path in place instead of copying it
file_clipped owns the path psdread::clipping_path reads, so it moves it
to the image's place without making a second copy of every anchor.
2026-11-14 16:39:17 -08:00
dotCooCoo 8cba5fae0c Merge main into fix/live-paint-make-drawn-rows 2026-11-14 16:37:54 -08:00
dotCooCoo 15a6171021 Tests: texture-file tests remove their folders when they fail
The Rough Pastels and Glass texture tests make their folders with
vectorcraft_testkit::TempDir, which removes them on every exit path.
2026-11-14 16:32:18 -08:00
dotCooCoo c7aa27ec12 Transform: saved Scale and Reflect steps without a basis keep the page's axes
An action or journal entry recorded before Scale and Reflect followed the
turned bounding box has no basis value. Replayed, such a step now acts along
the page's axes, as it did when it was recorded; steps recorded now carry
basis "box" and replay along the box. The built-in Reflect Horizontal action
names basis "box", so it keeps reflecting across the box's own axis.

The symbol test that reflects a turned instance names basis "page", which
is the reflection it was written for.
2026-11-14 16:30:56 -08:00
dotCooCoo eff1500bd2 Object: a Distribute submenu runs the Align panel's distribute buttons
Object › Distribute follows Object › Align and lists Horizontal
Distribute Left, Center and Right, Vertical Distribute Top, Center and
Bottom, Horizontal Distribute Space and Vertical Distribute Space. Each
item runs the button's `align.distribute*` command, so it uses Align To,
the key object and the Distribute Spacing value, and with the Artboard
tool chosen it spaces the selected artboards.
2026-11-14 16:28:19 -08:00
dotCooCoo 8dfbe54db6 Units: a very long expression reads as nothing instead of overflowing the stack
Unit::parse took one level of recursion per + - * / sign, so a text such
as "1+1+...+1" with 200,000 terms overflowed the stack and aborted the
process. Every number field, parse_number and every command parameter read
as a length went through it.

Text with more than 128 + - * / signs now reads as nothing; text with 128
or fewer reads as before. docs/mcp.md states the limit for length strings.
The test a_very_long_expression_reads_as_nothing aborted with a stack
overflow before the change.
2026-11-14 16:26:09 -08:00
dotCooCoo e10f87818b OpenType panel: caret checkboxes read the whole text they change
At a Type tool caret the panel's commands style all of the text, but the
checkbox rows, Stylistic Sets and the H or V Style and Roman Italics
items showed only the caret's style. A click could then turn a feature
off for the whole text while most of it did not have the feature. At a
caret they now read every character of the text: a mixed row shows a
dash, a mixed item shows unchecked, and a click turns the feature on
throughout.
2026-11-14 16:24:52 -08:00
dotCooCoo 67f427b2b4 Merge main into fix/ai-pen-samples-test-after-path 2026-11-14 16:21:15 -08:00
dotCooCoo d0f1346f87 Docs: record the PSD clipping path in the PSB row and the evidence list
The PSB row of docs/file-format-parity.md says the merged image comes in
clipped by the file's clipping path, as the PSD row does, and
docs/target-app-parity.md's evidence list gets a line for it.
2026-11-14 16:20:16 -08:00
BFlat 895e9493d2 Merge pull request #7693 from dotCooCoo/fix/hidden-chars-test-retry-edit
Tests: each Show Hidden Characters retry sets new text
2026-11-15 07:11:58 +07:00
dotCooCoo 89f20c45c4 SVG import: bound selector matching and share the limits with linked and embedded SVGs
The measurement that runs before the style cascade and usvg now covers
the inputs that still got past it:

- usvg matches a selector without keeping what it found, so one whose
  leftmost part matches nothing tests every set of ancestors in turn.
  The measurement counts those tests for each copy and stops at
  50,000,000; past that the SVG is refused with "the SVG's style sheets
  take too long to match". An SVG image's matching stops at what the
  SVG showing it left.
- A test counts one more for every 16 attributes a lookup scans and
  every 16 bytes of the value it compares, so many classes against a
  long class list count the work they do, in usvg's matching and in
  the import's own cascade.
- The declarations the import's own cascade keeps, once per element,
  count toward the 64 MB, including those of `:not()` rules, which usvg
  drops. Each `:not()` alternative counts as a test.
- A linked SVG file is measured before its cascade runs. The linked SVG
  files share one measurement: once they pass the limits together, the
  files after that are shown without their links. The tests a file past
  the limits made still count.
- SVG images share the element limit and the selector tests with the
  SVG showing them, as they already shared the 64 MB.

The svg_filters reader measures its SVG before the cascade too.
2026-11-14 16:10:10 -08:00
dotCooCoo af010b6dec PSD: a file's clipping path clips its merged image on Open and Place
A PSD or PSB file can name one of its saved paths (image resources 2000
to 2997) as its clipping path in resource 2999. psdread::clipping_path
reads that path in the image's pixel space, under the even-odd rule the
file format specification gives, with a subpath around the whole image
first when the initial fill record says the fill starts with all
pixels.

File > Place of such a file, and File > Open of its merged image, put
the image in a clip group of that path with no paint. file.place answers
the image's id as `image`, as for a DCS file. Replacing an image alone
in a clip group with such a file keeps the image's scale and rotation.
links.update and links.relink leave the clip group as it is. Files that
name no clipping path come in as before.
2026-11-14 15:55:34 -08:00
dotCooCoo 67fd1cd127 Merge main into feat/live-paint-bucket-multi-click 2026-11-14 15:48:45 -08:00