Commit Graph
478 Commits
Author SHA1 Message Date
BFlat ada1c9263a Merge pull request #7555 from dotCooCoo/fix/tabbed-rtl-negative-tracking-break-bound
Type: a tabbed right-to-left line with negative tracking stops reading after a bounded number of breaks
2026-11-15 05:28:48 +07:00
BFlat 3bab3b6f5b Merge pull request #7444 from dotCooCoo/fix/later-span-taller-line-clears
Type: a taller line in a further span beside a wrap object no longer reaches into the line above
2026-11-15 04:21:51 +07:00
dotCooCoo 54a7b51ec9 Type: a tabbed right-to-left line whose last break read precedes a forced line break ends after it
When the last of the bounded breaks such a line reads came right before
U+2028, the line ended at that break and the next line held only the
forced break, drawing an empty line. The line now reads on to the
forced break and ends there when it fits as drawn.
2026-11-14 13:02:03 -08:00
dotCooCoo 2b781525bb Type: a tab to a default or left stop reads none of the text after it
tab_advance read the text after a tab up to the next tab for every
stop, though only right, center and decimal stops align it. The first
tab of a long paragraph read the paragraph to its end, even on a line
that stops reading a bounded number of breaks past its overflow. It
now reads that text only when it reaches a stop that aligns it.
2026-11-14 12:50:18 -08:00
BFlat bac95f9902 Merge pull request #7631 from dotCooCoo/fix/composite-font-lent-document-only
Type: a document draws only its own composite font definitions
2026-11-15 03:20:55 +07:00
BFlat e8a65c97ef Merge pull request #7409 from dotCooCoo/fix/rtl-tab-end-trim
Type: right-to-left tabbed lines are measured with their line-end trim where it is drawn
2026-11-15 03:20:46 +07:00
BFlat 280cc9a488 Merge pull request #7455 from dotCooCoo/fix/followup-7303
Area type: contours whose crossings round to one x keep the gap between them
2026-11-15 03:19:29 +07:00
dotCooCoo 54f4c256eb Type: a tabbed right-to-left line ending at a final soft hyphen draws no hyphen
Where a tabbed line with glyphs stepping back stops reading at its break limit on a soft
hyphen that ends the text, it now ends there without a hyphen, as a line that reads to the
end of the text does.
2026-11-14 10:49:21 -08:00
dotCooCoo 576660020e Merge main into fix/later-span-taller-line-clears 2026-11-14 10:34:32 -08:00
dotCooCoo 59d238d682 Merge main into fix/tabbed-rtl-negative-tracking-break-bound
# Conflicts:
#	crates/text/src/layout/breaking.rs
#	crates/text/src/layout/wrapping_tests.rs
2026-11-14 10:25:44 -08:00
dotCooCoo c51d14262f Merge main into fix/composite-font-lent-document-only 2026-11-14 09:42:51 -08:00
BFlat a3b81947ff Merge pull request #7413 from dotCooCoo/fix/line-break-latest-fitting
Type: a tabbed line that steps back ends at the latest break that fits as drawn
2026-11-15 00:41:19 +07:00
BFlat 12b09b921c Merge pull request #7439 from dotCooCoo/fix/single-line-composer-remeasure
Type: the Single-line Composer measures a line's room across its tallest character
2026-11-15 00:41:01 +07:00
BFlat e76692b0f1 Merge pull request #7475 from dotCooCoo/fix/colr-radial-negative-start-radius
Type: COLR radial gradients with a negative radius draw from their circle of radius 0
2026-11-15 00:39:49 +07:00
BFlat e5a99a5284 Merge pull request #7561 from dotCooCoo/fix/invert-wrap-offset-band-exact
Text wrap: Invert Wrap with an offset lets a line use all the room the grown shape holds
2026-11-15 00:39:39 +07:00
dotCooCoo 46c9f922c2 Type: a document draws only its own composite font definitions
While a document's composite fonts are lent, type naming a composite font
the document does not define is set as in a missing font, even when the
front document or the document a placed document sits in defines one of
that name. A document that defines no composite font gets an empty scope
too, so a document in the back, a tiled window, a thumbnail or an export
made while another document is in front no longer borrows the front
document's definitions. A temporary document drawn while a document draws
keeps that document's fonts, and type laid out with nothing lent still uses
the registered ones.

- FontDb::composite_font looks only in the latest loan of the database.
- lend_composite_fonts lends an empty set at the top level when the
  database holds composite fonts; lend_document_composite_fonts also lends
  one inside another loan, for placed documents, back-document measuring
  and threaded reflow on open.
- A loan that leaves out a registered font gets its own generation, so
  layouts made with that font are not reused under it.
2026-11-14 08:16:02 -08:00
BFlat 01a796e817 Merge pull request #7415 from dotCooCoo/fix/warichu-rtl-gap-caret
Type: justification spaces a right-to-left warichu block, and the caret keeps to its block line
2026-11-14 21:55:12 +07:00
BFlat bde7be4390 Merge pull request #7447 from dotCooCoo/fix/text-inset-skips-seams
Type: area type insets stop at the frame's edges, not at an edge its contours share
2026-11-14 21:53:24 +07:00
dotCooCoo 11225df118 Type: tests expect the Single-line Composer to break mixed-size overflow lines as the Every-line Composer does 2026-11-14 05:55:44 -08:00
dotCooCoo 648aedbe37 Type: a COLR glyph whose radial gradient draws no circle draws nothing
A radial gradient whose circles both have the same negative radius (as a
variable font's instance can give) draws no circle. A glyph painted with
only that gradient was read as no colour glyph, so layout drew its
outline instead. It is now colour art that draws nothing.
2026-11-14 05:45:32 -08:00
dotCooCoo b0961a29af Merge main into fix/single-line-composer-remeasure 2026-11-14 05:29:48 -08:00
dotCooCoo 7aad123a00 Merge main into fix/invert-wrap-offset-band-exact 2026-11-14 05:11:42 -08:00
dotCooCoo 443ca3cb4a Merge main into fix/colr-radial-negative-start-radius 2026-11-14 05:05:29 -08:00
dotCooCoo 8bea48a1e2 Merge main into fix/later-span-taller-line-clears 2026-11-14 04:50:34 -08:00
dotCooCoo 496ed1c9e9 Merge main into fix/tabbed-rtl-negative-tracking-break-bound 2026-11-14 04:49:19 -08:00
dotCooCoo 7be61fb446 Merge main into fix/followup-7303 2026-11-14 04:39:47 -08:00
dotCooCoo 3c562254e8 Text wrap: Invert Wrap with an offset lets a line use all the room the grown shape holds
With Invert Wrap and a positive offset, a line's band was cut into at
most 64 pieces, and anchor cuts were dropped when a shape had more than
64 of them. Beside a notch the offset fills, a line could stop at the
notch instead of at the grown edge: 20 pt short beside a 0.5625 pt notch
with an offset of 1, and short beside sloped notch sides and tall bands.

The grown shape is now measured exactly: the shape near the band is cut
into trapezoids, each grown by the offset into a convex polygon, and the
line keeps the x at which those polygons hold every height of its band.
The work is capped; a shape that needs more steps than the cap, for
example one whose edges cross one another tens of thousands of times,
keeps the 64-piece measure, which keeps the line inside the grown shape.
A band of no height exactly the offset past a shape's tip now holds a
line too.
2026-11-14 03:44:29 -08:00
dotCooCoo 26c77228b3 Type: a tabbed right-to-left line with negative tracking stops reading after a bounded number of breaks
Once a right-to-left line holds a tab and a glyph with a negative
advance, the least it can be drawn at no longer grows with its tab
stops, so a line that overflowed in the order of its text read on to
the end of the paragraph before settling its break. Setting every line
of a long paragraph that way took time quadratic in its length.

Such a line now reads at most 256 legal breaks past where it first
overflows in the order of its text, and ends at the latest break read
that fits as drawn, the same limit the breaker uses for breaks it
measures one by one. Lines without negative advances, and lines that
fit, keep their breaks.
2026-11-14 03:06:28 -08:00
dotCooCoo 0bb290e617 Merge main into fix/colr-radial-negative-start-radius 2026-11-14 02:31:23 -08:00
dotCooCoo 5d2d6e95f7 Merge main into fix/later-span-taller-line-clears 2026-11-14 02:30:02 -08:00
dotCooCoo a45be8907b Merge main into fix/followup-7303 2026-11-14 02:20:12 -08:00
dotCooCoo 0f135f8f09 Merge main into fix/single-line-composer-remeasure 2026-11-14 02:16:06 -08:00
dotCooCoo 35a9045612 Merge main into fix/text-inset-skips-seams 2026-11-14 02:15:45 -08:00
dotCooCoo 61f0ca99f5 Merge main into fix/rtl-tab-end-trim 2026-11-14 02:09:43 -08:00
dotCooCoo 6897e1ca07 Merge main into fix/line-break-latest-fitting 2026-11-14 02:09:28 -08:00
dotCooCoo c752edc902 Merge main into fix/warichu-rtl-gap-caret 2026-11-14 02:04:02 -08:00
dotCooCoo fb13d2045d Merge main into feat/cjk-tsume 2026-11-14 01:56:33 -08:00
BFlat 78cb105961 Merge pull request #7481 from dotCooCoo/feat/every-line-composer-shaped-overflow
Type: the Every-line Composer sets the visible lines of a mixed-size paragraph that overflows a shaped frame
2026-11-14 16:51:54 +07:00
BFlat 2985970a84 Merge pull request #7403 from dotCooCoo/feat/colr-gradient-repeat
Type: COLR glyphs with repeating or reflecting gradients draw as vector art
2026-11-14 16:50:37 +07:00
ruchirguitar 22fc487cb5 #6613: reconcile main and preserve Czech parameter literals 2026-11-14 14:05:01 +05:30
dotCooCoo aff1bda696 Merge main into fix/colr-radial-negative-start-radius 2026-11-13 23:21:05 -08:00
dotCooCoo 3b01f523ca Merge main into fix/later-span-taller-line-clears 2026-11-13 23:06:11 -08:00
dotCooCoo bfdf50ffb0 Merge main into fix/text-inset-skips-seams 2026-11-13 23:05:09 -08:00
dotCooCoo ae05540f70 Merge main into feat/cjk-tsume 2026-11-13 22:46:57 -08:00
dotCooCoo 1d9ebeef56 Merge main into fix/rtl-tab-end-trim 2026-11-13 22:43:03 -08:00
dotCooCoo 7bb88deb2c Merge main into fix/warichu-rtl-gap-caret 2026-11-13 22:42:56 -08:00
dotCooCoo 1494e2c230 Type: Tsume narrows the space around each character's ink
Character panel > Tsume, shown with Show East Asian Options, takes away a
percentage of the blank space on each side of a character's ink, inside
its own width, in horizontal type. The value is from 0 to 100, 0 by
default. 50 halves that space and 100 sets the ink against the
characters before and after it; the glyph keeps its shape. A character
without ink, such as a space, keeps its width, and a ligature or a
letter with its marks takes the value of its first character. The
font's pair kerning, tracking, manual kerning and Insert Aki are added
after it, and justification keeps it. Vertical type keeps its spacing.

- text.setFormat and text.setRangeStyle take `tsume`; a value that is
  not a number or is outside 0 to 100 is refused, naming the key.
  Character styles carry it, and a file holding a value outside the
  range opens with the nearer end.
- The Character panel's Tsume field has 0, 25, 50, 75 and 100 in its
  menu, and Reset Panel sets it to 0. Character Style Options shows it
  in Advanced Character Formats.
- Live SVG text places each character Tsume moves, and type on a path
  with Tsume is written as outlines.

Docs: docs/mcp.md (Tsume, Character Style Options fields),
docs/target-app-parity.md.
2026-11-13 21:50:05 -08:00
dotCooCoo 396796ff9b Type: the Every-line Composer sets the visible lines of a mixed-size paragraph that overflows a shaped frame
A paragraph whose characters differ in line metrics, in area type that is
not a rectangle or that wraps around an object, was broken line by line
with the Single-line Composer when the frame could not hold all of it.
The lines the frame holds are now composed with the whole paragraph: a
line the frame has no room for, and every line after it, is measured as
wide as the span of the last line set in the frame, less its indents.
Those lines overflow, or go on in the next threaded frame, which composes
them again at its own widths. A paragraph whose first line has no room,
and a search that passes its limits, still fall back to Single-line.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 21:46:30 -08:00
dotCooCoo 660acb12ff Type: COLR radial gradients with a negative radius draw from their circle of radius 0
A radial gradient whose color line runs past 0 or 1 can get a circle
with a negative radius once its stops are normalized to 0..1. Circles of
a negative radius are not drawn: only the side of the circle of radius 0
(the tip of the cone) where the radius is positive is painted
(https://learn.microsoft.com/en-us/typography/opentype/spec/colr, Radial
gradients). Before:

- As vector art, a padded gradient with a stop before 0 and its centers
  apart was focused on the start circle's center instead of the tip, and
  one with its centers together got stop offsets below 0.
- Drawn into an image (a glyph with a sweep gradient, a Porter-Duff
  composite or a repeating gradient), any such gradient filled the glyph
  with its first stop's color.

Both now recast the circles so neither radius is negative. With pad, the
stops on the side that is not drawn become one stop at the tip with the
color there; stops at the tip stay, so a sharp change of color there
keeps the color on the drawn side. With repeat and reflect, the circles
move by whole periods of the color line to the drawn side. When no
circle is drawn, nothing is painted.
2026-11-13 21:31:39 -08:00
dotCooCoo 2d0bb80a52 Area type: contours whose crossings round to one x keep the gap between them
Two intervals at the middle of a band joined whenever their crossings
came out at the same x, even when the two edges are not along one line
and only round to that x. A slanted edge whose crossings of the band all
round to the x of a separate contour's edge then let a line run across
the gap between the contours.

The crossings now carry the line they were found along. Intervals join
at an x only when both crossings are along one line (contours that meet
along an edge) or both lie exactly at that x.
2026-11-13 21:14:06 -08:00