Commit Graph
3889 Commits
Author SHA1 Message Date
dotCooCoo a49dd999f5 Merge main into fix/convert-to-text-locked-frames 2026-11-14 09:42:27 -08:00
dotCooCoo 3674865d62 Merge main into feat/smooth-keeps-corners 2026-11-14 09:42:14 -08:00
dotCooCoo b4eee0faca Merge main into feat/ai-save-graph-records 2026-11-14 09:42:05 -08:00
BFlat 78131ae11c Merge pull request #7419 from dotCooCoo/fix/type-dialogs-story-wide
Type: Justification, OpenType, text styles and Convert to Text change every frame of a selected story
2026-11-15 00:42:04 +07:00
dotCooCoo 0bd4a1c331 Merge main into fix/artboard-history-index-wrong-type 2026-11-14 09:41:57 -08:00
BFlat fcfad959ff Merge pull request #7588 from dotCooCoo/fix/mesh-point-color-panel
Color: the panels show the color and opacity of picked gradient mesh points
2026-11-15 00:41:54 +07:00
BFlat e76f8d2c88 Merge pull request #7501 from dotCooCoo/fix/export-bakes-symbol-art-effects
Export: live effects in symbol art apply in PDF, EPS, print and DXF
2026-11-15 00:41:46 +07:00
BFlat 53cc597fbd Merge pull request #7554 from dotCooCoo/fix/place-text-utf16-no-bom
Place: text files in UTF-16 without a byte-order mark place as UTF-16
2026-11-15 00:41:11 +07:00
BFlat 12b09b921c Merge pull request #7439 from dotCooCoo/fix/single-line-composer-remeasure
Type: the Single-line Composer measures a line's room across its tallest character
2026-11-15 00:41:01 +07:00
BFlat 8c5494bccc Merge pull request #7342 from dotCooCoo/feat/live-paint-selection-double-click
Live Paint: a Live Paint Selection double-click selects the connected faces or edges
2026-11-15 00:40:41 +07:00
BFlat 7ee5f499f4 Merge pull request #7547 from dotCooCoo/fix/ai-large-canvas-symbol-art
.ai and EPS import: large canvas symbols come in at the file's size
2026-11-15 00:40:30 +07:00
BFlat d0b37826c0 Merge pull request #7338 from dotCooCoo/fix/colored-light-seams
3D: colored-light facets close their shared edges over an underlay
2026-11-15 00:40:19 +07:00
BFlat e5a99a5284 Merge pull request #7561 from dotCooCoo/fix/invert-wrap-offset-band-exact
Text wrap: Invert Wrap with an offset lets a line use all the room the grown shape holds
2026-11-15 00:39:39 +07:00
BFlat 01e66f0a19 Merge pull request #7477 from dotCooCoo/fix/dimension-second-point-guides
Dimension tool: no construction guides through a first point off the anchors
2026-11-15 00:39:29 +07:00
BFlat 23accce757 Merge pull request #7467 from dotCooCoo/fix/inflate-lazy-puffs
3D: Inflate with no volume solves each puff only when its solid is taken
2026-11-15 00:39:20 +07:00
BFlat b6b7dda2fd Merge pull request #7603 from dotCooCoo/docs/menu-stub-list
Docs: the menu-stub list names only menus that are not wired up
2026-11-15 00:39:02 +07:00
BFlat 15c054ff2a Merge pull request #7426 from dotCooCoo/fix/it-missing-message-rows
i18n: Italian translates the messages no catalog had a row for
2026-11-15 00:38:53 +07:00
BFlat 8c17633967 Merge pull request #7314 from dotCooCoo/fix/ja-message-rows
i18n: Japanese has a row for 1,804 of the messages the untranslated report lists
2026-11-15 00:38:41 +07:00
BFlat 7a808e2378 Merge pull request #7536 from dotCooCoo/fix/svg-rtl-absolute-chunks
SVG import: absolutely placed characters in right-to-left text land on their x
2026-11-15 00:38:32 +07:00
BFlat 40d6a2bc3e Merge pull request #7354 from dotCooCoo/fix/hu-message-rows
i18n: Hungarian has a row for 1,813 of the messages the untranslated report lists
2026-11-15 00:38:11 +07:00
BFlat d89f593bfa Merge pull request #7380 from ncic/pencil-cursors
Pencil: shows where a stroke continues, connects and closes
2026-11-15 00:38:01 +07:00
dotCooCoo 53d28fc9bf Docs: the File formats row names the graphs .ai saves keep live
The File formats area row no longer lists grouped column, stacked column,
line and area graphs among the live objects a saved .ai writes as their
art, and its evidence names the graph round-trip tests.
2026-11-14 09:33:14 -08:00
dotCooCoo ae39914b9f Remove Breaks: a partly selected story's frames are gone through once
When only some frames of a threaded story are selected, Remove Line
Breaks and Remove Paragraph Breaks built the story's frame list again
for every selected frame of it, so the work grew with the square of the
frame count. The command now notes a thread once its story is found not
to be selected in full, and reads that thread's other selected frames
on their own without going through the thread again. Each selected
frame still loses its own breaks, in the order selected, as one undo
step.

A test-only counter in threads.rs counts story_in calls, and
remove_breaks_goes_through_a_partly_named_story_once checks both break
kinds with frames named out of order and twice.
2026-11-14 08:58:57 -08:00
dotCooCoo 11bd1659f5 Selection: symbol parts follow the region a clipping path's effects give it
Direct Selection on a dynamic symbol's instance picked an object in the
region its clipping path's effects give it, but cut the object's outline
to the plain clipping path, so the outline came out empty or cut short.
In a layer of the art whose Preview is off, it tested the effect-shaped
region and the fills, where the canvas draws the plain clipping path and
outlines.

- `hit::symbol_part_outline` cuts to the bounds of the effect-shaped
  region. The new `hit::symbol_part_outline_in_view` takes the view's
  outline state, and the Direct Selection overlay passes it.
- `hit::symbol_part_at` tests art in a layer whose Preview is off in
  outline.
2026-11-14 08:51:22 -08:00
dotCooCoo 04df80f4e5 Docs: the Image Trace evidence lines give the continuous-tone cutoff as a tenth 2026-11-14 08:42:56 -08:00
dotCooCoo a4c513f101 Live Paint: Make starts a closed edge where its path starts
The edge built from a closed path that nothing cuts started at the anchor the
planar map gave it, so dashes, a width profile or a brush began at a different
place than on the path. The edge now starts at the anchor where its path
starts. An edge with no anchor there takes its dashes from its own start and
leaves off the profile and brush.

The command description and the progress doc say that dashes aligned to
corners and path ends are not fitted to cut edges.
2026-11-14 08:39:47 -08:00
dotCooCoo 3de44da6a6 Image Trace: a gray photo with little noise counts as continuous tone
The continuous-tone check exempts a neutral or single-curve picture when
sixteen colors leave at most a fifth of the error of eight. The
exemption is for flat art of up to sixteen clean levels, where sixteen
colors leave no error. A gray photo with 0 to 2 levels of noise measures
0.19, under the cutoff, so it was classed as flat art and traced without
smoothing, while its color original and the same photo with more noise
were smoothed.

The cutoff is now a tenth (VectorCraft's own value). Clean gray, sepia,
single-hue and duotone art of up to sixteen levels stays flat art.

Docs: docs/target-app-parity.md.
2026-11-14 08:37:49 -08:00
ruchirguitar 415783e926 Symbols: add right-click context menu to panel items 2026-11-14 21:59:45 +05:30
dotCooCoo e001227ce1 Selection: effects on a hidden member of a clipping group leave clicks alone
A clipping path that is a group clips by its visible members only. A
geometry effect on a hidden member made clicks inside the clip group
count the group's type by its glyph outlines, where they count it by its
frame when nothing has an effect.

Clicks now ask `effects::reshaped_clip_outline`, which gives a region
only when an object the clipping path clips by has a geometry effect.
`clip_outline` uses the same function.
2026-11-14 08:29:00 -08:00
dotCooCoo ef74b358f6 Docs: a clipping path that paints applies its fill and stroke effects after the group's
The geometry effects of a clipping path's own fills and strokes stay live when the clipping path has a fill or stroke, so they reshape it after the geometry effects of the clip group and of the groups around it.
2026-11-14 08:28:38 -08:00
dotCooCoo 506f48daea .ai save: live graphs are written as graph records
Both .ai writers now write a graph that the .ai reader reads back as the
same graph with its records, so a saved graph opens again live, with its
table, type, axes and settings: %_Gs, the Gb, Gy, Gd, Ga/GA, Gz, Gc and
GC records, the graph's group with each series' group followed by a Go
tag, and %_GS (the published .ai file format specification, section 17
and appendix A). The records are the ones the reader in
crates/eps/src/import/ai/read/graph.rs (#7311) reads, in the form it
reads them.

The shared encoder in crates/eps/src/ai_graph.rs decides first whether
the reader keeps the graph whole: a column, stacked column, line or area
graph with a legend, settings the records carry, a table of 1 to 10,000
categories and 1 to 256 series with finite values, labels of at most 255
bytes without control characters, and art the reader attaches the graph
to. Any other graph is written as its art, with the existing warning, as
is a graph whose art the editing writer's object limit cuts short.
Tick-mark counts of 0 are written as 1, the count the reader keeps for
both.

Bar, stacked bar, scatter, pie and radar graphs, stacked column and area
graphs whose series marks carry a stroke their legend swatch lacks, and
line graphs with markers are still written as their art, with the
warning.
2026-11-14 08:20:05 -08:00
dotCooCoo 845a3bc9ca Merge main into fix/monitor-profile-after-blending 2026-11-14 08:16:04 -08:00
dotCooCoo 46c9f922c2 Type: a document draws only its own composite font definitions
While a document's composite fonts are lent, type naming a composite font
the document does not define is set as in a missing font, even when the
front document or the document a placed document sits in defines one of
that name. A document that defines no composite font gets an empty scope
too, so a document in the back, a tiled window, a thumbnail or an export
made while another document is in front no longer borrows the front
document's definitions. A temporary document drawn while a document draws
keeps that document's fonts, and type laid out with nothing lent still uses
the registered ones.

- FontDb::composite_font looks only in the latest loan of the database.
- lend_composite_fonts lends an empty set at the top level when the
  database holds composite fonts; lend_document_composite_fonts also lends
  one inside another loan, for placed documents, back-document measuring
  and threaded reflow on open.
- A loan that leaves out a registered font gets its own generation, so
  layouts made with that font are not reused under it.
2026-11-14 08:16:02 -08:00
dotCooCoo 745dccb376 Merge main into fix/learn-panel-commands 2026-11-14 08:15:49 -08:00
dotCooCoo 261fa40d24 Merge main into fix/convert-to-text-locked-frames 2026-11-14 08:11:13 -08:00
dotCooCoo ddae31bad4 TIFF: alpha after another extra sample places and opens as transparency
A CMYK or grayscale TIFF reads its alpha from the first extra sample whose
ExtraSamples value is 1 or 2, wherever it comes among the extra samples, at
8 and 16 bits, chunky or planar. TIFF 6.0 gives each extra sample its own
ExtraSamples value, in order, and asks readers to skip extra samples they do
not use.

- A CMYK file with alpha after an unspecified extra sample was kept as
  opaque inks; it is now shown as RGB with its alpha.
- A grayscale file with alpha after an unspecified extra sample opened
  opaque.
- A six-sample CMYK file whose ExtraSamples tag lists only an unspecified
  value no longer reads that sample as transparency.
- A white-is-zero grayscale file with an alpha channel opens; it failed to
  read before.
2026-11-14 08:00:43 -08:00
dotCooCoo bbe9480656 Shape Builder: an open path counts as filled by the fill rows that draw
Consider Open Filled Paths as Closed decided whether an open path was
filled from its top fill row only. A path whose top fill is None over a
painted lower fill stayed open, and one whose only painted fill was
hidden or at 0% opacity closed. The region map, merge inputs and the
Clicking Stroke Splits the Path cut now use Appearance::has_drawn_fill,
so any shown, painted fill row above 0% opacity counts, as the canvas
paints it.

The Shape Builder's Live Paint face and edge filters had the same
top-row check; they now use has_drawn_fill and has_drawn_stroke, so a
face or edge is taken when one of its rows draws.
2026-11-14 08:00:35 -08:00
dotCooCoo 10f94b544d MCP: livePaint.info lists every appearance row of a face or edge
livePaint.info reported only the top fill of each face and the top
stroke and weight of each edge, so a lower row that draws under an
unpainted top row was not visible to a client. Each face and edge now
also carries `appearance`: every fill and stroke row, bottom first, as
{index, kind, paint, opacity, visible, width (strokes only), drawn}.
`drawn` follows Expand's rule row by row: the part is shown with an
opacity above 0, and the row is shown, has paint and an opacity above
0, and a stroke has a weight above 0. The existing `fill`, `stroke`,
`width`, `bounds`, `sources`, `gapOptions` and `gaps` fields are
unchanged.

The params text no longer says the group defaults to the selection:
the command takes `group`, or `id` when `group` is left out, and
returns an error without either.
2026-11-14 07:57:56 -08:00
dotCooCoo fbf2bee87b MCP: a malformed artboard or history index is reported as not a whole number
The artboard commands that take `index` or `indices`, a replayed
`selectedArtboards`, the artboard Align and Distribute commands
(`artboard`, `activeArtboard`), `edit.newDocumentFromState` and Paste in
Place, in Front and in Back now report a value that is not a whole number
with "`<key>` must be a whole number" or "`<key>` must contain whole
numbers", naming the key. A whole number that names no artboard or state
keeps `no such artboard`, `no history state N` or the paste range message.

- A null artboard `index` is `missing index`, as for other required keys.
- An `indices` value that is not a list, an empty list and a malformed
  entry each have their own message naming the key.
- `edit.newDocumentFromState` still uses the current state for an omitted
  or null `index`.
- Paste checks the form of both `artboard` and `artboards` before either
  range.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-14 07:57:00 -08:00
dotCooCoo 9f23b0a5a4 OpenType panel: the tracked-ligatures note reads every selected story frame
With the Selection tool, the note that ligatures are off while the text is
tracked read only the first run of the first selected frame. It now shows
when any character the panel reads has Standard Ligatures on, tracking
outside the shaper's limits and no explicit liga or clig tag, including
the runs of later frames of a selected threaded story, locked or hidden.
The panel's other controls already read those runs through
character::shared; a new any_style helper walks the same styles. The
panel's commands still change only the selected frames.
2026-11-14 07:52:03 -08:00
dotCooCoo 4cfad8e56b Merge main into fix/ai-envelope-budget-warped-type 2026-11-14 07:51:15 -08:00
dotCooCoo 7d76b35710 .ai save: type written as outlines keeps wrapping by its bounds
Type that the editing copy writes as its outlines (mirrored type, type in
a clip or symbol, type the text document can't hold) put its Text Wrap
Options on the group of glyph outlines. The reader then wrapped area type
around the glyph shapes instead of the type's bounds, so the wrap region
changed when the file was opened.

The group now ends with an unpainted closed rectangle at the type's
geometric bounds, with the type's lock and hidden state, that carries the
wrap options; the group keeps the type's name and has no options of its
own. The `.ai` reader already reads an unpainted path with its own
options (`text_wrap` in crates/eps/src/import/ai/read/document.rs), and
wrap resolution descends into a group without options. The rectangle
counts toward the object limit; without room for it the options are left
out with the limit's warning. Type without finite bounds gets no
rectangle, as it had no wrap region before saving.
2026-11-14 07:48:03 -08:00
dotCooCoo 978b94cef1 i18n: localization doc marks Vietnamese messages as partial
The Vietnamese row's message column said "all" while the same cell counts messages without a Vietnamese row. It now says dialogs and tooltips are complete and messages are partial, as the Indonesian row does. The row and the evidence line in docs/target-app-parity.md give the catalog's current counts: 1,750 @msg and 49 @msgplural rows, with 1,875 messages in the untranslated report.
2026-11-14 07:45:06 -08:00
dotCooCoo c7cd768399 Merge main into fix/clip-effects-hit-test 2026-11-14 07:42:26 -08:00
dotCooCoo 3bbf511b10 Merge main into feat/da-complete-messages 2026-11-14 07:35:35 -08:00
dotCooCoo f8c5d2b6c0 Merge main into fix/pdf-tiff-keeps-icc
# Conflicts:
#	crates/pdf/src/images.rs
2026-11-14 07:31:28 -08:00
dotCooCoo 69ec28dc4c Merge main into fix/3d-shadow-builds-once 2026-11-14 07:28:03 -08:00
dotCooCoo a40f00ece9 Merge main into fix/export-cull-brushed-path-art 2026-11-14 07:25:25 -08:00
dotCooCoo 8ebe4cd1c3 Merge main into fix/live-paint-make-drawn-rows 2026-11-14 07:24:33 -08:00
dotCooCoo 0df1c3f284 Merge main into fix/emfplus-import 2026-11-14 07:24:22 -08:00