Skip to content

Commit 488d101

Browse files
authored
Initial rough draft of TMIL 25 (#138)
This is a start for this "month" in Linebender for 2026 Q1.
1 parent 0f7f58e commit 488d101

8 files changed

Lines changed: 163 additions & 3 deletions

File tree

.github/workflows/check.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ jobs:
2525
- uses: actions/checkout@v4
2626

2727
- name: check typos
28-
uses: crate-ci/typos@v1.30.1
28+
uses: crate-ci/typos@v1.45.0

.typos.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ extend-ignore-re = ["colour-science"]
1414
LOD = "LOD"
1515
relm = "relm"
1616
Stoer = "Stoer"
17+
Canva = "Canva"
1718

1819
# Match Inside a Word - Case Insensitive
1920
[default.extend-words]

content/blog/2025-01-13-tmil-12/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ We plan for Kompari to standardise and improve the developer experience of snaps
7777
It can generate reports which summarises failed snapshot tests, and will also contain functionality for interactive blessing of new snapshots.
7878
This reporting can be integrated into a repository as an xtask:
7979

80-
```commandline
80+
```bash
8181
cargo xtask report
8282
```
8383

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
+++
2+
title = "Linebender in 2026 Q1"
3+
authors = ["Raph Levien"]
4+
+++
5+
6+
Apologies for the delay in the update, as the past three months have been a hectic time.
7+
Two of the core Linebender team members, myself and Daniel McNab, have moved across the world and started full-time jobs at Canva.
8+
Getting onboarded has taken a lot of time and energy, but fortunately, work on Linebender crates remains a core part of our responsibilities.
9+
And in the meantime, the community has been pushing forward.
10+
11+
## Vello
12+
13+
We've made big improvements to Vello Hybrid, both in capabilities and in performance.
14+
15+
Several releases, most recently [sparse strips 0.0.7](https://github.com/linebender/vello/releases/tag/sparse-strips-v0.0.7) (encompassing both Vello CPU and Vello Hybrid) and [Vello 0.8.0](https://github.com/linebender/vello/releases/tag/v0.8.0).
16+
17+
Optimizations:
18+
* Fast paths to bypass full coarse rasterization.
19+
* Special case drawing rectangles (as opposed to general Bézier paths)
20+
* First cut at glyph caching – more work is needed.
21+
* TODO fill out more
22+
23+
Vello Hybrid is currently at roughly beta quality; there are some rough edges still and performance work to be done, but it should be usable.
24+
25+
While we were hoping for a project called Vello API to provide a unified, low level API encompassing both Vello CPU and Vello Hybrid, we ran into more complexity and difficulty than intended.
26+
There are two abstraction layers that can be used for a variety of renderers, both Vello and other renderers including Skia.
27+
* [AnyRender], which is part of Blitz.
28+
* [imaging], which is part of the forest-rs organization.
29+
30+
These two crates are fairly similar in scope, but with different emphasis.
31+
AnyRender prioritizes ergonomics, in general closely following the traditional canvas API, while imaging is focused on performance and a more complete set of operations.
32+
33+
### Glifo
34+
35+
Until recently, all three manifestations of Vello each had their own copy of code to extract font outlines and render them.
36+
For ordinary fonts, this isn't a lot of logic on top of Skrifa.
37+
But for color emoji, it's more complicated and involves wiring up a lot more of the imaging model.
38+
We've also been finding scope for more operations at the layer between simple rendering and low-level font parsing, including ink skipping for underlines.
39+
To handle these functions, we created a crate called "parley_draw" inside the Parley repo, but that wasn't the right name or the right place for it, as these functions aren't really related to text layout.
40+
The crate has now been renamed to "Glifo," and has moved into the Vello repo.
41+
The new location is to reduce the friction to iterate on the implementation of atlas-based glyph caching.
42+
43+
For a more recent discussion of the scope and goals of Glifo, see the thread [#vello > Glifo: A separation of concerns](https://xi.zulipchat.com/#narrow/channel/197075-vello/topic/Glifo.3A.20A.20separation.20of.20concerns/with/584192738).
44+
45+
In the longer term, we would like to see Glifo become independent of Vello rendering and be adopted by other projects in the ecosystem, but for the time being it should be considered in development.
46+
47+
## Parley
48+
49+
Parley has seen slow but steady improvements in features, including:
50+
51+
* [parley#536] enumerate system fonts on mac using CoreText
52+
* [parley#540] Load fonts from system, and provided paths
53+
* [parley#551] CSS text-indent support
54+
* [parley#563] Implement all possible AccessKit text properties
55+
56+
Bevy has switched to Parley ([Zulip thread](https://xi.zulipchat.com/#narrow/channel/205635-parley/topic/Bevy.20now.20uses.20Parley.2FFontique.20for.20text/with/578693539)).
57+
58+
CuTTY is a fork of Alacritty (a high performance terminal emulator) that has been ported to Vello and Parley ([Zulip thread](https://xi.zulipchat.com/#narrow/channel/205635-parley/topic/I.20forked.20and.20migrated.20Alacritty.20to.20Vello.2BParley/with/580875316)).
59+
60+
Other projects which now use Parley but have not previously been mentioned are:
61+
* [Gosub engine](https://gosub.io/) (browser engine)
62+
* [drafft-ink](https://github.com/PatWie/drafft-ink) (infinite canvas whiteboard)
63+
* [Takumi] (renders HTML/JSX/etc into images)
64+
65+
It's gratifying to see all this adoption.
66+
It seems like recognition that Parley is a viable text layout library for a broad range of applications.
67+
68+
## Xilem and Masonry
69+
70+
Masonry has moved to [imaging] as an abstraction over the 2D rendering engine ([xilem#1696]).
71+
Previously it had been hardcoded to use Vello classic.
72+
Because imaging supports a wide variety of back-ends, Masonry can now operate in a wider variety of environments, including Vello CPU for rendering not requiring a GPU.
73+
74+
Masonry has bunch of new widgets, including Svg, Divider, CollapsePanel, StepInput, RadioButtons, Switch, Clip, Split.
75+
76+
Masonry now has a new layout system ([xilem#1560]).
77+
78+
Masonry is using `ui-events` for more of the integration with system capabilities, including IME (input method editing).
79+
This reduces the dependency on winit, and opens the door to deployments not dependent on winit.
80+
In the [#masonry > Embeddable GUI backend](https://xi.zulipchat.com/#narrow/channel/317477-masonry/topic/Embeddable.20GUI.20backend.2E/with/582566308) Zulip thread, there is discussion of embedding Masonry in a VST plugin, using baseview instead of winit.
81+
82+
<!-- Should we mention that work on Placehero has stalled out now that it's no longer funded?-->
83+
84+
We're seeing some cool Xilem apps in the ecosystem, including a port of Runebender to Xilem ([Zulip thread](https://xi.zulipchat.com/#narrow/channel/197829-runebender/topic/Runebender.20Xilem/with/574012987)).
85+
That's especially gratifying to see, as it was the "hero app" for Druid for several years.
86+
87+
<figure>
88+
<img style="height: auto;" width="1280" height="720" src="rb-mar-16-2026.jpeg" alt="A screenshot of Runebender.
89+
On the left is a Bézier path of a lowercase n being edited in a string, and on the right is an image showing many weights of the Instrument Serif font.">
90+
<figcaption>
91+
A screenshot of Runebender Xilem.
92+
</figcaption>
93+
</figure>
94+
95+
We've also gotten word of Boomaga-IPP, a refresh of a virtual printer project ([Zulip thread](https://xi.zulipchat.com/#narrow/channel/354396-xilem/topic/Boomaga-IPP.3A.20A.20new.20app.20using.20XILEM/with/576938266)).
96+
97+
Another interesting app is [Scrolled Quran] by Muhammad Ragib Hasin.
98+
99+
<figure>
100+
<img style="height: auto;" width="802" height="639" src="scrolled_quran_index.png" alt="A screenshot of the Scrolled Quran app, showing an index page of recently read surahs">
101+
<figcaption>
102+
A screenshot of Scrolled Quran.
103+
</figcaption>
104+
</figure>
105+
106+
## Related ecosystem projects
107+
108+
There's a lot of interesting activity surrounding Linebender, including projects that use Linebender crates, and adjacent bits of infrastructure.
109+
110+
### Subduction
111+
112+
It's long been clear there is value in more fully exploiting system compositor capabilities, but it's a hard problem and Linebender projects have so far just been using plain windows and swapchains.
113+
I've had a blog post stuck in rough draft for over four years — [How to think about the compositor in 2022](https://github.com/raphlinus/raphlinus.github.io/issues/77).
114+
Compositor integration is needed for efficient video playback, and is also the best way to stitch native widgets into a GPU-accelerated rendering surface.
115+
Bruce Mitchener got tired of waiting and has started the [subduction](https://github.com/forest-rs/subduction) crate, with compelling examples.
116+
To learn more, see the [Subduction: System compositor integration](https://xi.zulipchat.com/#narrow/channel/197075-vello/topic/Subduction.3A.20System.20compositor.20integration/with/582293122) Zulip thread.
117+
118+
<!-- TODO: better screenshot? The web one may be visually more interesting -->
119+
<figure>
120+
<img style="height: auto;" width="1152" height="864" src="subduction_screenshot.png" alt="A screenshot of subduction, showing native mac widgets">
121+
<figcaption>
122+
A screenshot of the subduction sample app.
123+
There are AppKit widgets including text editing, a wgpu surface running shaders, and other layers.
124+
</figcaption>
125+
</figure>
126+
127+
## RustWeek
128+
129+
There are two talks from Linebender affiliated people: Nico Burns' [talk on Blitz](https://2026.rustweek.org/talks/nico/), and Taj Pereira and Alex Jakubowicz' [talk on WASM](https://2026.rustweek.org/talks/wasm/).
130+
In addition, Linebender is one of the [Unconference](https://2026.rustweek.org/unconf-intro/) tracks.
131+
If you are interested in participating in the latter, reach out to me, as I'm the designated community leader.
132+
133+
## Get Involved
134+
135+
We welcome collaboration on any of our crates.
136+
This can include improving the documentation, implementing new features, improving our test coverage, or using them within your own code.
137+
138+
We host an hour long office hours meeting each week where we discuss what's going on in our projects.
139+
See [#office hours in Zulip](https://xi.zulipchat.com/#narrow/channel/359642-office-hours) for details.
140+
We're also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.
141+
Note that office hours are on a break for the remainder of the year.
142+
They are expected to continue in January, keep an eye on Zulip for details.
143+
144+
[xilem#1560]: https://github.com/linebender/xilem/pull/1560
145+
[xilem#1696]: https://github.com/linebender/xilem/pull/1696
146+
147+
[parley#536]: https://github.com/linebender/parley/pull/536
148+
[parley#540]: https://github.com/linebender/parley/pull/540
149+
[parley#551]: https://github.com/linebender/parley/pull/551
150+
[parley#563]: https://github.com/linebender/parley/pull/563
151+
152+
[Scrolled Quran]: https://github.com/RagibHasin/scrolled-quran
153+
154+
[imaging]: https://github.com/forest-rs/imaging
155+
[AnyRender]: https://github.com/dioxuslabs/anyrender
156+
157+
[Gosub engine]: https://gosub.io/
158+
[drafft-ink]: https://github.com/PatWie/drafft-ink
159+
[Takumi]: https://github.com/kane50613/takumi
726 KB
Loading
98.9 KB
Loading
788 KB
Loading

content/wiki/canonical_lints.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ If you want to remove a lint, `#![allow]` or `#![expect]` it at the crate root.
103103
As a lot of our code is research code, there are lints which we believe improve code quality, but don't need to validate in CI.
104104
These lints can be run occasionally, such as when releases are near, to improve code quality asynchronously:
105105

106-
```text
106+
```txt
107107
let_underscore_drop
108108
single_use_lifetimes
109109
unit_bindings

0 commit comments

Comments
 (0)