Skip to content

Paint text decorations at the decorating box's baseline; repin parley - #833

Closed
nicoburns wants to merge 5 commits into
devin/1788386630-vertical-alignfrom
devin/1788397525-vertical-align-fixes
Closed

nicoburns wants to merge 5 commits into
devin/1788386630-vertical-alignfrom
devin/1788397525-vertical-align-fixes

Conversation

@nicoburns

@nicoburns nicoburns commented Sep 3, 2026 •

Copy link
Copy Markdown
Member

Summary

Follow-up to #832, from running the WPT suite against it (report posted on #832).

Decoration baseline (blitz-paint/src/text.rs). Underline/overline/line-through of an element were drawn per glyph run at that run's shifted baseline, so <u>a <sup>b</sup></u> drew the b part of the underline raised with the sup. CSS 2 §16.3.1: the decoration is positioned by the decorating box, and descendants with vertical-align don't move it. stroke_text now takes the whole parley::Layout (not just the line iterator) and, for each decoration entry owned by node_id, walks the run's style up the Parley style tree (Style::parent()) to the style whose brush is that node and uses Line::style_baseline(index):

fn decorating_box_baseline(line, styles, run_style, node_id) -> f32 {
    let mut index = run_style;
    loop {
        if styles[index].brush.id == node_id { return line.style_baseline(index); }
        let parent = styles[index].parent();
        if parent == index { return line.style_baseline(run_style); } // root reached: fall back
        index = parent;
    }
}

DecorationRunGeometry::baseline is now "baseline of the decorating box on this line". Fixes css/CSS2/text/text-decoration-va-length-001.xht.

Parley repin → c12395697bc595007febe3dab7ed7219b4590899 (DioxusLabs/parley#23 = #18's head + linebender/parley#762 + the fixes): adds the two accessors above, and stops a trailing space from starting an empty final line / breaking after the first hanging space. This is what fixes the pre-wrap-00[1-7], white-space-pre-wrap-trailing-spaces-*, hanging-whitespace-004 WPTs; #762 itself brings the text-justify-and-trailing-spaces-*, word-break-break-all-018/021, inline-block-zorder-004/005 passes.

WPT (4 required dirs + visudet/normal-flow/css1/css-values, 4188 run): main 2420 → #832 2507 → this 2533 passing. PASS→FAIL: break-spaces-001/010, white-space-intrinsic-size-001 (white-space: break-spaces is mapped to pre-wrap, stylo_to_parley.rs:291 TODO; they only passed via the old break-after-first-space bug) and line-break-anywhere-overrides-uax-behavior-004/006 (accidental passes noted in #762's description).

Note: cargo clippy -p blitz-paint -D warnings fails on a pre-existing needless_return in blitz-dom/src/mutator.rs:1250 (not touched here); cargo clippy -p blitz-dom -D warnings and cargo check --workspace --all-targets pass.

Link to Devin session: https://dioxus.staging.devinenterprise.com/sessions/881b791ebc35447fb39a382f186fa28c
Open in Devin Desktop: https://dioxus.staging.devinenterprise.com/desktop/session/881b791ebc35447fb39a382f186fa28c?variant=devin-insiders
Requested by: @nicoburns

WPT results

Subtests: 192 newly passing, 40 newly failing (net +152).

Full diff (176 changed tests)
+ FAIL => PASS      [1/1]   +1  css/CSS2/backgrounds/background-position-applies-to-007.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/backgrounds/background-position-applies-to-009.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/backgrounds/background-position-applies-to-012.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/backgrounds/background-position-applies-to-013.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/backgrounds/background-position-applies-to-014.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/box-display/containing-block-030.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c43-rpl-ibx-000.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c44-ln-box-000.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c44-ln-box-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c544-valgn-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c5502-mrgn-r-000.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c5504-mrgn-l-000.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/css1/c5505-mrgn-000.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/clear-003.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/clear-inline-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/float-003.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/float-replaced-width-006.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/float-replaced-width-008.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/float-replaced-width-009.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/float-replaced-width-011.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/floats-007.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/floats-038.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/floats-040.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/floats-124.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/floats-141.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats-clear/margin-collapse-clear-014.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats/floats-wrap-bfc-002-left-overflow.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats/floats-wrap-bfc-002-left-table.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats/floats-wrap-bfc-002-right-overflow.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/floats/floats-wrap-bfc-002-right-table.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/fonts/font-family-applies-to-001.xht
- PASS => FAIL      [0/1]   -1  css/CSS2/fonts/font-family-applies-to-005.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/fonts/font-family-applies-to-017.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/generated-content/content-174.xht
- PASS => FAIL      [0/1]   -1  css/CSS2/linebox/baseline-block-with-overflow-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/inline-formatting-context-013.xht
+ FAIL => FAIL     [8/13]   +6  css/CSS2/linebox/inline-negative-margin-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/line-breaking-font-size-zero-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/line-height-127.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/line-height-oof-descendants-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-007.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-008.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-019.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-020.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-031.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-032.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-043.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-044.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-055.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-056.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-067.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-068.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-079.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-080.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-091.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-092.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-103.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-104.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/linebox/vertical-align-applies-to-008.xht
+ FAIL => PASS    [20/20]  +16  css/CSS2/linebox/vertical-align-top-bottom-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/margin-padding-clear/padding-applies-to-017.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-block-replaced-width-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-block-replaced-width-003.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-block-replaced-width-006.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-block-width-001a.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-block-width-001b.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-replaced-width-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-replaced-width-003.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/inline-replaced-width-006.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/max-width-percentage-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/min-width-percentage-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/width-percentage-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/normal-flow/width-percentage-002.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/positioning/absolute-non-replaced-height-008.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/positioning/absolute-non-replaced-max-height-008.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/positioning/abspos-negative-margin-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/selectors/first-line-pseudo-014.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/selectors/first-line-pseudo-015.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/tables/fixed-table-layout-021.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/tables/fixed-table-layout-022.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/tables/fixed-table-layout-023.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/tables/table-anonymous-objects-171.xht
- PASS => FAIL      [0/1]   -1  css/CSS2/text/white-space-applies-to-007.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/text/white-space-normal-003.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/text/white-space-normal-004.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/text/white-space-pre-001.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/text/white-space-pre-002.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/values/units-003.xht
+ FAIL => PASS      [1/1]   +1  css/CSS2/visudet/content-height-001.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/visudet/content-height-002.html
+ FAIL => PASS      [1/1]   +1  css/CSS2/visudet/content-height-003.html
- PASS => FAIL      [0/1]   -1  css/CSS2/visudet/inline-block-baseline-016.html
- PASS => FAIL      [0/1]   -1  css/CSS2/visufx/overflow-applies-to-001.xht
- PASS => FAIL      [0/1]   -1  css/css-align/baseline-of-scrollable-1b.html
- FAIL => FAIL      [0/2]   -1  css/css-align/baseline-of-single-axis-scroll-container.html
+ FAIL => PASS      [7/7]   +3  css/css-align/baseline-rules/synthesized-baseline-flexbox-001.html
+ FAIL => PASS      [7/7]   +3  css/css-align/baseline-rules/synthesized-baseline-grid-001.html
+ FAIL => PASS      [3/3]   +1  css/css-align/baseline-rules/synthesized-baseline-inline-block-001.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-origin/origin-padding-box.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-origin/origin-padding-box_with_radius.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-size-025.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-size-027.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-size-028.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-size-030.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/background-size-031.html
+ FAIL => PASS      [1/1]   +1  css/css-backgrounds/box-shadow-outset-without-border-radius-001.html
+ FAIL => PASS      [1/1]   +1  css/css-break/flexbox/multi-line-row-flex-fragmentation-082a-print.html
+ FAIL => PASS      [1/1]   +1  css/css-break/flexbox/multi-line-row-flex-fragmentation-082b-print.html
+ FAIL => PASS      [1/1]   +1  css/css-break/flexbox/multi-line-row-flex-fragmentation-082c-print.html
+ FAIL => PASS      [1/1]   +1  css/css-break/flexbox/multi-line-row-flex-fragmentation-082d-print.html
+ FAIL => PASS      [1/1]   +1  css/css-contain/contain-content-004.html
+ FAIL => PASS      [1/1]   +1  css/css-contain/contain-layout-cell-002.html
+ FAIL => PASS      [1/1]   +1  css/css-contain/contain-paint-023.html
- PASS => FAIL      [0/1]   -1  css/css-contain/contain-size-flexbox-002.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-align-self-horiz-001-block.xhtml
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-baseline-align-self-baseline-vert-001.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-baseline-multi-item-vert-001a.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-baseline-multi-item-vert-001b.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-baseline-multi-line-horiz-001.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-baseline-multi-line-horiz-002.html
- PASS => FAIL      [0/1]   -1  css/css-flexbox/flexbox-baseline-multi-line-vert-002.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-baseline-wrap-reverse-unequal-lines.html
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-justify-content-horiz-002.xhtml
+ FAIL => PASS      [1/1]   +1  css/css-flexbox/flexbox-justify-content-horiz-004.xhtml
+ FAIL => FAIL      [1/2]   +1  css/css-flexbox/percentage-size-quirks-002.html
+ FAIL => PASS      [1/1]   +1  css/css-fonts/font-variant-emoji-005.html
+ FAIL => FAIL      [7/9]   +1  css/css-grid/alignment/grid-align-baseline.html
- PASS => FAIL      [0/1]   -1  css/css-grid/alignment/grid-baseline-001.html
- PASS => FAIL      [0/1]   -1  css/css-grid/alignment/grid-baseline-002.html
+ FAIL => FAIL    [16/18]   +9  css/css-grid/alignment/grid-baseline-004.html
+ FAIL => FAIL     [3/11]   +3  css/css-grid/alignment/grid-container-baseline-001.html
- PASS => FAIL      [0/1]   -1  css/css-grid/alignment/grid-inline-baseline.html
+ FAIL => PASS      [1/1]   +1  css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-001.html
+ FAIL => PASS      [1/1]   +1  css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-003.html
+ FAIL => PASS      [1/1]   +1  css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-001.html
+ FAIL => PASS      [1/1]   +1  css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-001.html
- PASS => FAIL      [0/1]   -1  css/css-grid/grid-items/grid-inline-items-002.html
+ FAIL => PASS      [1/1]   +1  css/css-images/image-orientation/image-orientation-none-cross-origin.html
+ FAIL => PASS      [1/1]   +1  css/css-inline/baseline-shift/baseline-shift-bottom.html
+ FAIL => PASS      [1/1]   +1  css/css-inline/baseline-shift/baseline-shift-center.html
+ FAIL => PASS      [1/1]   +1  css/css-inline/baseline-shift/baseline-shift-top.html
+ FAIL => FAIL    [15/22]   +5  css/css-inline/baseline-source/baseline-source-first-001.html
- PASS => FAIL      [0/1]   -1  css/css-inline/dominant-baseline/dominant-baseline-mixed-writing-modes-002.html
+ FAIL => PASS      [1/1]   +1  css/css-inline/empty-span-size-002.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/change-list-descendant-display.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/li-list-item-counter-002.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/li-list-item-counter-004.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/li-list-item-counter-005.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/li-value-reversed-016.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/li-value-reversed-018.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/li-value-reversed-019.html
- PASS => FAIL      [0/1]   -1  css/css-lists/list-and-block-in-inline.html
+ FAIL => PASS      [1/1]   +1  css/css-lists/list-style-type-string-002.html
+ FAIL => PASS      [1/1]   +1  css/css-multicol/multicol-width-negative-001.xht
+ FAIL => PASS      [1/1]   +1  css/css-page/monolithic-overflow-014-print.html
- PASS => FAIL      [0/1]   -1  css/css-sizing/intrinsic-percent-replaced-008.html
- PASS => FAIL      [0/1]   -1  css/css-sizing/intrinsic-percent-replaced-dynamic-008.html
+ FAIL => FAIL     [7/15]   +4  css/css-tables/tentative/baseline-table.html
+ FAIL => PASS      [1/1]   +1  css/css-text/line-breaking/line-breaking-030.html
+ FAIL => PASS      [1/1]   +1  css/css-text/line-breaking/line-breaking-032.html
+ FAIL => PASS      [1/1]   +1  css/css-text/text-encoding/shaping-join-003.html
- PASS => FAIL      [0/1]   -1  css/css-text/white-space/break-spaces-newline-012.html
- PASS => FAIL      [0/1]   -1  css/css-text/white-space/break-spaces-newline-013.html
- PASS => FAIL      [0/1]   -1  css/css-text/white-space/break-spaces-newline-014.html
- PASS => FAIL      [0/1]   -1  css/css-text/white-space/break-spaces-newline-015.html
- PASS => FAIL  [176/192]  -16  css/css-text/white-space/white-space-intrinsic-size-021.html
+ FAIL => PASS      [1/1]   +1  css/css-text/white-space/white-space-pre-wrap-trailing-spaces-002.html
- PASS => FAIL      [0/1]   -1  css/css-text/white-space/white-space-zero-fontsize-001.html
- PASS => FAIL      [0/1]   -1  css/css-viewport/zoom/vertical-align.html
+ FAIL => PASS      [1/1]   +1  css/css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht
+ FAIL => PASS      [1/1]   +1  css/css-writing-modes/abs-pos-non-replaced-icb-vlr-013.xht
+ FAIL => PASS      [1/1]   +1  css/css-writing-modes/abs-pos-non-replaced-icb-vrl-004.xht
+ FAIL => PASS      [1/1]   +1  css/css-writing-modes/abs-pos-non-replaced-icb-vrl-012.xht
- PASS => FAIL      [0/1]   -1  css/css-writing-modes/abs-pos-with-replaced-child.html
+ FAIL => PASS      [1/1]   +1  css/css-writing-modes/baseline-with-orthogonal-flow-001.html
+ FAIL => PASS      [1/1]   +1  css/css-writing-modes/text-combine-upright-shadow.html

Generated by the WPT workflow.

@staging-devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788386630-vertical-align branch from e96d37d to 8db3deb Compare September 8, 2026 14:37
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788397525-vertical-align-fixes branch 5 times, most recently from 6daf4dc to 87a1e04 Compare September 9, 2026 16:24
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788386630-vertical-align branch from 1d54d87 to 69a9265 Compare September 10, 2026 20:45
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788397525-vertical-align-fixes branch 2 times, most recently from ba8dd10 to c3e984a Compare September 10, 2026 21:12
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788386630-vertical-align branch from 41b9df8 to 2b316d5 Compare September 14, 2026 17:25
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788397525-vertical-align-fixes branch 17 times, most recently from 6fea91a to cf34277 Compare September 17, 2026 13:18
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788386630-vertical-align branch from 75ab54e to f113887 Compare September 21, 2026 16:47
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788397525-vertical-align-fixes branch 5 times, most recently from c48ea09 to 5ac3eed Compare September 23, 2026 13:55
Rebased onto main as a single commit: main now includes #914 (Parley
upgrade to linebender main), which superseded the Parley repin commits
that made up most of this branch's history. The previous history is
preserved at backup/832-pre-rebase.

- Map stylo vertical-align / alignment-baseline / baseline-shift to
  Parley's VerticalAlign on text styles and inline boxes
- Drop Blitz's root line-height floor and per-span line-height
  pre-computation; Parley now owns line box sizing
- Export inline-block / inline flex / grid baselines to Parley
- Scale ch/ic linearly from font units to match shaped advances
- Position glyph runs, inline boxes and decorations by baseline offset
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788386630-vertical-align branch from 232cbaa to 6b7e7b5 Compare September 24, 2026 19:38
Underlines/overlines/line-throughs of a decorating element are drawn at that
element's inline-box baseline on each line (via Line::style_baseline through
the parley style parent chain) instead of at each glyph run's shifted
baseline, so vertically aligned descendants no longer carry the decoration
with them. Pin parley to 1fd63fba72b38df9ec14892bd6f20e96fe2c1176, which adds
Style::parent / Line::style_baseline and stops a trailing space from starting
an extra empty line.
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788397525-vertical-align-fixes branch from 5ac3eed to fc4ed57 Compare September 24, 2026 19:42
@staging-devin-ai-integration
staging-devin-ai-integration Bot force-pushed the devin/1788386630-vertical-align branch from 6b7e7b5 to 5ee11fe Compare September 24, 2026 19:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant