Commit Graph
836 Commits
Author SHA1 Message Date
BFlat 3ce7b256b6 Merge pull request #7735 from dotCooCoo/fix/ai-cs-type-from-editing-data
.ai import: files saved for version 11 take their type from the text document
2026-11-15 11:36:41 +07:00
BFlat 26878d3d0e Merge pull request #7715 from dotCooCoo/fix/svg-open-path-type-before-start
Type on a path: type on an open path can start before the path
2026-11-15 10:46:42 +07:00
dotCooCoo e328b4178e Merge main into fix/ai-cs-type-from-editing-data 2026-11-14 19:00:51 -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 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
dotCooCoo 4887305f00 .ai import: files saved for version 11 take their type from the text document
Files saved for version 11 write the keys of their text document by name
(/DocumentResources, /FontSet, /StreamTag) and the kinds of its strikes
by their long names (/FrameStrike). The reader found no stories in them,
so their text objects were filled with the page's type in painting
order: type outside the artboards was lost, and type on them could land
in another text object.

The keys the reader uses now get their numbers from the dictionary they
sit in, from the root down, before the document is read. A run whose
style is written by name as a style's number takes that style. Files
saved for later versions that write a newer key by name among the
numbered ones (a font record's VersionString, a paragraph's
ParagraphDirection) have those keys read too.
2026-11-14 18:26:22 -08: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
dotCooCoo 67f427b2b4 Merge main into fix/ai-pen-samples-test-after-path 2026-11-14 16:21:15 -08:00
dotCooCoo 094971e3ac Type on a path: type on an open path can start before the path
Type on an open path can now start before the path's start: its start
is stored below 0, the span runs from there, and the characters whose
middle falls before the path's start are not drawn, as SVG 2 lays out
text on a path (https://www.w3.org/TR/SVG2/text.html#TextLayoutPath).
The text keeps every character, and the start bracket stays at the
path's start. Past the path's end, text that does not fit is overflow,
as for other type on a path. Type that starts on the path draws every
glyph as before.

- SVG import keeps a <textPath> start before an open path's start
  (text-anchor end or middle, or a negative startOffset) instead of
  starting the text at the path's start, which drew every character.
- SVG export writes it as a negative startOffset.
- PDF export writes only the characters drawn on the path.
- The legacy .ai and .ai editing data writers write the type from the
  path's start with the type attributes warning.
- type.pathOptions takes a start below 0 for type on an open path; on a
  closed path it is the path's start, as before. A flip starts the type
  at its start bracket. Dragging the center bracket slides it from where
  it starts, and no further before the path.
- A click at the path's start places the caret by the first drawn
  character, and the caret in the hidden characters stands at the
  path's start. The highlight of substituted fonts and glyphs leaves
  them out.
- Release Type on a Path keeps the first drawn glyph where it was
  drawn, with the hidden characters before it.
- The Touch Type tool shows no box for a hidden character, and
  text.touchType returns an error for one. A character with a drawn
  glyph is changed by that glyph.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-14 15:44:12 -08:00
dotCooCoo bc2b5dbae6 .ai save: graph round trips leave out the art bounds the reader measures
Opening an .ai graph now sets placed_art from the art as read (main's d3789f2b0c), so the comparison in the graph round-trip tests leaves it out, as it already leaves out placed.
2026-11-14 15:37:51 -08:00
dotCooCoo dba42af495 Merge main into feat/ai-save-graph-records 2026-11-14 15:21:09 -08:00
BFlat 4cf0a4b182 Merge pull request #7474 from dotCooCoo/feat/ai-insert-aki
Type: .ai import reads Insert Aki, and .ai save writes it
2026-11-15 06:18:04 +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 4fffbce639 Merge pull request #7614 from dotCooCoo/fix/export-cull-brushed-path-art
PDF, EPS and print: a brushed path just off the page whose brush paints onto it is written
2026-11-15 06:17:15 +07:00
BFlat 52ec037f4a Merge pull request #7425 from dotCooCoo/fix/ai-envelope-budget-warped-type
.ai save: images with a Warp count against the envelope limit
2026-11-15 05:30:30 +07:00
dotCooCoo 31c056621d .ai import: pen-sample test checks each Calligraphic setting on its own
The test for a Calligraphic path followed by samples of the pen varied
the diameter, roundness and angle with the pen all at once. It would
still pass if the reader checked only one of the three settings, left
out Tilt, or tested the pen modes and the variations separately.

- Four new cases vary one setting with the pen and fix the other two:
  the diameter with the pressure, the diameter with the tilt, the
  roundness with the bearing and the angle with the rotation. Each
  keeps the drawn look with its note.
- A new brushed case pairs a Random setting that varies with a pen
  setting that varies by 0. The path comes in brushed.

Follow-up to #7367.
2026-11-14 14:09:25 -08:00
dotCooCoo 1ceff4dec8 .ai import: pen-samples test checks a brushed path after the samples
The check that pen samples mark only the object before them used an
unbrushed filled rectangle as the following object. A style with no
brush ignores the samples, so the check passed even when the samples
marked every later object. The following object is now an unsampled
path with the same pen-varying Calligraphic brush, and the test asserts
that it comes in as a path stroked with that brush.
2026-11-14 13:59:20 -08:00
dotCooCoo b12c78a731 Graphs: Outline Stroke and a graph left with only labels keep the plot in place
- Outline Stroke on a graph's strokes, including Object > Expand with
  Stroke on, adjusts the bounds the graph keeps, the same way
  Create Outlines on its labels does. Before, the stroke outlines
  changed the bounds of the art without type, and the next redraw
  stretched the plot by the width the outlines added.
- A graph that keeps `placedArt` and has no art other than type left
  is no longer measured on the bounds of all its art. A label edit on
  such a graph moved and stretched the plot at the next redraw; the
  plot now stays where it is.
- A redraw no longer measures a move or scale on art that has no width
  or no height now, such as a graph left with one axis line. Before,
  the plot collapsed to no width.
- A clipping group in a graph that holds type is measured on its clip
  when the clip does not depend on type, so moving art outside the clip
  does not change the bounds. Blends, envelopes and repeats are
  measured whole, as they are drawn.
- The doc crate's helper is named `graph_art_without_type` and sits
  with the file's other free functions.
- docs/mcp.md lists Outline Stroke and states that moving an outlined
  label, a swatch, an axis or a tick mark on its own can move or scale
  the plot, and that a graph left with only labels, or with art that
  has no width or height, does not follow a move.
- Tests: a scale of the graph made before outlining a label, a move of
  a graph opened from `.ai` after its label is restyled and moved,
  Outline Stroke after a move, a graph left with only its labels or
  with one line, and clipping groups holding type.
2026-11-14 13:45:46 -08:00
dotCooCoo 6a5110a40c Merge main into feat/ai-save-graph-records 2026-11-14 13:27:39 -08:00
BFlat 3ccafde99f Merge pull request #7466 from dotCooCoo/fix/ai-wrap-options-edge-cases
.ai save: text wrap fixes for cut-away clipping fills and symbols without room
2026-11-15 04:22:46 +07:00
BFlat 20ae675b9b Merge pull request #7622 from dotCooCoo/fix/graph-label-restyle-keeps-plot
Graphs: restyling the labels leaves the plot where it is at the next redraw
2026-11-15 04:22:27 +07:00
BFlat e6b31e00d2 Merge pull request #7458 from dotCooCoo/fix/eps-cshow-composite-codes
EPS import: cshow runs once for each character of a composite font
2026-11-15 04:22:01 +07:00
dotCooCoo 1586719898 Tests: Insert Aki fixture sets kinsoku_sets
main added Texts::kinsoku_sets; the a_run_keeps_its_insert_aki fixture now sets it to an empty list, as the other Texts fixtures do.
2026-11-14 12:47:23 -08:00
dotCooCoo 71b7414af9 Merge main into feat/ai-insert-aki 2026-11-14 12:30:41 -08:00
dotCooCoo 4ee24a8bbe Merge main into fix/export-cull-brushed-path-art 2026-11-14 12:29:41 -08:00
BFlat 2e3fc0b59a Merge pull request #7616 from dotCooCoo/fix/ai-save-outlined-wrap-object
.ai save: type written as outlines keeps wrapping by its bounds
2026-11-15 03:22:56 +07:00
BFlat c6c06b2c68 Merge pull request #7442 from dotCooCoo/fix/eps-ryumin-light-h
EPS import: Ryumin-Light-H and GothicBBB-Medium-V read as Japanese type without their CIDFont
2026-11-15 03:19:37 +07:00
dotCooCoo b374d1f2c0 EPS import: cshow over a descendant without a matrix sees it at its drawn scale
When a Type 2 CIDFont or a Type 42 descendant of a composite font has no FontMatrix, the
font a cshow procedure sees as current now takes the identity as its default, as glyph
measuring and drawing do, instead of the 1/1000 default of other fonts.
2026-11-14 11:03:23 -08:00
dotCooCoo b12d4794a0 Merge main into fix/eps-cshow-composite-codes 2026-11-14 10:29:48 -08:00
dotCooCoo 37f06a86ee Merge main into fix/ai-wrap-options-edge-cases 2026-11-14 09:46:27 -08:00
dotCooCoo 29be6fc287 Merge main into fix/ai-envelope-budget-warped-type 2026-11-14 09:46:10 -08:00
BFlat 67f6d3a50f Merge pull request #7593 from dotCooCoo/fix/ai-writer-wrap-comment
PDF/.ai export: the comment gives the present reason area type with wrap shapes is written as outlines
2026-11-15 00:42:14 +07:00
dotCooCoo b4eee0faca Merge main into feat/ai-save-graph-records 2026-11-14 09:42:05 -08: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 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 1b2a4b39d5 Merge pull request #7557 from dotCooCoo/fix/eps-kshow-composite
EPS import: kshow runs its procedure between the characters of a composite font
2026-11-15 00:39:59 +07:00
dotCooCoo d3789f2b0c Graphs: outlined labels and opened .ai graphs keep the plot in place at the next redraw
- A graph opened from a .ai file now saves `placedArt` too. Moving or
  restyling one of its labels before the first redraw no longer moves or
  stretches the plot.
- Type > Create Outlines on a graph's labels now adjusts the saved bounds,
  so the outlines do not read as a move at the next redraw. A move of
  the graph made before the outlining is still followed.
- A `placedArt` with no width or height falls back to the bounds of all
  of the art, as a graph saved without it does.
- `art_bounds` moves to the doc crate so the .ai reader can use it.
- docs/mcp.md describes `placedArt`, `placed` and when a redraw follows
  a move.
- Tests: a legend across the top, a legend after a right value axis and
  legend labels of several lines keep the plot in place through label
  size changes; moving a category label on its own; outlining labels
  before and after a move; a flat `placedArt`; a label moved in an
  opened .ai graph.
2026-11-14 08:47:03 -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 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 a40f00ece9 Merge main into fix/export-cull-brushed-path-art 2026-11-14 07:25:25 -08:00
dotCooCoo f4492c3627 Merge main into fix/ai-wrap-options-edge-cases 2026-11-14 07:19:26 -08:00
BFlat 3a80dfcd36 Merge pull request #7471 from dotCooCoo/fix/followup-7319
.ai save: a clipping path cut away outside keeps its text wrap options
2026-11-14 21:55:38 +07:00
BFlat cbba5e85fe Merge pull request #7528 from dotCooCoo/feat/ai-style-named-gradients
PDF/.ai import: graphic styles that paint with a named gradient load with it
2026-11-14 21:54:55 +07:00
BFlat cb99b78a40 Merge pull request #7441 from dotCooCoo/fix/eps-johab-code-space
EPS import: KSC-Johab type reads one-byte ASCII codes
2026-11-14 21:54:39 +07:00
BFlat a15b44fbe4 Merge pull request #7492 from dotCooCoo/fix/eps-bitmap-glyph-rollback-test
EPS: a test covers type taken back with its color bitmap glyph images
2026-11-14 21:51:13 +07:00
dotCooCoo 80854eb4b8 Merge main into fix/export-bakes-symbol-art-effects 2026-11-14 06:00:09 -08:00
dotCooCoo e086cf6d83 PDF, EPS and print: brush art painting onto the page keeps its path 2026-11-14 05:51:22 -08:00
BFlat 94237e00a9 Merge pull request #7268 from dotCooCoo/fix/ai-warped-image-pieces-cropped
.ai export: the pieces of a warped image write only the pixels they show
2026-11-14 20:38:46 +07:00
BFlat 31f6a9f15e Merge pull request #7367 from dotCooCoo/fix/ai-calligraphic-samples
.ai import: Calligraphic paths with pen samples keep their drawn look
2026-11-14 20:38:22 +07:00