Commit Graph
1626 Commits
Author SHA1 Message Date
aiongg 18e1ba14b3 DES-10 T11: docs for linked artwork and multi-image placement 2026-11-14 12:28:58 +00:00
aiongg c8f105dd65 Merge pr-2308 (place contact sheet) into multi-place 2026-11-14 05:49:47 +00:00
aiongg 62f70cc03c Merge branch 'pr-2309' into multi-place 2026-11-14 05:49:14 +00:00
aiongg 2ee301bd4b Merge pr-2302 (place cursor queue) into multi-place 2026-11-14 05:49:14 +00:00
aiongg 1a156fa564 Merge remote-tracking branch 'upstream/main' into image-perf
# Conflicts:
#	crates/images/src/jpeg.rs
#	crates/images/src/lib.rs
2026-11-14 04:29:08 +00:00
aiongg eefdfbb688 Docs: image cache keeps the levels drawn; canvas decodes in the background 2026-11-14 03:32:18 +00:00
jayzed80 c509445ed0 IDML export: keep endnote reference numbers (#2753) (#2764)
The IDML story writer skipped the endnote reference character, so an
exported body story lost every endnote's place: "an endnote here. End."
with nothing between "here" and the full stop. The endnote frame's
story was written with its numbers as text, so nothing linked the
listed endnote back to where it was referenced.

Each reference is now written as its own superscript character range
holding the endnote's number, formatted by Endnote Options (start,
style, prefix and suffix) as the endnote frame lists it. IDML's
Endnote / EndnoteRange elements are not written yet.
2026-11-14 00:34:31 +00:00
autocraft-bot[bot] 0f924b71ae Merge main into fix/parallel-sync-image-decode 2026-11-13 21:12:07 +00:00
Zinadin Zidan 40cc78d8f8 Text Frame Options: insets and gutter in the ruler units (#2739) (#2754)
The Text Frame Options dialog filled its fields from the document's
ruler unit but never set the dialog's own unit, so it stayed at picas.
The spinner fields (Top, Bottom, Left, Right, a non-rectangular frame's
Inset, the column width and gutter, Paragraph Spacing Limit) showed
their values in picas whatever Preferences > Units & Increments said,
and a bare number typed in any measure field, Min under First Baseline
included, was read as picas.

The dialog now takes the document's horizontal ruler unit when it opens
and keeps it while open, as the Rectangle dialog does (#1964).
2026-11-13 21:08:26 +00:00
Dylan M. Taylor eb4fdc3096 Merge latest upstream into parallel image decode 2026-11-12 17:42:28 -05:00
.CooCooandDylan M. Taylor 437c532511 Compose: count endnote, anchored object and cross-reference marks once per story (#2705)
* Compose: count endnote, anchored object and cross-reference marks once per story

Each paragraph of a story with endnotes, anchored objects or
cross-references counted the marks before it from the story start, so
composing the story read its text once per paragraph. The marks before
each paragraph are now counted in one pass when composition starts.

* Compose: test cross-reference mark counts past the first paragraph

The mark-count fixture now puts a cross-reference in every paragraph, so the
test checks nonzero cross-reference counts and that each paragraph shows its
own cross-reference's text.

---------

Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2026-11-12 17:42:10 -05:00
Dylan M. Taylor f90cd8835d Merge latest upstream into parallel image decode 2026-11-12 17:28:47 -05:00
.CooCoo 67a5cb273e Tables: table commands are disabled with the caret in footnote text (#2706)
Footnote text is addressed as a cell, so with the insertion point in a
footnote the table commands (Insert Row, Delete Column, Merge Cells,
Table Options, Select Table, table styles) were enabled and then failed
with "no table 18446744073709551615". They are now disabled with "place
the insertion point in a table", as the cell commands already were. The
caret's footnote offset is no longer looked up in the main story either,
where it could land on a table's paragraph. table.get and the other
commands that take any selection report the same message instead of the
footnote address. A call that names a table still runs.
2026-11-12 17:27:13 -05:00
.CooCooandDylan M. Taylor 5fb75aaefc Properties: Text Frame section shows inset spacing and vertical justification (#2661)
* Properties: Text Frame section shows inset spacing and vertical justification

Properties › Text Frame now shows the frame's inset spacing under the
columns: Top and Bottom, a link that makes all four the same, then Left
and Right. A non-rectangular frame shows one Inset, the distance its text
keeps from the outline. Four buttons set Vertical Justification to Top,
Center, Bottom or Justify. Type on a path shows neither.

The section also shows with the Type tool in a frame. There it changes
the frame that shows the insertion point, or every frame that holds part
of the selected text, as Object › Text Frame Options does.

* Properties: one Inset for a non-rectangular frame keeps the other sides

The single Inset sets only the top inset, the one kept from the
outline. A rectangular frame that holds part of the same selected text
keeps its own sides.

* Properties: the one Inset field and the composer share the frame outline test

FrameOutline::of_item builds an item's outline with its corner options
applied. The composer uses it to keep the top inset from the outline,
and the Properties panel uses it to decide whether a frame shows one
Inset, so the two give the same answer for every frame.

* Text Frame Options: frames taken while typing stay with their document

OK is refused when another document became active after the dialog opened, so the saved frame ids do not change frames in that document.

* Properties: the inset link starts linked again after Revert

The link's state is kept per document state instead of per document, so
a frame with equal insets in the reverted document starts linked.

* Text Frame Options: frames taken while typing are refused after Revert

Revert keeps the document's id but replaces its state, so a new frame
can reuse a saved frame id. The dialog now ties the frames to the
document state, and OK is refused after Revert as it is in another
document.

* Properties: the one Inset of a non-rectangular frame sets all four sides

The composer bounds a shaped frame's text by its rectangle less all four
insets as well as by the outline, so a single Inset that changed only the
top left hidden sides in place: lowering a uniform 96 pt inset to 0 kept
text overset. When every frame the field changes is shaped, it now sets
all four sides. With a rectangular frame among them, only the top inset
changes and each frame keeps its other sides.

* Fix text frame dialog merge resolution

* Keep text frame preview targets fixed

* Fix target field key inference

* Tests: Text Frame Options show four sides for text through an oval and a rectangle

With the Type tool and text selected through an oval and a threaded
rectangle, with the oval as the caret's stored frame, the dialog shows
the four inset sides, a changed Top leaves the rectangle's other sides
as they were, and the link stays off while the rectangle's sides are
uneven.

* Properties: the inset link starts off when another frame has uneven sides

With selected text that runs through several frames, the link of Text
Frame > Inset Spacing started linked when the frame the section shows had
four equal insets, and a changed Top then set all four sides of every
frame. The link now starts linked only when every frame the field changes
has four equal insets. Its state is kept for that set of frames, so a link
turned on for one frame does not carry over to selected text that also
runs through a frame with uneven sides.

---------

Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2026-11-12 17:27:08 -05:00
.CooCoo c803ea80b1 Compose: vertical justification in a shaped frame tests lines to their baselines (#2708)
Center, Bottom and Justify tested every moved line except the last against
the frame's outline down to its descent, so an outline that narrows under an
earlier line held the text higher by that line's descent. Each moved line is
now tested from its top down to its baseline, and its descenders may cross
the outline, as the last line's already did. Above footnotes and in vertical
frames the descenders still stay inside.
2026-11-12 17:24:34 -05:00
Dylan M. Taylor a656db2be4 Merge upstream changes into parallel image decode 2026-11-12 17:19:59 -05:00
Dylan M. Taylor 448ac91e72 Merge pull request #2707 from dotCooCoo/fix/jpeg-screen-proxies
Images: decode JPEG screen proxies at a reduced size
2026-11-12 17:16:24 -05:00
Dylan M. Taylor 3149db327a Merge pull request #1834 from dotCooCoo/feat/duplicate-layer
Layers: Duplicate Layer copies a layer's settings and objects above it
2026-11-12 17:10:50 -05:00
Dylan M. Taylor 982dbc6c3c Merge main into parallel image decoding 2026-11-12 17:04:58 -05:00
Dylan M. Taylor 49764b0b37 Merge main into reduced JPEG proxy decoding 2026-11-12 17:03:41 -05:00
Dylan M. Taylor 30752d0130 Merge pull request #2709 from dotCooCoo/fix/opaque-image-premultiply
Render: placed images are premultiplied in their decoded buffer
2026-11-12 17:01:32 -05:00
Dylan M. Taylor e6ab0d263e Merge branch 'main' into feat/duplicate-layer 2026-11-12 16:43:33 -05:00
Dylan M. Taylor 520aeeefe1 Merge pull request #2652 from dotCooCoo/feat/text-frame-options-type-tool
Text: Text Frame Options open from the Type tool and change the frame holding the caret
2026-11-12 16:09:26 -05:00
Dylan M. Taylor 9fe0dd5197 Merge pull request #2666 from dotCooCoo/fix/recovery-off-interface-thread
Recovery: the timer writes recovery data on a background thread
2026-11-12 16:01:55 -05:00
dotCooCoo ba4f45e522 Merge main into feat/text-frame-options-type-tool 2026-11-12 12:45:20 -08:00
Dylan M. Taylor 3ebeb2ac96 Merge pull request #2669 from dotCooCoo/feat/object-style-text-frame-options
Object styles: a style sets its frames' paragraph styles and Text Frame General Options
2026-11-12 15:25:59 -05:00
dotCooCoo b0c9ce00aa Merge main into fix/opaque-image-premultiply 2026-11-12 12:25:31 -08:00
dotCooCoo 113319e3e1 Merge main into fix/jpeg-screen-proxies 2026-11-12 12:25:10 -08:00
dotCooCoo 963dc57d3b Merge main into feat/text-frame-options-type-tool 2026-11-12 12:23:08 -08:00
dotCooCoo b1ca9dd97d Merge main into feat/duplicate-layer 2026-11-12 12:23:07 -08:00
dotCooCoo 07728ede66 Merge main into fix/recovery-off-interface-thread 2026-11-12 11:26:06 -08:00
dotCooCoo b9894b47c5 Images: decode the images in view together before drawing
A render decoded each placed image that was not cached yet while drawing it,
one after another, so page thumbnails, image exports and the first canvas
frame of a page with several large photos took the sum of their decodes.

Before drawing, the renderer now lists the images in view (with the same
culling as drawing: hidden items and layers, nonprinting items, items out of
view, PDF layer choices) and decodes the uncached ones on up to eight threads,
with the mip levels they are drawn at. It leaves the work to the render when
fewer than two images need decoding, on the web, and in Fast display. The
images it decodes stay within what the cache keeps, sized by their pixels
(PDF pages and SVGs at the size they are rasterized at), and decodes in
flight together stay within half the cache budget.
2026-11-12 11:15:41 -08:00
dotCooCoo ff12f718b6 Merge main into fix/opaque-image-premultiply 2026-11-12 10:53:49 -08:00
dotCooCoo 9f4a62776e Merge main into fix/jpeg-screen-proxies 2026-11-12 10:52:07 -08:00
Codex 2a2d73ead9 Merge main preserving incremental composition and alpha-wrap caching 2026-11-12 19:41:39 +01:00
dotCooCoo 4e363e1bfa Render: placed images are premultiplied in their decoded buffer
Decoding a placed raster built a second full-size pixel vector from the
RGBA image and premultiplied every pixel into it. The pixels are now
premultiplied in place, opaque pixels are skipped, and the buffer becomes
the pixmap's pixels without a copy (bytemuck's cast_vec, with a copy when
the capacity is not a whole number of pixels). The rendered SVG path
reuses its buffer the same way. For a 6000 x 4000 opaque image the step
takes 7 ms instead of 120 ms, with identical pixels.
2026-11-12 10:29:50 -08:00
dotCooCoo 5662fefdaf Merge main into feat/duplicate-layer 2026-11-12 10:27:44 -08:00
dotCooCoo d3a073470c Images: decode JPEG screen proxies at a reduced size
A placed JPEG drawn at a fraction of its pixel size was decoded at full
size first and then halved down to the level the screen needs. For a
24 MP photo that is a 96 MB decode per image, and with several such
images on a page the decoded pixels outgrow the image cache.

A YCbCr or grayscale JPEG whose wanted level is a half, a quarter or an
eighth of its size (or smaller) is now decoded at that size straight
from its compressed blocks with jpeg-decoder's scaled IDCT, cut to the
size the halving path gives the same level, and halved from there for
smaller levels. The embedded ICC profile is applied as in a full
decode. CMYK and YCCK JPEGs, other formats and the full size still
decode in full.
2026-11-12 10:18:07 -08:00
dotCooCoo 6446622464 Merge main into feat/object-style-text-frame-options 2026-11-12 10:14:11 -08:00
dotCooCoo d9afe26fc8 Merge main into feat/type-shortcuts-carry 2026-11-12 10:10:51 -08:00
autocraft-bot[bot] 99da9632b3 Merge main into feat/text-frame-options-type-tool 2026-11-12 18:05:59 +00:00
FredApps fa671a104c Preserve latest incremental-composition documentation 2026-11-12 18:15:44 +01:00
FredApps 268f432385 Merge main and preserve PR #2699 behavior 2026-11-12 18:14:28 +01:00
Codex 7f8b352196 Merge main and retain shortcut and preflight documentation 2026-11-12 18:13:30 +01:00
Codex e81b2ea99e Merge main and preserve table query options and ID guidance 2026-11-12 18:13:30 +01:00
dotCooCoo 970e98fcc5 Compose: say where reuse resumes after an edit that moves lines
An edit that moves lines into other frames composes on until a paragraph
starts in the same frame and place as before, or to the story's end, as
an_edit_that_moves_lines_composes_up_to_the_next_frame_the_text_starts_in
shows. The ROADMAP line no longer cites an issue about selection lag.
2026-11-12 09:12:05 -08:00
dotCooCoo 78c06c9701 Merge main into feat/duplicate-layer 2026-11-12 09:08:34 -08: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 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
autocraft-bot[bot] af298fadce Merge main into fix/recovery-off-interface-thread 2026-11-12 16:00:29 +00:00