Commit Graph
4562 Commits
Author SHA1 Message Date
dotCooCoo 106133133b Merge main into fix/hpgl-9slice-art-bounds 2026-11-14 19:00:44 -08: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 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 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
dotCooCoo 4ec16519a4 Export: the HP-GL plot of the art's bounds places 9-slice and filtered symbol art before measuring
The art's bounds no longer clip art that 9-slice guides place, or refuse
art that an instance shows through a nested instance:

- An instance whose art goes through 9-slice guides, at any depth, is
  measured as its art placed through the guides, with the objects the
  plot leaves out hidden after placing. Leaving them out first changed
  the box the guides cut.
- Hidden art is not placed, so it does not use up the limit on placed
  objects that the visible instances share.
- The copy of a dynamic symbol that an instance's changes are measured
  on keeps the symbol's 9-slice guides and natural size.
- The changes of the instances in a dynamic symbol's art are collected
  from all of the art, also from objects at 0% opacity or without paint,
  which an instance of the symbol can change.
2026-11-14 17:52:29 -08: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 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 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 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 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 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
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 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
dotCooCoo 403023f834 Effects: Rough Pastels loads its texture from an image file
The Rough Pastels dialog has a Load Texture… button, as Glass and
Texturizer have. The image's gray levels become the paper surface,
stored with the effect as `textureImage` and listed as Loaded Texture
in the Texture menu; Scaling, Relief, Light Direction and Invert act on
it as on the built-in surfaces. The dialog's Texture and Light
Direction controls are now menus instead of text fields.

effect.apply and effect.setParams read `textureImage` from a file or
take the stored string and refuse anything else, and a plug-in filter
cannot have the host read a file for it.

In the Effect Gallery's Settings, a file dialog that answers later
(the macOS sheet, the Linux dialog) now gives the texture to the values
that asked: the filter being browsed, or the stack row that asked,
found by a number each row now carries. An answer for a removed row, a
filter no longer browsed or a gallery that closed is dropped.

Params text, docs/mcp.md, docs/control-protocol.md, docs/gaps.md and
the evidence line are updated.
2026-11-14 15:45:59 -08:00
dotCooCoo d91e6a8565 Merge main into feat/opentype-hv-style-roman-italics 2026-11-14 15:24:42 -08:00
dotCooCoo 0431809643 OpenType panel: H or V Style and Roman Italics set kana and Latin forms
With Show East Asian Options on, the OpenType panel menu has H or V
Style and Roman Italics. H or V Style is the character feature tag
`hkna`: kana take the forms the font draws for horizontal type, and in
vertical type the shaper applies `vkna` in its place. Roman Italics is
`ital`, the font's italic half-width alphanumerics. Both are on or off
only (`hkna=2` is refused), set through `features` and
`featureChanges`, cleared by Reset OpenType Features, and are switches
in Character Style Options > OpenType Features.

Docs: docs/mcp.md, docs/type-parity.md, docs/target-app-parity.md.
2026-11-14 15:22:36 -08:00
dotCooCoo dba42af495 Merge main into feat/ai-save-graph-records 2026-11-14 15:21:09 -08:00
dotCooCoo 7ad98ce9b8 Perspective: a repeated id attaches, moves or transforms an object once
perspective.attach, perspective.release, perspective.move and
perspective.transform took their `ids` as given, so an id listed twice
was processed twice. Attach warped an object that was already projected
a second time, and a move or transform of an object not yet in
perspective attached it and then moved it twice. The Shift and Snap to
Grid reads of a move also used a document attached twice. The ids are
now taken once each, in the order first given.
2026-11-14 15:20:27 -08:00
BFlat dafd993395 Merge pull request #7658 from dotCooCoo/feat/svg-filter-defaults
Effects: Effect › SVG Filters lists default filters
2026-11-15 06:18:12 +07:00
BFlat 4e42e2bbb0 Merge pull request #7681 from dotCooCoo/feat/east-asian-glyph-forms
Type: Glyphs panel menu draws the selected characters in an East Asian glyph form
2026-11-15 06:17:55 +07:00
BFlat 9f6edb7239 Merge pull request #7682 from dotCooCoo/fix/graph-outline-stroke-keeps-plot
Graphs: Outline Stroke and a graph left with only labels keep the plot in place
2026-11-15 06:17:47 +07:00
BFlat 5872e71651 Merge pull request #7452 from dotCooCoo/feat/trace-preset-defaults
Image Trace: presets trace at Paths 50 with new Corners and Noise
2026-11-15 06:17:23 +07:00
dotCooCoo 93a7d532c7 Merge main into feat/rotated-box-scale-reflect 2026-11-14 15:17:16 -08:00
BFlat a92993daf9 Merge pull request #7582 from dotCooCoo/fix/clip-effects-hit-test
Selection: clicks in a clip group follow the region its clipping path's effects give it
2026-11-15 06:16:57 +07:00
BFlat bc2f9d888a Merge pull request #7683 from dotCooCoo/fix/hpgl-art-bounds-dynamic-symbols
Export: an HP-GL plot of the art's bounds leaves out images in dynamic symbols
2026-11-15 06:16:40 +07:00
BFlat 7ddeef73d6 Merge pull request #7608 from dotCooCoo/fix/emfplus-import
Metafile import: EMF and WMF are read through craft-metafile, so EMF+ pictures open
2026-11-15 06:16:24 +07:00
dotCooCoo de5a46a2ab Live Paint: Merge keeps a painted edge's look on every piece an added path cuts
Merge carried each old edge's paint only to the new edge nearest the old
edge's middle, so when an added path cut a repainted edge, the other
piece went back to its source's stroke. Every new edge whose middle lies
on an old edge now takes that edge's paint, with its rows fitted to its
part of the edge, as Gap Options does.
2026-11-14 14:56:41 -08:00
dotCooCoo 5fcccce7ce Paths: Reverse Path Direction turns a compound path's own stroke width profile and pen records
Reverse Path Direction reversed each member path of a compound path and
turned the members' own stroke records, but left the compound path's
strokes as they were. A compound path's strokes run along its members'
subpaths in order, so its width profile and pen pressure, tilt, bearing
and rotation then ran the old way and the stroke drew differently.

reverse_stroke_records now also takes a compound path, reading its
members' subpaths in order, and path.reverse turns each compound path's
strokes with the combined reversal of its members before they reverse.
As for a path, the strokes turn only when every subpath turns alike.
2026-11-14 14:52:36 -08:00
BFlat 0fe02d8544 Merge pull request #7651 from dotCooCoo/feat/smart-punctuation-dialog
Type: Smart Punctuation replaces ligatures, extra spaces and fractions and reports results
2026-11-15 05:30:55 +07:00
BFlat c0ce77a912 Merge pull request #7663 from dotCooCoo/feat/perspective-auto-plane-positioning
Perspective: Perspective Grid Options has Automatic Plane Positioning
2026-11-15 05:30:40 +07:00
BFlat 0e78bfa60c Merge pull request #7580 from dotCooCoo/fix/create-outlines-gradient-layout-bounds
Type: Create Outlines keeps a run's gradient across the whole text
2026-11-15 05:30:22 +07:00
BFlat ada5c74c47 Merge pull request #7203 from dotCooCoo/fix/file-folder-param-classification
Automation: one classification of file and folder params
2026-11-15 05:30:12 +07:00
BFlat 9153900b1f Merge pull request #7322 from dotCooCoo/fix/graph-series-group-opacity
Graphs: the transparency set on a series group is kept
2026-11-15 05:30:04 +07:00
BFlat 35bf3a7412 Merge pull request #7625 from dotCooCoo/fix/shape-builder-open-path-drawn-fill
Shape Builder: an open path counts as filled by the fill rows that draw
2026-11-15 05:29:46 +07:00
BFlat 2986ddb104 Merge pull request #7462 from dotCooCoo/fix/convert-to-text-locked-frames
Type: Convert to Text and Remove Breaks on a selected story include its locked and hidden frames
2026-11-15 05:29:38 +07:00
BFlat d68b7f3990 Merge pull request #7670 from dotCooCoo/feat/open-pdf-pages-as-links
Import PDF: Import PDF pages as links opens each page linked to its file
2026-11-15 05:29:21 +07:00
BFlat dcd6e69e83 Merge pull request #7610 from dotCooCoo/fix/text-wrap-offset-refused
Text wrap: an out-of-range or non-number offset is refused
2026-11-15 05:29:05 +07:00
BFlat 15ae607c63 Merge pull request #7667 from dotCooCoo/feat/links-sort-by-size
Links: Sort by Size in the panel menu lists the smallest file first
2026-11-15 05:27:12 +07:00
dotCooCoo 1399c17c5a Graphs: centered labels with a line break in their text stay centered
A quoted CSV cell keeps its line breaks, and a category or series label
draws each one as a new line, as it does a `|`. Labels beside an axis or
in a wedge counted their lines by `|` alone, so a label with a line break
was set off center, and with kept leading or paragraph spacing it was
not moved back to its middle when the graph was drawn again. The label
now counts lines in the text it lays out.

Follow-up to #6574.
2026-11-14 14:23:42 -08:00
dotCooCoo c6e65c3968 Variables: SVG variable data reads only the text values of its library
An SVG keeps only its text variables, so the values of its visibility, image and graph variables are passed over unread, and one that Load Variable Library would refuse no longer keeps the text variables from opening.
2026-11-14 14:10:15 -08:00