Commit Graph
487 Commits
Author SHA1 Message Date
dotCooCoo 1d64e0f9ef Type: the harakat Tsume test also compares advances
With Noto Sans Arabic the fatha's ink reaches past the first letter's
left edge, so that letter's Tsume only narrows its advance and moves no
glyph. The test compared glyph positions alone and found no change.
It now compares each glyph's position and advance.
2026-11-14 15:39:28 -08:00
dotCooCoo 09ec24ee28 Merge main into fix/optical-keeps-tsume 2026-11-14 15:22:48 -08:00
BFlat 4e42e2bbb0 Merge pull request #7681 from dotCooCoo/feat/east-asian-glyph-forms
Type: Glyphs panel menu draws the selected characters in an East Asian glyph form
2026-11-15 06:17:55 +07:00
BFlat 6f5bf3dd6d Merge pull request #7679 from dotCooCoo/fix/colr-empty-fill-keeps-clip
Text: a COLR fill that paints nothing keeps the clip around the glyph after it
2026-11-15 06:16:16 +07:00
BFlat 66c73c4b91 Merge pull request #7685 from dotCooCoo/fix/warichu-line-height-block-lines
Type: a warichu line holds the ascent and descent of its outer block lines
2026-11-15 06:15:52 +07:00
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
dotCooCoo f1cffdd8c0 Type: a warichu line holds the ascent and descent of its outer block lines
A block's line took the tallest ascent and deepest descent of its
characters, or the height of the stack's em boxes, whichever was larger.
The top block line's characters reach above the stack by their ascent
past the em box, and the bottom line's below it by their descent, so with
a wide Line Gap the line was too short for them. The line's ascent and
descent now also take in each character's reach from its own block line's
baseline.
2026-11-14 13:46:56 -08:00
dotCooCoo 2212af9653 Text: a COLR fill that paints nothing keeps the clip around the glyph after it
A fill in a glyph's clip marked the clip as filled before the fill was
added. When the fill painted nothing (a palette index past the palette,
or a radial gradient that draws no circle), the next glyph painted in
the same clip became the clip's only child, and closing the clip kept
that glyph on its own, so it drew outside the clip.

The clip is now marked filled only when the fill adds the clip's first
child, and a fill that adds nothing leaves the mark as it was.
2026-11-14 13:38:31 -08:00
dotCooCoo ee5e2db9c4 Type: Optical kerning keeps the space Tsume takes out
Tsume narrows a cluster before Optical kerning measures its pairs, so
Optical measured the narrowed gap and gave part of the space back.
Optical now measures each pair as it would be without the Tsume, as it
already does for Insert Aki, and the Tsume stays on top. Tsume records
what it took on the glyph for this.
2026-11-14 13:36:55 -08:00
dotCooCoo f4a5d65f6b Type: Glyphs panel menu draws the selected characters in an East Asian glyph form
With Show East Asian Options on, the Glyphs panel menu lists Traditional
Forms, Expert Forms, JIS 04, JIS 90, JIS 78 and JIS 83 Forms, Monospaced
Full-Width, Half-Width, Third-Width and Quarter-Width Forms, and Revert
To Default Forms. Each form draws the selected characters with the
font's OpenType feature for it (trad, expt, jp04, jp90, jp78, jp83,
fwid, hwid, twid or qwid). A form is checked when every selected
character has it and disabled when none of the faces that draw the
selected text, fallback faces included, has the feature.

The form is a new character attribute, glyphForm, one form at a time
(text.setFormat, text.setRangeStyle). It is saved only when set,
character styles carry it, and runs that differ only in their form
shape as one piece of text. SVG writes it in font-feature-settings;
PDF draws the glyphs from the layout.
2026-11-14 13:29:30 -08: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