Commit Graph
7303 Commits
Author SHA1 Message Date
BFlat 4368d99ee5 Merge pull request #5052 from dotCooCoo/fix/live-paint-bucket-edge-highlight
Live Paint: the Live Paint Bucket highlights an edge thinner than a face
2026-11-02 12:26:41 +07:00
BFlat 9667f5d7ba Merge pull request #5073 from dotCooCoo/fix/doc-place-limits
Place: the Word .doc reader resolves each style once and refuses damaged property tables
2026-11-02 12:26:26 +07:00
BFlat 3fc6115a44 Merge pull request #5077 from dotCooCoo/fix/ai-on-path-checks-first
.ai import: Objects on Path records measure each group once
2026-11-02 12:26:11 +07:00
BFlat e514c43b7b Merge pull request #5076 from dotCooCoo/fix/ai-page-art-moves-patterns
.ai import: page art moved to its artboard takes its pattern tiles along
2026-11-02 12:26:00 +07:00
BFlat f793c98195 Merge pull request #5074 from dotCooCoo/chore/ai-unread-fallback-cases
Docs: list every case where an unread .ai object still sends the file to its page
2026-11-02 12:25:47 +07:00
BFlat 5e10f35d2e Merge pull request #5071 from dotCooCoo/fix/ai-guides-docs
Docs: .ai guides are no longer listed as lost
2026-11-02 12:25:36 +07:00
BFlat fbfe475691 Merge pull request #5142 from dotCooCoo/fix/ai-os10-shape
.ai import: Convert to Shape opens live on paths and type
2026-11-02 12:25:20 +07:00
BFlat fa2e15b740 Merge pull request #5140 from dotCooCoo/fix/ai-os10-stylize
.ai import: Stylize effects open with their saved settings
2026-11-02 12:25:05 +07:00
BFlat f32e891e20 Merge pull request #5141 from dotCooCoo/fix/vars-p10
Variables: Export Data Sets marks visibility and image columns with # and @
2026-11-02 12:24:50 +07:00
BFlat 6a8b976ae2 Merge pull request #5145 from dotCooCoo/fix/vars-noop-import-undo
Variables: an import or library load that changes nothing adds no undo step
2026-11-02 12:24:33 +07:00
BFlat ae1a850e06 Merge pull request #5126 from dotCooCoo/fix/vars-p2
Variables: Update Data Set keeps a row's values when every bound object is locked
2026-11-02 12:24:15 +07:00
BFlat 6ee880bf6a Merge pull request #5130 from dotCooCoo/fix/vars-p3
Variables: a command that changes nothing adds no undo step
2026-11-02 12:23:57 +07:00
BFlat 32760fafa2 Merge pull request #5128 from dotCooCoo/fix/vars-p12
Variables: a CSV header that names one variable twice is refused
2026-11-02 12:23:40 +07:00
BFlat f903867cc9 Merge pull request #5133 from dotCooCoo/fix/vars-p13
Variables: Import Data Sets reports why a cell was refused
2026-11-02 12:23:23 +07:00
BFlat 0dfa17aea4 Merge pull request #5124 from dotCooCoo/fix/vars-p11
Variables: Export Data Sets refuses more data sets or variables than Import Data Sets reads
2026-11-02 12:23:10 +07:00
BFlat cb0922ec21 Merge pull request #5131 from dotCooCoo/fix/vars-p4
Variables: Undo and Redo clear a highlight that names no variable
2026-11-02 12:22:58 +07:00
BFlat a1b4363386 Merge pull request #5129 from dotCooCoo/fix/ai-os22-g15
.ai import: paths keep their notes and Show Center
2026-11-02 12:22:48 +07:00
BFlat bf074ac8e9 Merge pull request #5125 from dotCooCoo/fix/ai-os22-g11
.ai import: legacy type keeps its spacing, hanging punctuation and hyphenation
2026-11-02 12:22:35 +07:00
BFlat 6be807c5d0 Merge pull request #5132 from dotCooCoo/fix/ai-os23-2422
.ai import: a clipping path keeps its stroke
2026-11-02 12:22:19 +07:00
BFlat 5f1c6cb5c3 Merge pull request #5134 from dotCooCoo/fix/ai-os23-3797
Fix #3797: documents open in Preview, and Outline is a setting of each document
2026-11-02 12:22:04 +07:00
BFlat 906f9872d0 Merge pull request #5127 from dotCooCoo/fix/vars-p8
Variables: Edit Data Set keeps an empty text value when OK changes nothing
2026-11-02 12:21:52 +07:00
dotCooCoo 775effdbb3 Live Paint: the Live Paint Bucket highlights an edge thinner than a face
The bucket outlines the face under the pointer at its Width setting and an
edge at half of it (4 px and 2 px by default), as the help page says faces
are highlighted with a thick line and edges with a thin line. The Live
Paint Selection tool keeps one width for faces and edges.
2026-11-02 12:04:00 +07:00
dotCooCoo 11adb715b5 Place: a Word .doc document with too many property runs, paragraphs or properties is refused
A bin table that lists more than 100,000 runs of character or of paragraph
properties is refused while its pages are read. Every paragraph now counts
against the 100,000-paragraph limit, hidden and deleted ones and those in
field instructions included, and so does every line break. The properties
of the styles and of the property runs are read from one budget of 16 MiB,
and a document with more is refused.

Text inside a field's instructions is found with a count of the fields
open in their instructions instead of a search of the open fields for each
character.
2026-11-02 12:03:59 +07:00
dotCooCoo a6db4c9112 Place: a Word .doc style sheet that holds fewer styles than it counts is refused
Stshif.cstd counts the LPStd records of the style sheet and must be less than
0x0FFE. A sheet that ended before cstd records was read as far as it went, and
paragraphs in the missing styles were placed with the document defaults; a
cstd of 0x0FFE or more was cut to 0x0FFE. Both are now refused as a damaged
style sheet.
2026-11-02 12:03:58 +07:00
dotCooCoo 22218e9097 Place: a Word .doc paragraph's own indent holds over its style's
A paragraph style can set a logical start or end indent and the paragraph
itself only a physical left or right one, or the other way round. The
indent applied last now holds, after the sides are mapped for the
paragraph's direction; before, the logical indent always held, so a
paragraph's own indent was lost under its style's.
2026-11-02 12:03:58 +07:00
dotCooCoo b4c01e3120 Tests: move the repeated-records timing test next to the other objects-on-path record tests 2026-11-02 12:03:57 +07:00
dotCooCoo ecd184510c Place: Word .doc styles are resolved once and damaged property tables are refused
Each style's formatting is now worked out once, on top of the style it
is based on, and each property run's formatting once, so a document with
many hidden paragraphs or long style chains no longer resolves the
chains again for every paragraph and run. Character styles are applied
as a change to the paragraph's formatting.

A bin table whose file positions do not rise, a property page listed
twice, pages whose runs overlap, and styles based on each other in a
loop are refused as damaged, as MS-DOC requires (PlcBteChpx, ChpxFkp,
StdfBase). Property runs refer to their page instead of copying it.
2026-11-02 12:03:57 +07:00
dotCooCoo bb354fc92a .ai import: page art moved to its artboard takes its pattern tiles along
Art taken from a `.ai`'s PDF part on a later page is moved to where the
editing data puts that artboard. The move left pattern fills and strokes
where they were, so their tiles no longer lined up with the art. This
happened in three places: the page art that stands in for an unread
object (#5050), the page's type given to text objects, and the art on
each page when the file comes in as its PDF part with the artboard
layout kept. Each move now transforms the pattern tiles too.
2026-11-02 12:03:56 +07:00
dotCooCoo cbd4dd5599 Docs: list every case where an unread .ai object still sends the file to its page
The file-format and progress docs named three of the cases in which an
unread object's page art is not used and the file comes in as its page.
The import also does this when the object lies on an artboard that has
no page, when no page art lies inside its box, when that page art is
inside a page group with a clip, mask, transparency or appearance, when
the object holds a frame of threaded type, and when the page art uses a
pattern, image or swatch that the page lacks or that differs from the
editing data's (`replace_unread` and `copy_page_resources` in
`crates/eps/src/import/native/build.rs`).
2026-11-02 12:03:56 +07:00
dotCooCoo 9596130be4 .ai import: Objects on Path records measure each group once
Each Objects on Path record measured the bounds of every object it names,
and checked its path, before it was turned down. A thousand copies of a
record whose object is a group of 20,000 paths took 5.6 s to open instead
of about 50 ms. A record now checks its group and ids first, and the path
and objects of a group are measured for one record at most.
2026-11-02 12:03:56 +07:00
dotCooCoo afeb4a8574 Docs: the .ai issue counts in G9 and the file-exchange discount are dated
Both passages still name guides among the open .ai issues. They now say the
counts were measured on 2026-10-10, before #779 closed.
2026-11-02 12:03:55 +07:00
dotCooCoo 6bf2941f28 Docs: .ai guides are no longer listed as lost
#5057 opens ruler guides and guide objects from a .ai's editing data and
closed #779. The File formats row of docs/target-app-parity.md, the known
failures in docs/file-format-parity.md, G9 in docs/gaps.md and
docs/roadmap.md still listed guides as lost.
2026-11-02 12:03:55 +07:00
bflatastic 54b79c02b0 .ai import: Convert to Shape records string entries through the shared dictionary parser 2026-11-02 12:03:54 +07:00
dotCooCoo e130cf3e0c .ai import: Convert to Shape opens live on paths and type
Squashed from #5142 onto main.
2026-11-02 12:03:54 +07:00
dotCooCoo 664fe8a12b .ai import: Stylize effects open with their saved settings
An object whose art style holds Drop Shadow, Inner Glow, Outer Glow,
Feather, Round Corners or Scribble now opens as itself with those
effects live, in their order. Feather is read under the name and key
the files use (`Adobe Fuzzy Mask`, `Radius`).

Each setting is read only when it is written as its kind (`/Int`,
`/Real`, a fill style for a color) with a value in range. An unknown
key or choice, a missing setting, or a Scribble with a color of its own
keeps the drawn look, where the reader used to cast, clamp or default
the value.
2026-11-02 12:03:53 +07:00
dotCooCoo f024f5a5f2 Variables: Export Data Sets marks visibility and image columns with # and @
Squashed from #5141 onto main.
2026-11-02 12:03:52 +07:00
bflatastic 78014a1b43 Variables: Import Data Sets and Load Variable Library record their step through edit_variables 2026-11-02 12:03:49 +07:00
dotCooCoo a6ce22da5c Variables: an import or library load that changes nothing adds no undo step
dataset.import and variable.loadLibrary added an undo step, cleared Redo
and marked a saved document modified even when the variables and data
sets came out as they were, such as the same CSV or library loaded
again. Both now build the new variables on a copy and record a step only
when it differs. variable.loadLibrary's params text and docs/mcp.md say
so.
2026-11-02 12:03:45 +07:00
dotCooCoo d0749dde41 Variables: Update Data Set keeps a row's values when every bound object is locked
Squashed from #5126 onto main.
2026-11-02 12:03:41 +07:00
dotCooCoo d9024f9c31 Variables: a command that changes nothing adds no undo step
Squashed from #5130 onto main.
2026-11-02 12:03:41 +07:00
dotCooCoo 06221ce545 Variables: a CSV header that names one variable twice is refused
dataset.import read two header cells that named one variable (City
and City, or Shown and #Shown) into the same column, so each row kept
only the last non-blank cell and the other value was dropped without a
word. The import is now refused with the two column numbers, and the
message has a row in every complete-message catalog.
2026-11-02 12:03:40 +07:00
dotCooCoo 386bfc881e Docs: move the import value error note next to the data set warning 2026-11-02 12:03:39 +07:00
dotCooCoo 660102064f Variables: Import Data Sets reports why a cell was refused
dataset.import replaced the reason for a refused cell with "value for
`X` must match its variable kind", so a visibility value such as
maybe and a graph value over 262,144 bytes gave the same message. The
error now keeps the line and gives the reason, and both messages have
a row in every complete-message catalog.
2026-11-02 12:03:38 +07:00
dotCooCoo 1be658c88c Variables: Export Data Sets refuses more data sets or variables than Import Data Sets reads
dataset.export checked only the 1 MiB size, so a document with more than
1000 data sets or 256 variables exported a CSV that dataset.import then
refused. Export now refuses such a document with a message naming the
limit, and the messages have rows in every complete-message catalog.
2026-11-02 12:03:37 +07:00
dotCooCoo adb446049b Variables: Undo and Redo clear a highlight that names no variable
Undo, Redo and a canceled undo group put back an earlier document but
left the Variables panel highlight as it was. After renaming the
highlighted variable and undoing, the highlight still named the new
name: a variable defined later under that name showed highlighted
without a click, and Delete removed it.

Each of these paths now clears a highlight whose variable the restored
document does not define, as Delete Variables and Load Variable Library
already did.
2026-11-02 12:03:36 +07:00
dotCooCoo 0ccc6d9df5 .ai import: paths keep their notes and Show Center
Squashed from #5129 onto main.
2026-11-02 12:03:35 +07:00
dotCooCoo c21ff5698e Tests: move the legacy type tests next to the text object tests
The legacy type helpers and tests move from the end of crates/eps/src/import/ai/tests.rs to after text_objects_are_slots_named_after_their_story, and the helper stream7 is renamed type_stream7.
2026-11-02 12:03:33 +07:00
dotCooCoo db11446502 .ai import: legacy type keeps its spacing, hanging punctuation and hyphenation
Legacy type (`To` ... `TO`) now reads `min opt max TC` and `min opt max TW`
into the paragraph's letter and word spacing, `hangingQuotes Tq` into Roman
hanging punctuation, and `hyphenate limit lead tail max Th` into hyphenation
on or off, After First, Before Last and the Hyphen Limit (0 when the limit
flag is 0). Values are kept to the ranges the Justification and Hyphenation
options take, and a spacing triple out of order goes back to its default.

Operands of the legacy type attributes are read by their place: an attribute
whose operands are missing, are not numbers, or are flags other than 0 and 1
stays as it was. Before, a value that was not a number shifted the later
operands (`5 /x 7 Ti` set indents of 5, 7 and 0), and a bad `TA` or `Ta`
turned kerning on or set the alignment to left. One long `Tx` no longer goes
past the reader's limit on characters.
2026-11-02 12:03:33 +07:00
dotCooCoo 06d037c1b2 .ai import: a clipping path keeps its stroke
A clipping path painted with a stroke (`W S`, `W B`) lost the stroke when
a .ai file opened from its editing data. The clipping path now keeps it,
and it paints over the clipped art as a clipping path's stroke does in
VectorCraft. A gradient-filled clipping path stroked with `1 BB` or `2 BB`
put the stroke on the painted copy of its fill, under the clipped art; it
now goes on the clipping path too. Several clipping paths in one group
make one compound path, which keeps their stroke, opacity and blend mode
when they all have the same ones.
2026-11-02 12:03:31 +07:00
dotCooCoo fa8d3b8de4 Fix #3797: documents open in Preview, and Outline is a setting of each document
View > Outline was one app-wide flag saved in the interface preferences,
so after Cmd+Y every later launch drew every opened or new document as
outlines, with no fills. The flag is now part of each document's view:
a document opens in Preview, each tab shows its own Outline or Preview,
and the setting is not saved at launch. An older preferences file that
holds the flag still loads, and its value is ignored.

The Outline command and ui.set's outline act on the active document and
are an error without one.
2026-11-02 12:03:30 +07:00