From b5eb4507dec78d8f043943046b6011d038951112 Mon Sep 17 00:00:00 2001 From: Nico Burns Date: Thu, 25 Jun 2026 14:14:55 +0100 Subject: [PATCH 1/2] Use parley with inline box baseline support Signed-off-by: Nico Burns --- Cargo.lock | 12 ++++-------- Cargo.toml | 2 +- packages/blitz-dom/src/layout/construct.rs | 2 ++ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af114829da..ffa34950ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2825,8 +2825,7 @@ dependencies = [ [[package]] name = "fontique" version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "274fa4f0f0a926ae182c7c076c078cce8a38471d15e61a102a02cac984be9813" +source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" dependencies = [ "hashbrown 0.17.1", "linebender_resource_handle", @@ -5246,14 +5245,12 @@ dependencies = [ [[package]] name = "parlance" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6937eda350acc1a5d05872c3cbf99fe78619c269096e2be3d4a350058639d5" +source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" [[package]] name = "parley" version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1cfcf399c774719fb1fa51bc6b91e86bdf003b03202a0902f1827ba6750746" +source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" dependencies = [ "fontique", "harfrust", @@ -5270,8 +5267,7 @@ dependencies = [ [[package]] name = "parley_data" version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d3755e2cc12c0625b0cd2f2773c6a37dd11d1531940c945ade4aeb78f2b145" +source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" dependencies = [ "icu_properties", ] diff --git a/Cargo.toml b/Cargo.toml index d4ea4db12c..fa34aae21e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,7 +100,7 @@ taffy = { version = "=0.11.0-experimental-cache-fix.3", default-features = false "calc", "detailed_layout_info", ] } -parley = { version = "0.10", default-features = false, features = ["std"] } +parley = { git = "https://github.com/linebender/parley", rev="f9f53108885410786a25098d7d41f023d33a3e25", default-features = false, features = ["std"] } skrifa = { version = "0.42", default-features = false, features = [ "std", ] } # Should match parley and vello versions diff --git a/packages/blitz-dom/src/layout/construct.rs b/packages/blitz-dom/src/layout/construct.rs index d7d59a6b9d..a05d2f59b4 100644 --- a/packages/blitz-dom/src/layout/construct.rs +++ b/packages/blitz-dom/src/layout/construct.rs @@ -942,6 +942,7 @@ pub(crate) fn build_inline_layout_into( kind: box_kind, // Overridden by push_inline_box method index: 0, + baseline: None, // Width and height are set during layout width: 0.0, height: 0.0, @@ -1022,6 +1023,7 @@ pub(crate) fn build_inline_layout_into( kind: box_kind, // Overridden by push_inline_box method index: 0, + baseline: None, // Width and height are set during layout width: 0.0, height: 0.0, From 41f9dc63179b9936ed0727b2a6a1cfefed6c863b Mon Sep 17 00:00:00 2001 From: Nico Burns Date: Thu, 25 Jun 2026 14:47:53 +0100 Subject: [PATCH 2/2] Integrate Taffy's and Parley's baseline support --- Cargo.lock | 76 +++++++++++++++++-------- Cargo.toml | 2 +- packages/blitz-dom/src/layout/inline.rs | 13 ++++- 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ffa34950ee..72963311d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -315,7 +315,7 @@ dependencies = [ "anyrender", "image", "peniko", - "read-fonts", + "read-fonts 0.39.2", "serde", "serde_json", "sha2", @@ -855,7 +855,7 @@ dependencies = [ "percent-encoding", "rayon", "selectors", - "skrifa", + "skrifa 0.42.1", "slab", "smallvec", "stylo", @@ -2799,6 +2799,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "font-types" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bf886368962a7d8456f136073ed33ed1b0770c690d2063731bb6a776e99f33" +dependencies = [ + "bytemuck", +] + [[package]] name = "fontconfig-parser" version = "0.5.8" @@ -2824,8 +2833,8 @@ dependencies = [ [[package]] name = "fontique" -version = "0.10.0" -source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=30f6ff1970e958498787fbfbf68a2eb013bee158#30f6ff1970e958498787fbfbf68a2eb013bee158" dependencies = [ "hashbrown 0.17.1", "linebender_resource_handle", @@ -2835,7 +2844,7 @@ dependencies = [ "objc2-core-text", "objc2-foundation 0.3.2", "parlance", - "read-fonts", + "read-fonts 0.40.2", "roxmltree 0.21.1", "smallvec", "windows", @@ -3139,7 +3148,7 @@ dependencies = [ "hashbrown 0.17.1", "log", "peniko", - "skrifa", + "skrifa 0.42.1", "smallvec", "vello_common", ] @@ -3323,13 +3332,13 @@ dependencies = [ [[package]] name = "harfrust" -version = "0.8.4" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d12c7c642d4ce8c2e784b4751a6634bd89583912265add4a679a8882d123fbcd" +checksum = "f0589ddd0d2935dd2845827ac606b4081c266225d613b268ed2910f832889cab" dependencies = [ "bitflags 2.13.0", "bytemuck", - "read-fonts", + "read-fonts 0.40.2", "smallvec", ] @@ -4768,7 +4777,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc8f19a1c361e5fb1a57e487b993ff8b3c44321b50ca86c9e2b235e57dc94008" dependencies = [ - "font-types", + "font-types 0.11.3", ] [[package]] @@ -5245,12 +5254,12 @@ dependencies = [ [[package]] name = "parlance" version = "0.1.0" -source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" +source = "git+https://github.com/linebender/parley?rev=30f6ff1970e958498787fbfbf68a2eb013bee158#30f6ff1970e958498787fbfbf68a2eb013bee158" [[package]] name = "parley" -version = "0.10.0" -source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=30f6ff1970e958498787fbfbf68a2eb013bee158#30f6ff1970e958498787fbfbf68a2eb013bee158" dependencies = [ "fontique", "harfrust", @@ -5261,13 +5270,13 @@ dependencies = [ "linebender_resource_handle", "parlance", "parley_data", - "skrifa", + "skrifa 0.43.2", ] [[package]] name = "parley_data" -version = "0.10.0" -source = "git+https://github.com/linebender/parley?rev=f9f53108885410786a25098d7d41f023d33a3e25#f9f53108885410786a25098d7d41f023d33a3e25" +version = "0.11.0" +source = "git+https://github.com/linebender/parley?rev=30f6ff1970e958498787fbfbf68a2eb013bee158#30f6ff1970e958498787fbfbf68a2eb013bee158" dependencies = [ "icu_properties", ] @@ -5899,7 +5908,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" dependencies = [ "bytemuck", - "font-types", + "font-types 0.11.3", +] + +[[package]] +name = "read-fonts" +version = "0.40.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487889119a5f19ff7c0a20637196bdc76b9f54ebec17e3588b5d75e4999f8773" +dependencies = [ + "bytemuck", + "font-types 0.12.0", + "once_cell", ] [[package]] @@ -6597,7 +6617,7 @@ checksum = "caad12d9a3f75948b725a643cd60aea6de9d20cb03d3e35221e7a8a31c549409" dependencies = [ "fnv", "hashbrown 0.17.1", - "skrifa", + "skrifa 0.42.1", "thiserror 2.0.18", "write-fonts", ] @@ -6636,7 +6656,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.39.2", +] + +[[package]] +name = "skrifa" +version = "0.43.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbe997d0f2480442d727488fbe2150779114cbe480ecdbadef58b33e0318ffb" +dependencies = [ + "bytemuck", + "read-fonts 0.40.2", ] [[package]] @@ -7969,7 +7999,7 @@ dependencies = [ "log", "peniko", "png 0.18.1", - "skrifa", + "skrifa 0.42.1", "static_assertions", "thiserror 2.0.18", "vello_encoding", @@ -8019,7 +8049,7 @@ dependencies = [ "bytemuck", "guillotiere", "peniko", - "skrifa", + "skrifa 0.42.1", "smallvec", ] @@ -9295,11 +9325,11 @@ version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb731d4c4d93eacc69a1ad2f270f905788a98e4a3438267bcafbe08d3431c8d8" dependencies = [ - "font-types", + "font-types 0.11.3", "indexmap", "kurbo", "log", - "read-fonts", + "read-fonts 0.39.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index fa34aae21e..b9bad03327 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,7 +100,7 @@ taffy = { version = "=0.11.0-experimental-cache-fix.3", default-features = false "calc", "detailed_layout_info", ] } -parley = { git = "https://github.com/linebender/parley", rev="f9f53108885410786a25098d7d41f023d33a3e25", default-features = false, features = ["std"] } +parley = { git = "https://github.com/linebender/parley", rev="30f6ff1970e958498787fbfbf68a2eb013bee158", default-features = false, features = ["std"] } skrifa = { version = "0.42", default-features = false, features = [ "std", ] } # Should match parley and vello versions diff --git a/packages/blitz-dom/src/layout/inline.rs b/packages/blitz-dom/src/layout/inline.rs index b64f372997..7d84e6e36f 100644 --- a/packages/blitz-dom/src/layout/inline.rs +++ b/packages/blitz-dom/src/layout/inline.rs @@ -300,6 +300,7 @@ impl BaseDocument { ibox.height = 0.0; } else { let output = self.compute_child_layout(NodeId::from(ibox.id), child_inputs); + ibox.baseline = output.first_baselines.y; ibox.width = (margin.left + margin.right + output.size.width) * scale; ibox.height = (margin.top + margin.bottom + output.size.height) * scale; } @@ -537,7 +538,7 @@ impl BaseDocument { // dbg!(&layout.size); // dbg!(&layout.location); - state.append_inline_box_to_line(box_break_data.advance, 0.0); + state.append_inline_box_to_line(box_break_data.advance, 0.0, 0.0); // if float.is_floated() { // println!("INLINE FLOATED BOX ({}) {:?}", ibox.id, float); @@ -662,6 +663,11 @@ impl BaseDocument { // println!("known_dimensions: w: {:?} h: {:?}", inputs.known_dimensions.width, inputs.known_dimensions.height); // println!("\n"); + let first_baseline = inline_layout + .layout + .first_baseline() + .map(|baseline| baseline + content_box_inset.top); + // Put layout back self.nodes[node_id] .data @@ -672,7 +678,10 @@ impl BaseDocument { LayoutOutput { size: final_size, content_size: measured_size + padding.sum_axes(), - first_baselines: Point::NONE, + first_baselines: Point { + x: None, + y: first_baseline, + }, top_margin: CollapsibleMarginSet::ZERO, bottom_margin: CollapsibleMarginSet::ZERO, margins_can_collapse_through: !has_styles_preventing_being_collapsed_through