From 7c1cf16f4695aa1026caef5e44c25821dac8950c Mon Sep 17 00:00:00 2001 From: Kaur Kuut Date: Tue, 13 Jan 2026 00:20:20 +0200 Subject: [PATCH 1/5] This Month in Linebender, December 2025 --- .../2026-01-15-tmil-24/image_overdraw.jpg | Bin 0 -> 35952 bytes content/blog/2026-01-15-tmil-24/index.md | 232 ++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 content/blog/2026-01-15-tmil-24/image_overdraw.jpg create mode 100644 content/blog/2026-01-15-tmil-24/index.md diff --git a/content/blog/2026-01-15-tmil-24/image_overdraw.jpg b/content/blog/2026-01-15-tmil-24/image_overdraw.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72f35c7a07b4c5762a6e201760592bfde0fbd89e GIT binary patch literal 35952 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 literal 0 HcmV?d00001 diff --git a/content/blog/2026-01-15-tmil-24/index.md b/content/blog/2026-01-15-tmil-24/index.md new file mode 100644 index 0000000..3234c52 --- /dev/null +++ b/content/blog/2026-01-15-tmil-24/index.md @@ -0,0 +1,232 @@ ++++ +title = "Linebender in December 2025" +authors = ["Kaur Kuut"] ++++ + +Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for [the Rust programming language](https://rust-lang.org). + +## Vello + +Vello is our vector renderer with three different implementations. +There is the fully GPU compute based Vello, the fully CPU based Vello CPU, and the hybrid GPU/CPU one called Vello Hybrid. +They can draw large 2D scenes with high performance. + +- [vello#1293][]: Added tile intersection checking. +- [vello#1294][]: Added features to Vello CPU to switch between `u8` and `f32` pipelines. +- [vello#1303][]: Fixed filter expansion logic for transforms with scale/skew and for clipped layers. +- [vello#1313][]: Fixed gradients within a clip layer in Vello Hybrid. +- [vello#1315][]: Use `naga` from wgpu 27. +- [vello#1320][]: Made changes in preparation for `fearless_simd`. +- [vello#1323][]: Fixed non-deterministic GPU stroke artifacts. +- [vello#1325][]: Reduced the memory usage of wide tile commands. +- [vello#1327][]: Eliminated overdraw for opaque image fills. +- [vello#1336][]: Now using SIMD dispatch for flattening. + +
+A photo of a flower being layered on top of itself at decreasing size. +
+30% performance improvement in this flower's case with the new overdraw handling in Vello CPU / Vello Hybrid. +
+
+ +## Masonry and Xilem + +Masonry is the widget system developed by Linebender. +It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks. + +Xilem is our flagship GUI project, inspired by SwiftUI, which uses Masonry for its widgets. +It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer. + +- [xilem#1484][]: Split Android examples into separate files. +- [xilem#1488][]: Renamed `map_message` to `map_message_result`. +- [xilem#1500][]: Removed `ViewCtx::state_changed`. +- [xilem#1503][]: Split some Xilem code into new a new `xilem_masonry` package. +- [xilem#1504][]: Fixed `TextInput` placeholder alignment. +- [xilem#1507][]: Wrote guidelines for writing Xilem doc examples. +- [xilem#1510][]: Added a new `CollectionWidget` trait to unify collection widget method naming. +- [xilem#1513][]: Added `WidgetMut::id`. +- [xilem#1519][]: Added `Canvas` widget. +- [xilem#1520][]: Fixed `Portal` view. +- [xilem#1526][]: Implemented `Into` for `BorderColor`. +- [xilem#1527][]: Added `Gap` property to `Flex` and `Grid`. +- [xilem#1528][]: Added alternative text to `Image` widget. +- [xilem#1529][]: Added `WidgetTag::unique`. +- [xilem#1533][]: Renamed `Grid` attributes from `width` / `height` to `row_count`, `column_count`. +- [xilem#1534][]: Migrated to Kurbo's `Axis`. +- [xilem#1537][]: Fixed `ScrollBar` behavior with large content sizes. +- [xilem#1540][]: Improved `Flex` child constraint accuracy. +- [xilem#1544][]: Documented node non-persistence in accessibility method. +- [xilem#1545][]: Now using third person more consistently in docs. + +## Parley + +Parley is a text layout library. +It handles text layout, mostly at the level of line breaking and resolving glyph positions. + +- [parley#436][]: Migrated text analysis and internationalization to ICU4X. +- [parley#473][]: Now baking composite properties data. +- [parley#475][]: Now using ICU4X `Script` type in `fontique`. +- [parley#479][], [parley#481]: Started work on a dedicated glyph rendering crate. +- [parley#487][]: Exposed `Tag`. +- [parley#490][]: Fixed bidi state leaking across layouts. +- [parley#493][]: Fixed crash with empty layout. +- [parley#498][]: Updated to `ui-events` 0.2. + +## Kurbo + +Kurbo provides data structures and algorithms for curves and vector paths. + +- [kurbo#533][]: Clarified the order of `PathEl` points. +- [kurbo#534][]: Optimized `RoundedRect::winding`. + +## Peniko + +Peniko is a 2D graphics type library which provides a set of generic types that define styles for rendering and composition. + +- [peniko#155][]: Updated to Kurbo 0.13. + +## Fearless SIMD + +Fearless SIMD is our SIMD infrastructure library. +It provides a solid way for writing SIMD operations portably across Wasm, AArch64, x86, and x86_64. + +- [fearless_simd#141][]: Added `any_true`, `all_true`, `any_false`, and `all_false` methods for mask types. +- [fearless_simd#149][]: Reworked the API. +- [fearless_simd#154][]: Added documentation for operations and vector types. +- [fearless_simd#155][]: Added a vectored shift left operation. +- [fearless_simd#158][]: Renamed `madd` / `msub` to `mul_add` / `mul_sub` for consistency with `std`. +- [fearless_simd#159][]: Now using native vector types to back SIMD types. +- [fearless_simd#167][]: Added precise float-to-integer conversions, which saturate out-of-bounds results and convert `NaN` to `0` on all platforms. +- [fearless_simd#168][]: Added `Level::is_fallback`, which states whether the current SIMD level is the scalar fallback. +- [fearless_simd#170][]: Made `Element` an associated type on `SimdBase`. +- [fearless_simd#180][]: `SimdFrom::simd_from` now takes the SIMD token as the first argument instead of the second. + +## Velato + +Velato is our Lottie render library. +The goal is to provide coverage of the large Lottie spec, up to what Vello can render, for use in interactive graphics. + +We released [Velato 0.8][] and [0.8.1][Velato 0.8.1]. 🎉 + +## Bevy Vello + +Bevy Vello is our Bevy integration for Vello. +The goal is to provide support for rendering scenes, text, SVGs, and Lotties in the Bevy game engine. + +We released [Bevy Vello 0.11][], [0.12][Bevy Vello 0.12], and [0.12.1][Bevy Vello 0.12.1]. 🎉 + +- [bevy_vello#185][]: Added support for `UiTransform` for raw Vello scenes. +- [bevy_vello#188][]: Finished adding Bevy 0.17 support. +- [bevy_vello#191][]: Renamed `SSRenderTarget` to `VelloRenderTarget`. +- [bevy_vello#195][], [bevy_vello#196][]: Fixed AABBs not being correctly calculated. + +## Resvg + +Resvg is our fast, small, portable SVG library. + +- [resvg#980][], [resvg#981][]: No longer writing empty ``. +- [resvg#987][]: Now using checked arithmetic when computing bounding box. +- [resvg#990][]: Fixed panicking during pixmap creation. + +## SimpleCSS + +SimpleCSS is a basic CSS 2.1 parser and selector. + +- [simplecss#39][]: Added support for parsing `@font-face`. + +## Druid + +Druid is a GUI library which was a predecessor to Xilem, and an ancestor of Masonry. + +- [druid#2410][]: Updated to Piet 0.7, which is going to be the final Piet version compatible with Druid. + +## Get Involved + +We welcome collaboration on any of our crates. +This can include improving the documentation, implementing new features, improving our test coverage, or using them within your own code. + +We host an hour long office hours meeting each week where we discuss what's going on in our projects. +See [#office hours in Zulip](https://xi.zulipchat.com/#narrow/channel/359642-office-hours) for details. +We're also running a separate office hours time dedicated to the renderer collaboration, details also available at that link. + +If you wish to discuss the Linebender project individually, Daniel is offering ["office hours" appointments](https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2), which are free to book. +It really helps us to learn what aspects our users care about the most. + +[vello#1293]: https://github.com/linebender/vello/pull/1293 +[vello#1294]: https://github.com/linebender/vello/pull/1294 +[vello#1303]: https://github.com/linebender/vello/pull/1303 +[vello#1313]: https://github.com/linebender/vello/pull/1313 +[vello#1315]: https://github.com/linebender/vello/pull/1315 +[vello#1320]: https://github.com/linebender/vello/pull/1320 +[vello#1323]: https://github.com/linebender/vello/pull/1323 +[vello#1325]: https://github.com/linebender/vello/pull/1325 +[vello#1327]: https://github.com/linebender/vello/pull/1327 +[vello#1336]: https://github.com/linebender/vello/pull/1336 + +[xilem#1484]: https://github.com/linebender/xilem/pull/1484 +[xilem#1488]: https://github.com/linebender/xilem/pull/1488 +[xilem#1500]: https://github.com/linebender/xilem/pull/1500 +[xilem#1503]: https://github.com/linebender/xilem/pull/1503 +[xilem#1504]: https://github.com/linebender/xilem/pull/1504 +[xilem#1507]: https://github.com/linebender/xilem/pull/1507 +[xilem#1510]: https://github.com/linebender/xilem/pull/1510 +[xilem#1513]: https://github.com/linebender/xilem/pull/1513 +[xilem#1519]: https://github.com/linebender/xilem/pull/1519 +[xilem#1520]: https://github.com/linebender/xilem/pull/1520 +[xilem#1526]: https://github.com/linebender/xilem/pull/1526 +[xilem#1527]: https://github.com/linebender/xilem/pull/1527 +[xilem#1528]: https://github.com/linebender/xilem/pull/1528 +[xilem#1529]: https://github.com/linebender/xilem/pull/1529 +[xilem#1533]: https://github.com/linebender/xilem/pull/1533 +[xilem#1534]: https://github.com/linebender/xilem/pull/1534 +[xilem#1537]: https://github.com/linebender/xilem/pull/1537 +[xilem#1540]: https://github.com/linebender/xilem/pull/1540 +[xilem#1544]: https://github.com/linebender/xilem/pull/1544 +[xilem#1545]: https://github.com/linebender/xilem/pull/1545 + +[parley#436]: https://github.com/linebender/parley/pull/436 +[parley#473]: https://github.com/linebender/parley/pull/473 +[parley#475]: https://github.com/linebender/parley/pull/475 +[parley#479]: https://github.com/linebender/parley/pull/479 +[parley#481]: https://github.com/linebender/parley/pull/481 +[parley#487]: https://github.com/linebender/parley/pull/487 +[parley#490]: https://github.com/linebender/parley/pull/490 +[parley#493]: https://github.com/linebender/parley/pull/493 +[parley#498]: https://github.com/linebender/parley/pull/498 + +[kurbo#533]: https://github.com/linebender/kurbo/pull/533 +[kurbo#534]: https://github.com/linebender/kurbo/pull/534 + +[peniko#155]: https://github.com/linebender/peniko/pull/155 + +[fearless_simd#141]: https://github.com/linebender/fearless_simd/pull/141 +[fearless_simd#149]: https://github.com/linebender/fearless_simd/pull/149 +[fearless_simd#154]: https://github.com/linebender/fearless_simd/pull/154 +[fearless_simd#155]: https://github.com/linebender/fearless_simd/pull/155 +[fearless_simd#158]: https://github.com/linebender/fearless_simd/pull/158 +[fearless_simd#159]: https://github.com/linebender/fearless_simd/pull/159 +[fearless_simd#167]: https://github.com/linebender/fearless_simd/pull/167 +[fearless_simd#168]: https://github.com/linebender/fearless_simd/pull/168 +[fearless_simd#170]: https://github.com/linebender/fearless_simd/pull/170 +[fearless_simd#180]: https://github.com/linebender/fearless_simd/pull/180 + +[Velato 0.8]: https://github.com/linebender/velato/releases/tag/v0.8.0 +[Velato 0.8.1]: https://github.com/linebender/velato/releases/tag/v0.8.1 + +[Bevy Vello 0.11]: https://github.com/linebender/bevy_vello/releases/tag/v0.11.0 +[Bevy Vello 0.12]: https://github.com/linebender/bevy_vello/releases/tag/v0.12.0 +[Bevy Vello 0.12.1]: https://github.com/linebender/bevy_vello/releases/tag/v0.12.1 +[bevy_vello#185]: https://github.com/linebender/bevy_vello/pull/185 +[bevy_vello#188]: https://github.com/linebender/bevy_vello/pull/188 +[bevy_vello#191]: https://github.com/linebender/bevy_vello/pull/191 +[bevy_vello#195]: https://github.com/linebender/bevy_vello/pull/195 +[bevy_vello#196]: https://github.com/linebender/bevy_vello/pull/196 + +[resvg#980]: https://github.com/linebender/resvg/pull/980 +[resvg#981]: https://github.com/linebender/resvg/pull/981 +[resvg#987]: https://github.com/linebender/resvg/pull/987 +[resvg#990]: https://github.com/linebender/resvg/pull/990 + +[simplecss#39]: https://github.com/linebender/simplecss/pull/39 + +[druid#2410]: https://github.com/linebender/druid/pull/2410 From b54fa1e0eae5ceab1de844b02c103b8f7c00510c Mon Sep 17 00:00:00 2001 From: Kaur Kuut Date: Tue, 13 Jan 2026 13:44:50 +0200 Subject: [PATCH 2/5] Reorder items according to likely interest. --- content/blog/2026-01-15-tmil-24/index.md | 44 ++++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/content/blog/2026-01-15-tmil-24/index.md b/content/blog/2026-01-15-tmil-24/index.md index 3234c52..9bcb735 100644 --- a/content/blog/2026-01-15-tmil-24/index.md +++ b/content/blog/2026-01-15-tmil-24/index.md @@ -13,14 +13,14 @@ They can draw large 2D scenes with high performance. - [vello#1293][]: Added tile intersection checking. - [vello#1294][]: Added features to Vello CPU to switch between `u8` and `f32` pipelines. +- [vello#1327][]: Eliminated overdraw for opaque image fills. +- [vello#1325][]: Reduced the memory usage of wide tile commands. - [vello#1303][]: Fixed filter expansion logic for transforms with scale/skew and for clipped layers. - [vello#1313][]: Fixed gradients within a clip layer in Vello Hybrid. -- [vello#1315][]: Use `naga` from wgpu 27. -- [vello#1320][]: Made changes in preparation for `fearless_simd`. - [vello#1323][]: Fixed non-deterministic GPU stroke artifacts. -- [vello#1325][]: Reduced the memory usage of wide tile commands. -- [vello#1327][]: Eliminated overdraw for opaque image fills. - [vello#1336][]: Now using SIMD dispatch for flattening. +- [vello#1320][]: Made changes in preparation for `fearless_simd`. +- [vello#1315][]: Use `naga` from wgpu 27.
A photo of a flower being layered on top of itself at decreasing size. @@ -37,24 +37,24 @@ It provides a non-opinionated retained widget tree, designed as a base layer for Xilem is our flagship GUI project, inspired by SwiftUI, which uses Masonry for its widgets. It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer. -- [xilem#1484][]: Split Android examples into separate files. -- [xilem#1488][]: Renamed `map_message` to `map_message_result`. -- [xilem#1500][]: Removed `ViewCtx::state_changed`. -- [xilem#1503][]: Split some Xilem code into new a new `xilem_masonry` package. -- [xilem#1504][]: Fixed `TextInput` placeholder alignment. -- [xilem#1507][]: Wrote guidelines for writing Xilem doc examples. -- [xilem#1510][]: Added a new `CollectionWidget` trait to unify collection widget method naming. -- [xilem#1513][]: Added `WidgetMut::id`. - [xilem#1519][]: Added `Canvas` widget. -- [xilem#1520][]: Fixed `Portal` view. -- [xilem#1526][]: Implemented `Into` for `BorderColor`. +- [xilem#1510][]: Added a new `CollectionWidget` trait to unify collection widget method naming. - [xilem#1527][]: Added `Gap` property to `Flex` and `Grid`. - [xilem#1528][]: Added alternative text to `Image` widget. +- [xilem#1513][]: Added `WidgetMut::id`. - [xilem#1529][]: Added `WidgetTag::unique`. -- [xilem#1533][]: Renamed `Grid` attributes from `width` / `height` to `row_count`, `column_count`. +- [xilem#1526][]: Implemented `Into` for `BorderColor`. - [xilem#1534][]: Migrated to Kurbo's `Axis`. +- [xilem#1488][]: Renamed `map_message` to `map_message_result`. +- [xilem#1533][]: Renamed `Grid` attributes from `width` / `height` to `row_count`, `column_count`. +- [xilem#1484][]: Split Android examples into separate files. +- [xilem#1503][]: Split some Xilem code into new a new `xilem_masonry` package. +- [xilem#1500][]: Removed `ViewCtx::state_changed`. +- [xilem#1504][]: Fixed `TextInput` placeholder alignment. +- [xilem#1520][]: Fixed `Portal` view. - [xilem#1537][]: Fixed `ScrollBar` behavior with large content sizes. - [xilem#1540][]: Improved `Flex` child constraint accuracy. +- [xilem#1507][]: Wrote guidelines for writing Xilem doc examples. - [xilem#1544][]: Documented node non-persistence in accessibility method. - [xilem#1545][]: Now using third person more consistently in docs. @@ -64,9 +64,9 @@ Parley is a text layout library. It handles text layout, mostly at the level of line breaking and resolving glyph positions. - [parley#436][]: Migrated text analysis and internationalization to ICU4X. -- [parley#473][]: Now baking composite properties data. -- [parley#475][]: Now using ICU4X `Script` type in `fontique`. - [parley#479][], [parley#481]: Started work on a dedicated glyph rendering crate. +- [parley#475][]: Now using ICU4X `Script` type in `fontique`. +- [parley#473][]: Now baking composite properties data. - [parley#487][]: Exposed `Tag`. - [parley#490][]: Fixed bidi state leaking across layouts. - [parley#493][]: Fixed crash with empty layout. @@ -76,8 +76,8 @@ It handles text layout, mostly at the level of line breaking and resolving glyph Kurbo provides data structures and algorithms for curves and vector paths. -- [kurbo#533][]: Clarified the order of `PathEl` points. - [kurbo#534][]: Optimized `RoundedRect::winding`. +- [kurbo#533][]: Clarified the order of `PathEl` points. ## Peniko @@ -91,13 +91,13 @@ Fearless SIMD is our SIMD infrastructure library. It provides a solid way for writing SIMD operations portably across Wasm, AArch64, x86, and x86_64. - [fearless_simd#141][]: Added `any_true`, `all_true`, `any_false`, and `all_false` methods for mask types. -- [fearless_simd#149][]: Reworked the API. -- [fearless_simd#154][]: Added documentation for operations and vector types. +- [fearless_simd#167][]: Added precise float-to-integer conversions, which saturate out-of-bounds results and convert `NaN` to `0` on all platforms. +- [fearless_simd#168][]: Added `Level::is_fallback`, which states whether the current SIMD level is the scalar fallback. - [fearless_simd#155][]: Added a vectored shift left operation. +- [fearless_simd#154][]: Added documentation for operations and vector types. +- [fearless_simd#149][]: Reworked the API. - [fearless_simd#158][]: Renamed `madd` / `msub` to `mul_add` / `mul_sub` for consistency with `std`. - [fearless_simd#159][]: Now using native vector types to back SIMD types. -- [fearless_simd#167][]: Added precise float-to-integer conversions, which saturate out-of-bounds results and convert `NaN` to `0` on all platforms. -- [fearless_simd#168][]: Added `Level::is_fallback`, which states whether the current SIMD level is the scalar fallback. - [fearless_simd#170][]: Made `Element` an associated type on `SimdBase`. - [fearless_simd#180][]: `SimdFrom::simd_from` now takes the SIMD token as the first argument instead of the second. From 373af2b363029a3b0f6db7ba1f9a2abaa83ac330 Mon Sep 17 00:00:00 2001 From: Daniel McNab <36049421+DJMcNab@users.noreply.github.com> Date: Tue, 13 Jan 2026 12:14:43 +0000 Subject: [PATCH 3/5] Remove some "trivial" changes, and reorg some text --- content/blog/2026-01-15-tmil-24/index.md | 26 +++++++----------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/content/blog/2026-01-15-tmil-24/index.md b/content/blog/2026-01-15-tmil-24/index.md index 9bcb735..ee7ff5a 100644 --- a/content/blog/2026-01-15-tmil-24/index.md +++ b/content/blog/2026-01-15-tmil-24/index.md @@ -11,16 +11,12 @@ Vello is our vector renderer with three different implementations. There is the fully GPU compute based Vello, the fully CPU based Vello CPU, and the hybrid GPU/CPU one called Vello Hybrid. They can draw large 2D scenes with high performance. -- [vello#1293][]: Added tile intersection checking. - [vello#1294][]: Added features to Vello CPU to switch between `u8` and `f32` pipelines. - [vello#1327][]: Eliminated overdraw for opaque image fills. - [vello#1325][]: Reduced the memory usage of wide tile commands. - [vello#1303][]: Fixed filter expansion logic for transforms with scale/skew and for clipped layers. - [vello#1313][]: Fixed gradients within a clip layer in Vello Hybrid. - [vello#1323][]: Fixed non-deterministic GPU stroke artifacts. -- [vello#1336][]: Now using SIMD dispatch for flattening. -- [vello#1320][]: Made changes in preparation for `fearless_simd`. -- [vello#1315][]: Use `naga` from wgpu 27.
A photo of a flower being layered on top of itself at decreasing size. @@ -29,6 +25,9 @@ They can draw large 2D scenes with high performance.
+The work on rendering sparse strip alpha values in GPU compute shaders continued in [vello#1293][], which added tile intersection checking. +You can follow the progress in [#vello > Thoughts on GPU sparse strips](https://xi.zulipchat.com/#narrow/channel/197075-vello/topic/Thoughts.20on.20GPU.20sparse.20strips/with/567687539). + ## Masonry and Xilem Masonry is the widget system developed by Linebender. @@ -37,21 +36,17 @@ It provides a non-opinionated retained widget tree, designed as a base layer for Xilem is our flagship GUI project, inspired by SwiftUI, which uses Masonry for its widgets. It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer. -- [xilem#1519][]: Added `Canvas` widget. +- [xilem#1519][]: Added `Canvas` widget, for 2d vector drawing. - [xilem#1510][]: Added a new `CollectionWidget` trait to unify collection widget method naming. - [xilem#1527][]: Added `Gap` property to `Flex` and `Grid`. - [xilem#1528][]: Added alternative text to `Image` widget. -- [xilem#1513][]: Added `WidgetMut::id`. -- [xilem#1529][]: Added `WidgetTag::unique`. - [xilem#1526][]: Implemented `Into` for `BorderColor`. - [xilem#1534][]: Migrated to Kurbo's `Axis`. - [xilem#1488][]: Renamed `map_message` to `map_message_result`. - [xilem#1533][]: Renamed `Grid` attributes from `width` / `height` to `row_count`, `column_count`. - [xilem#1484][]: Split Android examples into separate files. - [xilem#1503][]: Split some Xilem code into new a new `xilem_masonry` package. -- [xilem#1500][]: Removed `ViewCtx::state_changed`. - [xilem#1504][]: Fixed `TextInput` placeholder alignment. -- [xilem#1520][]: Fixed `Portal` view. - [xilem#1537][]: Fixed `ScrollBar` behavior with large content sizes. - [xilem#1540][]: Improved `Flex` child constraint accuracy. - [xilem#1507][]: Wrote guidelines for writing Xilem doc examples. @@ -64,10 +59,10 @@ Parley is a text layout library. It handles text layout, mostly at the level of line breaking and resolving glyph positions. - [parley#436][]: Migrated text analysis and internationalization to ICU4X. -- [parley#479][], [parley#481]: Started work on a dedicated glyph rendering crate. +- [parley#479][], [parley#481]: Started work on a dedicated glyph rendering crate, Parley Draw. - [parley#475][]: Now using ICU4X `Script` type in `fontique`. -- [parley#473][]: Now baking composite properties data. -- [parley#487][]: Exposed `Tag`. +- [parley#473][]: We now bake composite properties data. +- [parley#487][]: Export `Tag` from HarfRust, to allow users to use it directly. - [parley#490][]: Fixed bidi state leaking across layouts. - [parley#493][]: Fixed crash with empty layout. - [parley#498][]: Updated to `ui-events` 0.2. @@ -156,27 +151,20 @@ It really helps us to learn what aspects our users care about the most. [vello#1294]: https://github.com/linebender/vello/pull/1294 [vello#1303]: https://github.com/linebender/vello/pull/1303 [vello#1313]: https://github.com/linebender/vello/pull/1313 -[vello#1315]: https://github.com/linebender/vello/pull/1315 -[vello#1320]: https://github.com/linebender/vello/pull/1320 [vello#1323]: https://github.com/linebender/vello/pull/1323 [vello#1325]: https://github.com/linebender/vello/pull/1325 [vello#1327]: https://github.com/linebender/vello/pull/1327 -[vello#1336]: https://github.com/linebender/vello/pull/1336 [xilem#1484]: https://github.com/linebender/xilem/pull/1484 [xilem#1488]: https://github.com/linebender/xilem/pull/1488 -[xilem#1500]: https://github.com/linebender/xilem/pull/1500 [xilem#1503]: https://github.com/linebender/xilem/pull/1503 [xilem#1504]: https://github.com/linebender/xilem/pull/1504 [xilem#1507]: https://github.com/linebender/xilem/pull/1507 [xilem#1510]: https://github.com/linebender/xilem/pull/1510 -[xilem#1513]: https://github.com/linebender/xilem/pull/1513 [xilem#1519]: https://github.com/linebender/xilem/pull/1519 -[xilem#1520]: https://github.com/linebender/xilem/pull/1520 [xilem#1526]: https://github.com/linebender/xilem/pull/1526 [xilem#1527]: https://github.com/linebender/xilem/pull/1527 [xilem#1528]: https://github.com/linebender/xilem/pull/1528 -[xilem#1529]: https://github.com/linebender/xilem/pull/1529 [xilem#1533]: https://github.com/linebender/xilem/pull/1533 [xilem#1534]: https://github.com/linebender/xilem/pull/1534 [xilem#1537]: https://github.com/linebender/xilem/pull/1537 From ceadf92134274074b01f2b49dc40f3b43955ce9e Mon Sep 17 00:00:00 2001 From: Kaur Kuut Date: Tue, 13 Jan 2026 15:35:51 +0200 Subject: [PATCH 4/5] Remove crate name reference for now. --- content/blog/2026-01-15-tmil-24/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2026-01-15-tmil-24/index.md b/content/blog/2026-01-15-tmil-24/index.md index ee7ff5a..bfbe025 100644 --- a/content/blog/2026-01-15-tmil-24/index.md +++ b/content/blog/2026-01-15-tmil-24/index.md @@ -59,7 +59,7 @@ Parley is a text layout library. It handles text layout, mostly at the level of line breaking and resolving glyph positions. - [parley#436][]: Migrated text analysis and internationalization to ICU4X. -- [parley#479][], [parley#481]: Started work on a dedicated glyph rendering crate, Parley Draw. +- [parley#479][], [parley#481]: Started work on a dedicated glyph rendering crate. - [parley#475][]: Now using ICU4X `Script` type in `fontique`. - [parley#473][]: We now bake composite properties data. - [parley#487][]: Export `Tag` from HarfRust, to allow users to use it directly. From 7ea8739b643fbba1f845a9293979c02c25db3e27 Mon Sep 17 00:00:00 2001 From: Kaur Kuut Date: Thu, 15 Jan 2026 20:44:23 +0200 Subject: [PATCH 5/5] Remove Daniel's booking. --- content/blog/2026-01-15-tmil-24/index.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/content/blog/2026-01-15-tmil-24/index.md b/content/blog/2026-01-15-tmil-24/index.md index bfbe025..7359a98 100644 --- a/content/blog/2026-01-15-tmil-24/index.md +++ b/content/blog/2026-01-15-tmil-24/index.md @@ -144,9 +144,6 @@ We host an hour long office hours meeting each week where we discuss what's goin See [#office hours in Zulip](https://xi.zulipchat.com/#narrow/channel/359642-office-hours) for details. We're also running a separate office hours time dedicated to the renderer collaboration, details also available at that link. -If you wish to discuss the Linebender project individually, Daniel is offering ["office hours" appointments](https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2), which are free to book. -It really helps us to learn what aspects our users care about the most. - [vello#1293]: https://github.com/linebender/vello/pull/1293 [vello#1294]: https://github.com/linebender/vello/pull/1294 [vello#1303]: https://github.com/linebender/vello/pull/1303