Skip to content

Commit c46f22d

Browse files
DJMcNabLaurenzVraphlinus
authored
This Month In Linebender, July 2025 (#119)
[#linebender > This month in Linebender](https://xi.zulipchat.com/#narrow/channel/419691-linebender/topic/This.20month.20in.20Linebender/with/527917922) --------- Co-authored-by: Laurenz Stampfl <[email protected]> Co-authored-by: Raph Levien <[email protected]> Co-authored-by: Raph Levien <[email protected]>
1 parent ea49298 commit c46f22d

File tree

3 files changed

+265
-0
lines changed

3 files changed

+265
-0
lines changed
Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
+++
2+
title = "Linebender in July 2025"
3+
authors = ["Daniel McNab", " Laurenz Stampfl"]
4+
+++
5+
6+
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).
7+
8+
## Vello
9+
10+
Vello is our GPU vector renderer.
11+
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.
12+
13+
- [vello#785][]: Fixed strokes with a width of zero being treated as fills.
14+
- [vello#908][]: Updated to wgpu version 25.
15+
- [vello#1093][]: Disabled runtime checks in shaders using wgpu's new `create_shader_module_trusted` API, by sagudev.
16+
17+
This month's progress on the sparse strips renderers, a collaborative evolution of Vello, has been centered around adding support for NEON and WASM SIMD, as well as making further improvements to multi-threaded rendering.
18+
19+
- [vello#1064][], [vello#1086][]: Image rendering in Vello Hybrid.
20+
- [vello#1078][]: Rewrote Vello CPU to be more SIMD-friendly.
21+
- [vello#1092][]: Adds support for SIMD flattening.
22+
- [vello#1103][]: Optimises alpha coverage calculation in strip rendering.
23+
- [vello#1105][]: Ignores paths containing NaN points, giving a warning.
24+
- [vello#1122][]: Adds opacity layers to Vello Hybrid.
25+
- [vello#1134][]: Reuses FlattenCtx for paths.
26+
- [kurbo#427][]: Contains a new stroke expander with significant performance improvements.
27+
28+
Our [working roadmap](https://docs.google.com/document/d/1ZquH-53j2OedTbgEKCJBKTh4WLE11UveM10mNdnVARY/edit?tab=t.0#heading=h.j3duh9pgdm94) outlines the planned timeline for work on the renderers into next year.
29+
30+
An integration of Vello as the backend for Servo's canvas rendering has landed in [servo#36821][] (and also Vello CPU in [servo#38282][]).
31+
You can follow this work at [servo#38345][].
32+
33+
### Benchmarking
34+
35+
We have performed some benchmarking to understand where Vello CPU's performance lies in the available 2d renderers.
36+
We did this by creating [a fork of the Blend2D benchmark harness](https://github.com/LaurenzV/blend2d-apps/tree/benching) with the addition of Vello CPU.
37+
We also added Tiny Skia, which is also stewarded by Linebender and is another popular renderer written in Rust.
38+
You can read more about the benchmark methodology on [Blend2D's performance page](https://blend2d.com/performance.html).
39+
We wish to thank the Blend2D team for creating this excellent suite of tests.
40+
41+
<!-- We did try embedding the results here, but it doesn't really work nicely -->
42+
<!-- <details>
43+
44+
<style>
45+
@media screen and (max-width: 800px) {
46+
#tmil19-vello-charts-frame {
47+
width: 800px;
48+
position: relative;
49+
left: -15px;
50+
}
51+
}
52+
@media screen and (max-width: 1000px) {
53+
#tmil19-vello-charts-frame {
54+
width: 800px;
55+
position: relative;
56+
left: -30px;
57+
/* min-height: 65vh */
58+
}
59+
}
60+
#tmil19-vello-charts-frame {
61+
width: 1000px;
62+
position: relative;
63+
left: -80px;
64+
height: 65vh;
65+
max-height: content;
66+
}
67+
</style>
68+
69+
<iframe src="https://laurenzv.github.io/vello_chart/" id="tmil19-vello-charts-frame"></iframe>
70+
71+
</details> -->
72+
73+
The [benchmark results page](https://laurenzv.github.io/vello_chart/) shows the results of running this suite on an Apple M1 Pro.
74+
This shows the results for Blend2D, Agg, Tiny Skia, Vello CPU, Cairo, Skia, and JUCE.
75+
The source for this results page is available on GitHub at <https://github.com/LaurenzV/vello_chart>.
76+
77+
Some things that should be noted here:
78+
79+
- Vello CPU is still under active development, so these are only preliminary results.
80+
- We currently do not support x86-64 SIMD, which is why these charts currently only show an ARM machine.
81+
As noted below, we're actively working on x86-64 support.
82+
- Tiny Skia's relative performance [is documented](https://github.com/linebender/tiny-skia?tab=readme-ov-file#performance) to be worse on ARM than on x86-64.
83+
We therefore expect the performance gap between Vello CPU and Tiny Skia to be smaller on x86-64.
84+
85+
It is clear that `vello-cpu` has very impressive performance and on track to become the fastest CPU-only renderer in the Rust ecosystem!
86+
Blend2D is still the clear winner in these tests, but `vello-cpu` takes second place in many of the benchmarks, often beating other mature renderers such as Skia and Cairo.
87+
This is especially the case as the size of the geometry gets larger.
88+
Blend2D and `vello-cpu` both offer multi-threaded rendering modes (marked by the 2T/4T/8T suffixes, as opposed to ST for single threaded).
89+
Vello CPU's multithreading is especially effective when drawing larger geometries with curves or when using complex paints such as gradients or patterns.
90+
91+
### Fearless SIMD
92+
93+
Fearless SIMD is our SIMD infrastructure library.
94+
We are developing it in concert with the Vello sparse strips renderers, particularly `vello_cpu`.
95+
96+
To support the significant Vello CPU refactor using SIMD, this month saw the addition of more methods implemented in both Neon and WebAssembly.
97+
Thanks to new contributions from Benjamin Saunders we've started on SSE 4.2 support for `x86` architectures.
98+
99+
- [fearless_simd#24][], [fearless_simd#26][], [fearless_simd#27][]: Implement all WASM SIMD methods.
100+
- [fearless_simd#31][]: Introduce semantic conversion traits, by Benjamin Saunders.
101+
- [fearless_simd#42][] (not yet merged): SSE 4.2 support, by Benjamin Saunders.
102+
103+
## Masonry
104+
105+
Masonry is the widget system developed by Linebender.
106+
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.
107+
108+
<!-- TODO: Maybe trim again? -->
109+
- [xilem#1077][]: Added the accessibility integration for VirtualScroll.
110+
- [xilem#1096][]: Improved the default styles in Masonry, by Marco Melorio.
111+
- [xilem#1124][]: Make Checkbox support keyboard interaction, by tannal.
112+
- [xilem#1130][]: Rename `Textbox` to `TextInput`.
113+
- [xilem#1163][]: Make text color controlled through properties.
114+
- [xilem#1168][]: Add `IndexedStack` widget, by Kiran Wells.
115+
- [xilem#1170][], [xilem#1178][]: Use [Anymore](#anymore) for all actions.
116+
- [xilem#1189][]: Add the active status.
117+
- [xilem#1200][]: Simplify both exclusive and immutable raw access to child widgets.
118+
- [xilem#1212][]: Add a convenience associated type for the action type generated by each widget.
119+
- [xilem#1213][]: Add a post_paint pass, designed for box shadows.
120+
- [xilem#1215][]: Create a `NewWidget` type, which encapsulates the metadata associated with new widgets.
121+
- [xilem#1223][]: Add cache to avoid relayouts when constraints haven't changed.
122+
- [xilem#1237][]: Add rudimentary clipboard support.
123+
- [xilem#1239][]: Add pixel snapping to layout pass.
124+
- [xilem#1246][]: Use properties in `ProgressBar`, by Pufferfish.
125+
- [xilem#1248][]: Make all widget associated properties be stored in the same arena.
126+
- [xilem#1253][]: Let Masonry's button have any, by Nixon.
127+
128+
<figure>
129+
130+
<img style="height: auto" width="521" height="420" src="masonry_new_style.png" alt="A todo list app, with items referring to aspects of the new design language, namely 'New Colours', 'Increased Consistency', and 'More Rounded Corners'. The item labelled 'A full design system' is unchecked.">
131+
132+
<figcaption>
133+
134+
As of [xilem#1096][] Masonry's default styles have been improved.
135+
This is not a full design system, but is a piecewise improvement.
136+
137+
</figcaption>
138+
</figure>
139+
140+
## Xilem
141+
142+
Xilem is our flagship GUI project, inspired by SwiftUI, which uses Masonry for its widgets.
143+
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.
144+
Our work on Placehero, which is the working name for our Mastodon client example, has inspired several significant architectural improvements in Xilem.
145+
146+
- [xilem#1117][], [xilem#1122][]: Make `DynMessage` not require `Send`, and remove the `Message` generic from View.
147+
- [xilem#1142][]: Add an environment system.
148+
- [xilem#1170][]: Use [Anymore](#anymore) for messages.
149+
- [xilem#1220][], [xilem#1256][]: Use the environment system for avatars in Placehero.
150+
- [xilem#1257][]: Avoid per-frame potential allocations in views with multiple children (i.e. Flex, Grid).
151+
152+
<figure>
153+
154+
<img style="height: auto" width="1202" height="1029" src="xilem_chess.png" alt="A chess board, with several controls to the left. The white queen is highlighted, and all its valid moves are also highlighted.">
155+
156+
<figcaption>
157+
158+
For July, we would like to showcase this Chess GUI developed using Xilem by Dr. Salewski.
159+
It can be found in its repository at <https://github.com/StefanSalewski/xilem-chess>.
160+
161+
</figcaption>
162+
</figure>
163+
164+
## Anymore
165+
166+
You might have noticed mentions of [Anymore](https://github.com/linebender/anymore) in both the Xilem and Masonry sections.
167+
This is a new crate which we've created for the `AnyDebug` trait.
168+
This allows creating dynamically typed values which can be inspected, making debugging downcasting failures much easier.
169+
This crate is designed for stability, so that it can be used for interoperability between projects (without allocation).
170+
We plan to release version 1.0 in early August.
171+
172+
## Parley
173+
174+
Parley is a text layout library.
175+
It handles text layout, mostly at the level of line breaking and resolving glyph positions.
176+
177+
- [parley#378][]: Reimplements the fontconfig backend using FFI, improving font matching.
178+
- [parley#378][]: Implements shift-click selection extension, by kekelp.
179+
- [parley#389][]: Renames variants to more closely match CSS.
180+
- [parley#395][]: Adds a method to unregister a loaded font.
181+
182+
## Kurbo
183+
184+
We released [Kurbo 0.11.3][], with some ergonomics and performance improvements, calculation of moments using Green's theorem, and other methods.
185+
186+
As mentioned in the Vello section, the new, faster stroke expansion logic ([kurbo#427][]) has landed in main.
187+
This will be in the upcoming 0.12 release, which is semver-breaking because of changes to the API to reduce memory allocation.
188+
189+
## Raph's job change
190+
191+
Raph Levien has decided to take a voluntary exit offer from Google.
192+
He is very grateful for the opportunity and the support from Google Fonts of Linebender and Rust UI projects.
193+
His last day there will be October 12.
194+
He has a new gig lined up, as well – he plans to join Canva in January, working on rendering and Rust.
195+
That also involves a move to Australia, an exciting new adventure.
196+
Through all the changes, he intends to continue his work on Linebender and Rust UI, though towards the end of the year he will be taking things a bit easy.
197+
The timing of office hours will also need to change, to accommodate the time zone; more updates will be forthcoming.
198+
199+
## Get Involved
200+
201+
We welcome collaboration on any of our crates.
202+
This can include improving the documentation, implementing new features, improving our test coverage, or using them within your own code.
203+
204+
We host an hour long office hours meeting each week where we discuss what's going on in our projects.
205+
We're also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.
206+
See [#office hours in Zulip](https://xi.zulipchat.com/#narrow/channel/359642-office-hours) for details.
207+
208+
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.
209+
It really helps us to learn what aspects our users care about the most.
210+
211+
[vello#1064]: https://github.com/linebender/vello/pull/1064
212+
[vello#1078]: https://github.com/linebender/vello/pull/1078
213+
[vello#1086]: https://github.com/linebender/vello/pull/1086
214+
[vello#1092]: https://github.com/linebender/vello/pull/1092
215+
[vello#1093]: https://github.com/linebender/vello/pull/1093
216+
[vello#1103]: https://github.com/linebender/vello/pull/1103
217+
[vello#1105]: https://github.com/linebender/vello/pull/1105
218+
[vello#1122]: https://github.com/linebender/vello/pull/1122
219+
[vello#1134]: https://github.com/linebender/vello/pull/1134
220+
[vello#785]: https://github.com/linebender/vello/pull/785
221+
[vello#908]: https://github.com/linebender/vello/pull/908
222+
223+
[kurbo#427]: https://github.com/linebender/kurbo/pull/427
224+
225+
[servo#36821]: https://github.com/servo/servo/pull/36821
226+
[servo#38282]: https://github.com/servo/servo/pull/38282
227+
[servo#38345]: https://github.com/servo/servo/pull/38345
228+
229+
[fearless_simd#24]: https://github.com/linebender/fearless_simd/pull/24
230+
[fearless_simd#26]: https://github.com/linebender/fearless_simd/pull/26
231+
[fearless_simd#27]: https://github.com/linebender/fearless_simd/pull/27
232+
[fearless_simd#31]: https://github.com/linebender/fearless_simd/pull/31
233+
[fearless_simd#42]: https://github.com/linebender/fearless_simd/pull/42
234+
235+
[parley#378]: https://github.com/linebender/parley/pull/378
236+
[parley#389]: https://github.com/linebender/parley/pull/389
237+
[parley#395]: https://github.com/linebender/parley/pull/395
238+
239+
[xilem#1077]: https://github.com/linebender/xilem/pull/1077
240+
[xilem#1096]: https://github.com/linebender/xilem/pull/1096
241+
[xilem#1117]: https://github.com/linebender/xilem/pull/1117
242+
[xilem#1122]: https://github.com/linebender/xilem/pull/1122
243+
[xilem#1124]: https://github.com/linebender/xilem/pull/1124
244+
[xilem#1130]: https://github.com/linebender/xilem/pull/1130
245+
[xilem#1142]: https://github.com/linebender/xilem/pull/1142
246+
[xilem#1163]: https://github.com/linebender/xilem/pull/1163
247+
[xilem#1168]: https://github.com/linebender/xilem/pull/1168
248+
[xilem#1170]: https://github.com/linebender/xilem/pull/1170
249+
[xilem#1178]: https://github.com/linebender/xilem/pull/1178
250+
[xilem#1189]: https://github.com/linebender/xilem/pull/1189
251+
[xilem#1200]: https://github.com/linebender/xilem/pull/1200
252+
[xilem#1212]: https://github.com/linebender/xilem/pull/1212
253+
[xilem#1213]: https://github.com/linebender/xilem/pull/1213
254+
[xilem#1215]: https://github.com/linebender/xilem/pull/1215
255+
[xilem#1220]: https://github.com/linebender/xilem/pull/1220
256+
[xilem#1223]: https://github.com/linebender/xilem/pull/1223
257+
[xilem#1237]: https://github.com/linebender/xilem/pull/1237
258+
[xilem#1239]: https://github.com/linebender/xilem/pull/1239
259+
[xilem#1246]: https://github.com/linebender/xilem/pull/1246
260+
[xilem#1248]: https://github.com/linebender/xilem/pull/1248
261+
[xilem#1253]: https://github.com/linebender/xilem/pull/1253
262+
[xilem#1256]: https://github.com/linebender/xilem/pull/1256
263+
[xilem#1257]: https://github.com/linebender/xilem/pull/1257
264+
265+
[Kurbo 0.11.3]: https://github.com/linebender/kurbo/releases/tag/v0.11.3
12.5 KB
Loading
70.1 KB
Loading

0 commit comments

Comments
 (0)