|
| 1 | ++++ |
| 2 | +title = "Linebender in October 2025" |
| 3 | +authors = ["Raph Levien"] |
| 4 | ++++ |
| 5 | +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). |
| 6 | + |
| 7 | +October saw steady progress on our core crates, including a number of releases. |
| 8 | + |
| 9 | +## Vello |
| 10 | + |
| 11 | +Vello is our GPU vector renderer. |
| 12 | +It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work. |
| 13 | + |
| 14 | +Laurenz Stampl has done his Masters degree at ETH Zurich on high performance CPU rendering of 2D graphics, particularly the techniques used in Vello CPU. |
| 15 | +The [masters thesis] is now published. |
| 16 | +It contains up-to-date background on 2D rendering, which is not well represented in the literature, as well as an explanation of the sparse strip method, and benchmarks. |
| 17 | + |
| 18 | +<figure> |
| 19 | + |
| 20 | +<img style="height: auto" width="1170" height="920" src="sparse_strip.png" alt="The tiling of a butterfly shape at four different levels of granularity. The top left shows many small tiles, while the bottom right shows fewer large ones, but also a much smaller fraction of space not covered by a tile."> |
| 21 | + |
| 22 | +<!-- <img style="height: auto; width: 50%; margin-left: 25%;" width="666" height="673" src="hybrid-blending.png" alt="A series of overlapping shapes of various colours, variously composited."> --> |
| 23 | + |
| 24 | +<figcaption> |
| 25 | + |
| 26 | +An illustration from Laurenz Stampfl's Masters Thesis, showing the effect of tile size on rendering efficiency. |
| 27 | + |
| 28 | +</figcaption> |
| 29 | +</figure> |
| 30 | + |
| 31 | +We released version [0.0.4 of the sparse strips][sparse strips 0.0.4] versions of the renderer. |
| 32 | +It should be a solid version of [Vello CPU](https://crates.io/crates/vello_cpu), suitable for a wider range of applications where CPU-only rendering is appropriate. |
| 33 | +In addition, it is the initial release of Vello Hybrid, a newer approach that uses the GPU to do pixel compositing, but SIMD-accelerated geometry processing on the CPU. |
| 34 | + |
| 35 | +Vello CPU now supports non-isolated blending ([vello#1159][] among others), which is important for HTML5 canvas compatibility. |
| 36 | +SVG and COLRv1 emoji, by contrast, which has set priorities for Vello in the past, only support isolated blending. |
| 37 | +There are also promising early results for supporting image filters including blurs. |
| 38 | + |
| 39 | +A major development in Vello Hybrid is support for multiple image atlases ([vello#1252][]), which improves performance for image rendering. |
| 40 | + |
| 41 | +Thomas Smith has been making excellent progress on rendering sparse strip alpha values in GPU compute shaders. |
| 42 | +This was the original motivation for the sparse strip work. |
| 43 | +You can follow the progress in [#vello > Thoughts on GPU sparse strips]. |
| 44 | + |
| 45 | +Work on Vello Classic focused on support for web standard compatibility, motivated by Servo integration. |
| 46 | +Those features include support for non-premultiplied alpha ([vello#1173][], [vello#1262][], [vello#1145][]). |
| 47 | +This has been released in [Vello v0.6.0], which also upgraded to wgpu v26 for compatibility with Bevy v0.17. |
| 48 | + |
| 49 | + |
| 50 | +## Masonry and Xilem |
| 51 | + |
| 52 | +Masonry is the widget system developed by Linebender. |
| 53 | +It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks. |
| 54 | + |
| 55 | +Xilem is our flagship GUI project, inspired by SwiftUI, which uses Masonry for its widgets. |
| 56 | +It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer. |
| 57 | + |
| 58 | +We released [version 0.4][Xilem 0.4.0] of both Masonry and Xilem in October. |
| 59 | +This release comprises 7 crates, including Xilem Web. |
| 60 | +It is the first release to switch over to the new HarfRust library, developed by Google Fonts, for shaping, replacing Swash. |
| 61 | + |
| 62 | +## Parley |
| 63 | + |
| 64 | +Parley is a text layout library. |
| 65 | +It handles text layout, mostly at the level of line breaking and resolving glyph positions. |
| 66 | + |
| 67 | +We released version [0.6 of Parley][parley 0.6.0]. |
| 68 | + |
| 69 | +Slint has moved from their hand-rolled text implementation to Parley, and released version [1.14][Slint 1.14]. |
| 70 | +Linebender is thrilled to have other UI toolkits in the ecosystem adopt our crates. |
| 71 | + |
| 72 | +Much of the development work on Parley is directed toward supporting HTML floats, particularly in Blitz. |
| 73 | +[parley#421][] is the main PR tracking this work, and references several other PRs. |
| 74 | + |
| 75 | +There has also been some performance work, which especially impacts larger paragraphs. |
| 76 | +This work continues, and we hope to publish quantitative benchmark results (based on the benchmark suite in Cosmic Text) in November. |
| 77 | + |
| 78 | +We're also in the process of migrating to ICU4X for Unicode primitives, replacing our own hand-rolled implementations ([parley#436][]). |
| 79 | +This change should improve maintainability. |
| 80 | + |
| 81 | +## Fearless SIMD |
| 82 | + |
| 83 | +Fearless SIMD is our SIMD infrastructure library. |
| 84 | +It provides a solid way for writing SIMD operations portably across Wasm, AArch64, x86, and x86_64. |
| 85 | + |
| 86 | +We released [Fearless SIMD 0.3] in October. |
| 87 | +This release contains improvements in integer operations, particularly variable sized shifting, and better native support for fused multiply-add and multiply-subtract. |
| 88 | + |
| 89 | +As development work, we are pursuing a new approach to using intrinsics safely inside `#[target_feature]` blocks: [fearless_simd#108]. |
| 90 | +[Safe SIMD intrinsics](https://blog.rust-lang.org/2025/05/15/Rust-1.87.0/#safe-architecture-intrinsics) were added in Rust 1.87, and we encourage using them when writing architecture-specific code. |
| 91 | +An explicit design goal of Fearless SIMD is to allow portable code in cases where the functionality is reasonably common across architectures, but also facilitate "downcasting" to a specific SIMD level when those intrinsics offer higher performance than the portable choice. |
| 92 | +For more details on downcasting, see the [A plan for SIMD] blog post. |
| 93 | + |
| 94 | + |
| 95 | +## Get Involved |
| 96 | + |
| 97 | +We welcome collaboration on any of our crates. |
| 98 | +This can include improving the documentation, implementing new features, improving our test coverage, or using them within your own code. |
| 99 | + |
| 100 | +We host an hour long office hours meeting each week where we discuss what's going on in our projects. |
| 101 | +See [#office hours in Zulip](https://xi.zulipchat.com/#narrow/channel/359642-office-hours) for details. |
| 102 | +We're also running a separate office hours time dedicated to the renderer collaboration, details also available at that link. |
| 103 | + |
| 104 | +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. |
| 105 | +It really helps us to learn what aspects our users care about the most. |
| 106 | + |
| 107 | +[Xilem 0.4.0]: https://github.com/linebender/xilem/releases/tag/v0.4.0 |
| 108 | + |
| 109 | +[Vello v0.6.0]: https://github.com/linebender/vello/releases/tag/v0.6.0 |
| 110 | + |
| 111 | +[sparse strips 0.0.4]: https://github.com/linebender/vello/releases/tag/sparse-strips-v0.0.4 |
| 112 | + |
| 113 | +[parley 0.6.0]: https://github.com/linebender/parley/releases/tag/v0.6.0 |
| 114 | + |
| 115 | +[Fearless SIMD 0.3]: https://github.com/linebender/fearless_simd/releases/tag/v0.3.0 |
| 116 | + |
| 117 | +[Slint 1.14]: https://slint.dev/blog/slint-1.14-released |
| 118 | +[masters thesis]: https://ethz.ch/content/dam/ethz/special-interest/infk/inst-pls/plf-dam/documents/StudentProjects/MasterTheses/2025-Laurenz-Thesis.pdf |
| 119 | +[#vello > Thoughts on GPU sparse strips]: https://xi.zulipchat.com/#narrow/channel/197075-vello/topic/Thoughts.20on.20GPU.20sparse.20strips/near/543334092 |
| 120 | + |
| 121 | +[parley#436]: https://github.com/linebender/parley/pull/436 |
| 122 | + |
| 123 | +[vello#1173]: https://github.com/linebender/vello/pull/1173 |
| 124 | +[vello#1262]: https://github.com/linebender/vello/pull/1262 |
| 125 | +[vello#1145]: https://github.com/linebender/vello/pull/1145 |
| 126 | +[vello#1159]: https://github.com/linebender/vello/pull/1159 |
| 127 | +[vello#1252]: https://github.com/linebender/vello/pull/1252 |
| 128 | + |
| 129 | +[fearless_simd#108]: https://github.com/linebender/fearless_simd/pull/108 |
| 130 | + |
| 131 | +[A plan for SIMD]: https://linebender.org/blog/a-plan-for-simd/ |
| 132 | + |
| 133 | +[parley#421]: https://github.com/linebender/parley/pull/421 |
0 commit comments