Commit Graph
4947 Commits
Author SHA1 Message Date
FredApps f5f7084fc3 Merge pull request #1845 from dotCooCoo/feat/table-go-to-row
Tables: Table › Go to Row… selects a row by its number
2026-11-12 18:58:57 +01:00
autocraft-bot[bot] f82f147127 Merge pull request #2703 from dotCooCoo/fix/text-frame-inset-link-mixed
Text Frame Options: link the insets only when every selected frame has even sides
2026-11-12 17:51:29 +00:00
autocraft-bot[bot] 8ee3c1f7d0 Merge main into fix/text-frame-inset-link-mixed 2026-11-12 17:34:04 +00:00
Codex e81b2ea99e Merge main and preserve table query options and ID guidance 2026-11-12 18:13:30 +01:00
FredApps ed6bb0e093 Merge pull request #2696 from dotCooCoo/fix/idle-frame-page-count
Canvas: an idle frame paints and looks up only the spreads in view
2026-11-12 18:07:19 +01:00
FredApps 65dd56d7a6 Merge pull request #2671 from dotCooCoo/fix/satin-follows-image-edge
Render: satin and center inner glow on an image follow its painted edge
2026-11-12 18:06:50 +01:00
FredApps 04597b0652 Merge pull request #2657 from dotCooCoo/fix/keep-shadow-images
Render: keep drop shadow and outer glow images while an object moves
2026-11-12 18:06:07 +01:00
FredApps a5be0905dd Merge pull request #2649 from dotCooCoo/fix/merge-image-fields
Data merge: an image field in text places the image, not its path
2026-11-12 18:05:02 +01:00
FredApps 9aa103b3a8 Merge pull request #1843 from dotCooCoo/fix/copied-story-anchor-table-ids
Copy: copied text gets text anchors and tables of its own
2026-11-12 18:04:28 +01:00
FredApps 31d4c7f7f4 Merge pull request #2665 from dotCooCoo/feat/paste-clipboard-image
Paste: images on the system clipboard paste as embedded images
2026-11-12 18:03:55 +01:00
FredApps f3f5cd3e23 Merge pull request #2589 from dotCooCoo/fix/nested-anchored-frame-placement
Anchored text frames: place a frame anchored inside another anchored frame
2026-11-12 18:02:52 +01:00
FredApps e8276337a3 Merge pull request #2354 from dotCooCoo/fix/table-story-target
Reject ambiguous table IDs across stories
2026-11-12 18:02:30 +01:00
FredApps 811c349b39 Merge pull request #2653 from dotCooCoo/fix/pages-thumbnails-per-edit
Pages: an edit no longer renders every page thumbnail again
2026-11-12 18:01:44 +01:00
FredApps b70472bc52 Merge pull request #2647 from dotCooCoo/feat/non-rectangular-frame-inset
Text Frame Options: a non-rectangular frame shows one Inset field
2026-11-12 18:00:15 +01:00
FredApps 448ec5e468 Merge pull request #2660 from dotCooCoo/fix/cmyk-view-conversion
CMYK view: convert the blended inks to screen colours on the render threads
2026-11-12 17:59:36 +01:00
FredApps 4d86f3e34a Merge pull request #2355 from dotCooCoo/fix/mcp-dirbuilder-windows
Fix MCP temporary directory build on Windows
2026-11-12 17:58:36 +01:00
FredApps b7321d31b8 Merge pull request #2659 from dotCooCoo/feat/justification-auto-leading-single-word
Justification: the dialog sets Auto Leading and Single Word Justification
2026-11-12 17:58:12 +01:00
FredApps 6e50ee3974 Merge pull request #2650 from dotCooCoo/feat/paragraph-value-checks
Text: paragraph spacing and justification values are checked
2026-11-12 17:57:35 +01:00
FredApps 2522b78ef3 Merge pull request #2656 from dotCooCoo/fix/preflight-off-interface-thread
Preflight: check the document on a background worker, not on every edit
2026-11-12 17:56:38 +01:00
Dylan M. Taylor e2b5dbaa8a Merge pull request #2648 from dotCooCoo/fix/issue-1999
Compose: vertical Center, Bottom and Justify measure to the last baseline
2026-11-12 11:29:27 -05:00
dotCooCoo 20319e991e Text Frame Options: link the insets only when every selected frame has even sides
The dialog turned the inset link on when the first selected frame had the
same inset on all four sides. With a second frame whose sides differ, typing
one side then set all four sides of every selected frame, so the second
frame lost its other insets.

The link is now on only when every frame the dialog changes has even sides:
the selected items, else the caret's frame, else every frame of the caret's
story.
2026-11-12 08:07:12 -08:00
dotCooCoo 7604db695f Copy: point copied cross-references at copied anchors in one pass
Each copied story with text anchors walked every story copied before it
to retarget their cross-references, so copying many such frames took
time quadratic in their number. The copies' cross-references are now
pointed at the copied anchors once, after the last item is copied.
2026-11-12 07:57:27 -08:00
jayzed80 5c484618ca Save: a TIFF, BMP or PSD too big for opening to inflate is stored as is, so the document reopens (#2283) (#2701)
save deflated every asset that isn't PNG, JPEG, GIF or WebP, with no size
cap, while opening refuses a deflated asset over 1 GiB or deflated entries
over 4 GiB together. An asset past either cap is now stored as is, which
opening reads at any size. Smaller assets are deflated as before, and the
zip bomb guard on load is unchanged.
2026-11-12 15:53:23 +00:00
dotCooCoo 329806477e Data merge: an explicit QR role in text is refused, and the caret follows each field
data.placeholder.add with role qr and the insertion point in text bound
the QR code to the first selected frame, which the caret was not in. It
now returns "qr placeholders bind to a frame", as a QR field there does.

A field inserted at the insertion point left the caret before its
marker, so a second field went in front of the first. The caret now
moves past the marker, as after typing.

Docs: docs/agents.md.
2026-11-12 07:45:10 -08:00
dotCooCoo c2a1543528 Copy: mark the renumber results as must-use
renumber and its helpers return false when a copy nests deeper than
MAX_COPY_DEPTH and must not be inserted. They now carry #[must_use], so
a caller that drops the result fails to build under -D warnings.
2026-11-12 07:40:29 -08:00
dotCooCoo 092c46c148 Render: list layers among the kept shadow image's dependencies
The doc comment on with_kept_filters now names the document's layers next to its colors, styles and images, as Deps holds them.
2026-11-12 07:39:06 -08:00
Adithya Shankaran 92043b4c48 Automation roots: refuse COM¹ to LPT³ and a device name before a colon (#2383)
* Automation roots: refuse COM¹ to LPT³ and a device name before a colon

is_device_name missed COM¹, COM², COM³ and LPT¹, LPT², LPT³, which Windows reserves as it does COM1.
It also cut the name only at a period, so COM1: and NUL:x were not seen as device names.

* Credit my name in the About window

* Automation roots: document the device-name tests

CodeRabbit's docstring check counts the touched tests. same_component stays without a doc comment, because #2205 deletes that function and a doc line above it conflicts.

* Automation roots: record the device-name refusal

The MCP roots description and the roadmap now name COM¹ to LPT³ and a device name before a colon.
2026-11-12 15:09:39 +00:00
dotCooCoo 5858ccfec1 ROADMAP: the idle canvas frame entry moves to the top of the progress log
The progress log is newest first, and the 2026-11-12 entry sat among the
2026-10-30 entries.
2026-11-12 06:28:18 -08:00
dotCooCoo 767c0a542b Canvas: an idle frame paints and looks up only the spreads in view
Every frame, the canvas painted the page shadow, paper, edges, guides,
margins and frame edges of every spread in the document, and looked up
the composed story of every text frame that ends a story to place its
overset mark. Each lookup walks the document, so an idle frame cost
more with every page added, and faster than the page count grew.

Those shapes are now painted only where they reach into the canvas
view: spreads by their bounds, bleed and slug outlines, page grids and
guides by their own rectangles, and frames by a rectangle around their
anchors, handles and nested objects. A story is looked up only for a
frame in view. What shows in the view is the same.

In a 400-page document with two frames a page, an idle canvas frame
painted 5,099 shapes and looked up 400 stories; it now paints 311 and
looks up 1, the same as in a 4-page document.

Part of #1343. Refs #1411, #2298.
2026-11-12 06:00:49 -08:00
dotCooCoo fad00dd646 Data merge: an image field in a table cell or a note is refused by name
With the insertion point in a table cell or a note, data.placeholder.add
with an image field returned "a hyperlink field can't go in a table cell
or a note". It now returns a message about image fields that names the
two ways on: bind the field to a frame, or pass role text to merge its
path. Nothing is inserted on the error, and role text still puts the
marker in the cell.

Docs: docs/agents.md and the command's params text.
2026-11-12 05:58:02 -08:00
dotCooCoo 375a7b48b1 Merge main into fix/merge-image-fields
# Conflicts:
#	crates/engine/src/cmd/datamerge.rs
2026-11-12 05:21:21 -08:00
autocraft-bot[bot] a17fb5d3d8 Merge pull request #2341 from Hamza0101/fix/datamerge-fields-in-tables
Data Merge: a field in a table cell goes into the cell and is filled (#2315)
2026-11-12 12:00:52 +00:00
autocraft-bot[bot] 424d08d935 Merge main into fix/datamerge-fields-in-tables 2026-11-12 11:38:19 +00:00
Dylan M. Taylor 027bbae9cb Engine: index style, tag, swatch and run lookups; bound polygon sides, Change All and spelling candidates
* fix(engine): index lookups that were quadratic in a document's styles, tags, swatches and runs

* address review: first swatch per name in book sync; bound spelling input before collecting

* address review: keep the last source style per name in book sync; bound GREP replacement bytes while generating them

* address review: write GREP replacements into a byte-bounded buffer; gate keep_last test off wasm

* merge main into fix/sec-engine-linear-lookups

* address review: make the suggestion length-cap test deterministic
2026-11-12 06:28:15 -05:00
Dylan M. Taylorandautocraft-bot[bot] ff0463e299 Exports: leave out text the page doesn't show (inherited conditions, deletions, hidden layers)
* fix(export): leave out text hidden by inherited conditions or deletion in every exporter

* address review: skip hidden frames in page text and hidden article items; first visible paragraph as nav label; read table anchor's own format

* address review: skip nonprinting frames and non-printable layers in fixed-layout page text

* Apply review fixes

- crates/epub/src/html.rs
- crates/engine/src/cmd/export/formats.rs

* Apply review fixes

- crates/epub/src/html.rs
- crates/engine/src/cmd/export/formats.rs

* address review: fixed-layout page text skips frames in inactive object states

* address review: place a threaded story at its first shown frame; skip it only when every frame is hidden

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-12 06:28:07 -05:00
Dylan M. Taylorandautocraft-bot[bot] b7174dc92d Engine: bounded DTD validation, compound-path hole orientation
* dtd: bounded matching steps, element depth and problem count

* address review: stop DTD matching when a step charge fails; refuse hole orientation past its budget

* Apply review fixes

- crates/engine/src/dtd.rs

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-12 06:27:59 -05:00
Dylan M. Taylorandaiongg 568f25fa9f Fonts: cap decoded names, bound outline flattening, cache fallback coverage
* fonts: cap decoded names, outline flatten tolerance by size, coverage cache for system fallback

* Apply review fixes

- crates/fonts/src/fontdb/system.rs
- crates/fonts/src/fontdb/names.rs

* Apply review fixes

- crates/fonts/src/fontdb/system.rs

* address review: cap flattened edges in has_serifs

* address review: check alias blankness before capping

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-12 06:27:53 -05:00
Dylan M. Taylor 665fe2a8e4 Format: a failed entry read counts against the archive budget
* format: bytes a failed entry read inflated count against the archive budget

* address review: mutate the payload bytes explicitly in the checksum test

* address review: charge a failed read to the budget it belongs to (stored vs deflated)
2026-11-12 06:27:47 -05:00
Dylan M. Taylor 26d5c8941c IDML: story export and object-style overlay in linear time, embedded image budget
* idml: story runs and marker offsets found once, object-style overlay by position, embedded image budget

* address review: saturating embedded-bytes counter

* address review: IDML export past the embed limit succeeds and warns for each image written as a link

* address review: an unlinked image is always embedded, only linked ones fall back to their link
2026-11-12 06:27:41 -05:00
Dylan M. Taylor a41fc046f3 Data merge: a record range stops expanding once the limit is met
* Data merge: a record range stops expanding once the limit or the record count is met
2026-11-12 06:27:35 -05:00
Dylan M. Taylor eb0ea78d9a Images: a WebP with an ICC chunk longer than the file is read without its profile
* Images: a WebP whose ICC chunk declares more than the file holds is read without it
2026-11-12 06:27:29 -05:00
Dylan M. Taylorandautocraft-bot[bot] 23465223bc xtask: refuse an oversized corpus archive before extracting it
* xtask: refuse a corpus archive that expands past the cap before extracting it

* address review: a within-cap answer needs tar to exit successfully

* Apply review fixes

- xtask/src/main.rs

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-12 06:27:24 -05:00
Dylan M. Taylor f87c24a1cd PPTX export: bound the retained glyph-to-character maps
* PPTX export: keep only the last four faces' glyph-to-character maps
2026-11-12 06:27:18 -05:00
dotCooCoo ed9980fec2 Paste: params text gives the pasted image's size as one point per pixel
edit.pasteImage sizes a new frame as File › Place does, which reads a
raster at one point per pixel and does not read a stored resolution.
The params text and the comment said otherwise.
2026-11-12 00:39:11 -08:00
dotCooCoo 346a0b24a2 Paste: objects copied over empty clipboard text paste from the menu
With a native menu, Copy saved the clipboard's empty text as the copy's text, so the next Paste took the older image, which the paste then skipped, and nothing was pasted. Empty text now counts as no text at the copy, as it does at the paste.
2026-11-12 00:12:21 -08:00
dotCooCoo 915be8561e Paste: an image past the size limit is refused before its pixels are copied
ClipboardImage::from_color_image checks the size before it copies the pixels, so an image egui delivers with Ctrl/Cmd+V that is over 64 million pixels is not copied before the paste refuses it.
2026-11-12 00:05:58 -08:00
dotCooCoo 5932810b1f Render: a center inner glow on an image fades around small transparent holes
The coverage was eroded by sampling two rings of points, which could miss a hole smaller than the gaps between them. Erosion now takes the smallest alpha within an octagon of the band's radius, in four passes along the axes and the diagonals.
2026-11-12 00:04:46 -08:00
dotCooCoo 7af4d75539 Render: plain satin with no distance on an image is not drawn
Both shifted copies are the same at distance 0, so the coverage mask is empty. The effect is now skipped before the image is drawn offscreen and scanned.
2026-11-12 00:00:46 -08:00
dotCooCoo c3a7deb21a Render: satin on an image compares partial coverage
Satin on a frame holding a graphic draws the object's coverage once
offscreen and compares the two shifted copies pixel by pixel, taking the
difference of their coverages. A partly transparent area that both copies
cover equally gets no plain satin, so a uniformly half-transparent image
no longer shows satin across its middle. Inverted satin keeps the
object's coverage where the copies agree.

The offscreen coverage for satin and for a center inner glow on a graphic
now covers its whole area at a lower resolution when it would be wider
than the largest raster side or hold more than 4096 x 4096 pixels.
2026-11-11 23:23:50 -08:00
dotCooCoo 7a5924e971 Render: center inner glow on an image follows its painted edge
Inner glow from the center on a frame holding an image filled the
frame's shape, so it painted over the transparent parts of the image.
It now draws the object's coverage once offscreen, shrinks it by the
glow's band, colors and blurs it, and keeps the result to the painted
pixels. Partly transparent pixels keep their coverage.
2026-11-11 22:52:07 -08:00