Commit Graph
5163 Commits
Author SHA1 Message Date
.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
.CooCoo 9595f3d62e Anchored text frames: test nested hosts in groups, footnotes and table cells (#2722)
Adds three tests for a text frame anchored inside another anchored text
frame: the outer frame as a member of an anchored group with a rotation
and a scale, the inner frame in a footnote of the outer frame, and the
inner frame in a table cell of the outer frame. Each checks the inner
frame's spread, transform and page.
2026-11-12 17:23:50 -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 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 6bb9907de5 Use shared French duplicate layer translation 2026-11-12 16:54:46 -05:00
Dylan M. Taylor e6ab0d263e Merge branch 'main' into feat/duplicate-layer 2026-11-12 16:43:33 -05:00
Dylan M. Taylor 5518b65320 Merge pull request #2658 from dotCooCoo/feat/vj-baseline-grid
Compose: vertical justification keeps grid-aligned lines on the baseline grid
2026-11-12 16:43:08 -05:00
Dylan M. Taylor 2b305c9c00 Merge branch 'feat/vj-baseline-grid' of github.com:dotCooCoo/designcraft into codex/integrate-2658b 2026-11-12 16:28:06 -05:00
Dylan M. Taylor 9847f972da Update recovery test for explicit write conflict 2026-11-12 16:27:52 -05:00
Dylan M. Taylor 076e653ac3 Merge remote-tracking branch 'upstream/main' into codex/integrate-2658b 2026-11-12 16:27:39 -05:00
Dylan M. Taylor 5931b17bb6 Translate duplicate layer in remaining locales 2026-11-12 16:22:26 -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
dotCooCoo fb77a73d93 Compose: Center on the grid takes the fitting step nearest the middle in a shaped frame
When the grid step nearest the centered place puts the lines outside a frame that narrows and widens again, Center now tries the steps on both sides of it, nearest first, instead of only the steps above it.
2026-11-12 13:05:34 -08:00
dotCooCoo 946e3ea4c1 Compose: grid-aligned vertical justification takes only grid steps that fit a shaped frame
In a frame that narrows and widens again, Bottom, Center and Justify now
try lower grid steps until the lines fit the outline, and leave the lines
in place when none does, instead of taking the next lower step unchecked.
A grid whose step is too small to count across the column is now treated
as no grid when a line is placed, so the line keeps a finite baseline.

Tests cover a waist-shaped frame on a 40 pt grid, a tiny-step grid that
starts away from the line, and Justify with a wrapped paragraph under
All Lines and First Line Only.
2026-11-12 13:05:34 -08: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
Dylan M. Taylor fc5221060c Fix vertical justification test arguments 2026-11-12 15:59:29 -05:00
dotCooCoo 07d264fd23 Copy: bound the anchored-object walk through cells and notes
Copying a story gives the objects anchored in its table cells and
notes fresh ids down to 64 levels, as the table copy does. A copy whose
stories below that level hold anchored objects, tables or notes is
refused with the nested-too-deeply error instead of recursing without
limit.
2026-11-12 12:57:17 -08:00
dotCooCoo 55963c4918 Images: pick a reduced JPEG's scale by its long side
The JPEG decoder takes the smallest scale that meets either requested
side. A short side rounds up to the same size at several scales, so a
100 x 2 JPEG asked for at a half decoded at an eighth (13 x 1). The
long side alone now picks the scale, and a decode whose size differs
from the requested reduction is refused, which falls back to the full
decode.
2026-11-12 12:57:16 -08:00
Dylan M. Taylor f88e6711e0 Merge latest main into baseline grid justification PR 2026-11-12 15:54:56 -05:00
Dylan M. Taylor 7362fffbcf Merge pull request #2654 from dotCooCoo/fix/effect-damage-bounds
Canvas: moving an object with a drop shadow repaints only its area
2026-11-12 15:50:44 -05:00
Dylan M. Taylor bf9d27f9b3 Merge pull request #2667 from dotCooCoo/fix/bottom-aligned-text-wrap
Compose: vertical justification keeps text out of a wrap under it
2026-11-12 15:49:37 -05:00
dotCooCoo 6d8f26a6be Render: cull a scaled object by its scaled stroke and glow
Culling grew an object's box by its unscaled stroke and effect outset,
so a view or repaint patch that showed only the outer part of a scaled
object's stroke or hardened glow skipped the object. Culling now scales
both by the object's largest scale factor, as drawing does. The CMYK
ink-pass area grows each object, and each nested child, by its stroke
and effect outset under its full transform.
2026-11-12 12:48:49 -08:00
dotCooCoo b30d39fdec Layers: Duplicate Layer maps copies by the original's anchors and tables
object::renumber now gives a story copy's anchors and tables new ids.
Duplicate Layer keys each copied anchor by the original anchor's id,
so copied cross-references point at the copied paragraph, and pairs
copied tables with the originals in order, so objects anchored in
table cells keep their live captions. A copy that renumber reports
incomplete is refused with the nested-too-deeply error.
2026-11-12 12:48:41 -08:00
dotCooCoo ba4f45e522 Merge main into feat/text-frame-options-type-tool 2026-11-12 12:45:20 -08:00
Dylan M. Taylor 213f3b75a3 Report recovery writes owned by another session 2026-11-12 15:43:43 -05:00
Dylan M. Taylor 1f2900fb50 Merge main into baseline grid justification PR 2026-11-12 15:29:33 -05: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
Dylan M. Taylor 6790d009fe Merge pull request #2651 from dotCooCoo/fix/placed-image-resolution
Place: images come in at the resolution stored in the file
2026-11-12 15:25:55 -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 e05d943d23 Merge main into fix/bottom-aligned-text-wrap 2026-11-12 12:24:22 -08:00
dotCooCoo 8121bca1fe Merge main into fix/effect-damage-bounds 2026-11-12 12:24:21 -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
FredApps 1c3552de8b Merge pull request #2699 from dotCooCoo/fix/typing-recomposes-edited-part
Compose: an edit composes only the paragraphs it can change
2026-11-12 20:11:53 +01:00
dotCooCoo 2aa93ea807 Text: Text Frame Options from the Type tool show the inset of the frames they change
The one Inset field of a non-rectangular frame and the inset link now
follow the frames the dialog changes: the frame that shows the caret,
or every frame holding selected text. Before, a caret with no stored
frame showed four sides for an oval frame, and the link checked every
frame of the story.
2026-11-12 11:10:13 -08:00
dotCooCoo 75d1119def Text: Text Frame Options previews go from their document, and Undo refuses stored frames
A preview remembers the document it is shown in. When OK is refused or
Cancel is chosen after another document became active, that document
goes back as it was instead of keeping the previewed options.

The frames taken from the caret or selected text are also refused once
the document has changed after the dialog opened. Undo puts back the
document's id counter, so a frame made after Undo can take a stored id.
2026-11-12 10:59:49 -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
dotCooCoo cc7f289187 Merge main into fix/bottom-aligned-text-wrap 2026-11-12 10:50:05 -08:00
dotCooCoo 8134e00ece Merge main into fix/effect-damage-bounds 2026-11-12 10:49:55 -08:00
Codex fe631061db Use mutable row iteration in render fixture 2026-11-12 19:49:14 +01:00
Codex b5fad8e858 Use mutable subpath iteration for current Clippy 2026-11-12 19:45:08 +01:00
Codex 2a2d73ead9 Merge main preserving incremental composition and alpha-wrap caching 2026-11-12 19:41:39 +01:00
FredApps 113d196168 Merge pull request #2668 from dotCooCoo/fix/feathered-inner-effects
Render: a feathered object's bevel and inner effects fade with it
2026-11-12 19:40:26 +01:00
FredApps 17b74601fb Merge pull request #2663 from dotCooCoo/feat/alpha-channel-text-wrap
Text Wrap: Alpha Channel contours follow a transparent image's visible pixels
2026-11-12 19:38:50 +01:00
dotCooCoo 855d017d5b Images: limit reduced JPEG decodes by the full image size
A reduced decode now applies the full decode's size limits before it
reads any image data:

- A file whose size pixel_size cannot read is refused, so the 256 Mpx
  check always has a size to compare. The JPEG decoder's own reading of
  the frame size is checked against the same limit.
- A progressive JPEG keeps the coefficients of the full-size image until
  its last scan, whatever the output size. When those take more than
  512 MiB (each component counted at full size, each side rounded up to
  32 pixels), the reduced decode is refused and the full decode, with
  its own limits, applies.
2026-11-12 10:34:02 -08:00