<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Linebender</title>
    <subtitle>Homepage for the Linebender organization</subtitle>
    <link rel="self" type="application/atom+xml" href="https://linebender.org/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://linebender.org/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-19T00:00:00+00:00</updated>
    <id>https://linebender.org/atom.xml</id>
    <entry xml:lang="en">
        <title>Linebender in 2026 Q1</title>
        <published>2026-04-19T00:00:00+00:00</published>
        <updated>2026-04-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-25/"/>
        <id>https://linebender.org/blog/tmil-25/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-25/">&lt;p&gt;Apologies for the delay in the update, as the past three months have been a hectic time.
Two of the core Linebender team members, myself and Daniel McNab, have moved across the world and started full-time jobs at Canva.
Getting onboarded has taken a lot of time and energy, but fortunately, work on Linebender crates remains a core part of our responsibilities.
And in the meantime, the community has been pushing forward.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;We&#x27;ve made big improvements to Vello Hybrid, both in capabilities and in performance.&lt;&#x2F;p&gt;
&lt;p&gt;Several releases, most recently &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;sparse-strips-v0.0.7&quot;&gt;sparse strips 0.0.7&lt;&#x2F;a&gt; (encompassing both Vello CPU and Vello Hybrid) and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.8.0&quot;&gt;Vello 0.8.0&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Optimizations include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Fast paths to bypass full coarse rasterization.&lt;&#x2F;li&gt;
&lt;li&gt;Special case drawing rectangles (as opposed to general Bézier paths)&lt;&#x2F;li&gt;
&lt;li&gt;First cut at glyph caching – more work is needed.&lt;&#x2F;li&gt;
&lt;li&gt;Fixed performance issues with heavy gradient use.&lt;&#x2F;li&gt;
&lt;li&gt;Skipping more unneeded work in layer operations.&lt;&#x2F;li&gt;
&lt;li&gt;Optimizations for opaque full-tile images.&lt;&#x2F;li&gt;
&lt;li&gt;Optimized layer blending for src-over compositing.&lt;&#x2F;li&gt;
&lt;li&gt;Improvements to analytic antialiasing performance.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;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.
There are two abstraction layers that can be used for a variety of renderers, both Vello and other renderers including Skia.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dioxuslabs&#x2F;anyrender&quot;&gt;AnyRender&lt;&#x2F;a&gt;, which is part of Blitz.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;forest-rs&#x2F;imaging&quot;&gt;imaging&lt;&#x2F;a&gt;, which is part of the forest-rs organization.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These two crates are fairly similar in scope, but with different emphasis.
AnyRender prioritizes ergonomics, in general closely following the traditional canvas API, while imaging is focused on performance and a more complete set of operations.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;glifo&quot;&gt;Glifo&lt;&#x2F;h3&gt;
&lt;p&gt;Until recently, all three manifestations of Vello each had their own copy of code to extract font outlines and render them.
For ordinary fonts, this isn&#x27;t a lot of logic on top of Skrifa.
But for color emoji, it&#x27;s more complicated and involves wiring up a lot more of the imaging model.
We&#x27;ve also been finding scope for more operations at the layer between simple rendering and low-level font parsing, including ink skipping for underlines.
To handle these functions, we created a crate called &quot;parley_draw&quot; inside the Parley repo, but that wasn&#x27;t the right name or the right place for it, as these functions aren&#x27;t really related to text layout.
The crate has now been renamed to &quot;Glifo,&quot; and has moved into the Vello repo.
The new location is to reduce the friction to iterate on the implementation of atlas-based glyph caching.&lt;&#x2F;p&gt;
&lt;p&gt;For a more recent discussion of the scope and goals of Glifo, see the thread &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Glifo.3A.20A.20separation.20of.20concerns&#x2F;with&#x2F;584192738&quot;&gt;#vello &amp;gt; Glifo: A separation of concerns&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley has seen slow but steady improvements in features, including:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;536&quot;&gt;parley#536&lt;&#x2F;a&gt; enumerate system fonts on mac using CoreText&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;540&quot;&gt;parley#540&lt;&#x2F;a&gt; Load fonts from system, and provided paths&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;551&quot;&gt;parley#551&lt;&#x2F;a&gt; CSS text-indent support&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;563&quot;&gt;parley#563&lt;&#x2F;a&gt; Implement all possible AccessKit text properties&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bevy has switched to Parley (&lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;205635-parley&#x2F;topic&#x2F;Bevy.20now.20uses.20Parley.2FFontique.20for.20text&#x2F;with&#x2F;578693539&quot;&gt;Zulip thread&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;CuTTY is a fork of Alacritty (a high performance terminal emulator) that has been ported to Vello and Parley (&lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;205635-parley&#x2F;topic&#x2F;I.20forked.20and.20migrated.20Alacritty.20to.20Vello.2BParley&#x2F;with&#x2F;580875316&quot;&gt;Zulip thread&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Other projects which now use Parley but have not previously been mentioned are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gosub.io&#x2F;&quot;&gt;Gosub engine&lt;&#x2F;a&gt; (browser engine)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;PatWie&#x2F;drafft-ink&quot;&gt;drafft-ink&lt;&#x2F;a&gt; (infinite canvas whiteboard)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kane50613&#x2F;takumi&quot;&gt;Takumi&lt;&#x2F;a&gt; (renders HTML&#x2F;JSX&#x2F;etc into images)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It&#x27;s gratifying to see all this adoption.
It seems like recognition that Parley is a viable text layout library for a broad range of applications.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem-and-masonry&quot;&gt;Xilem and Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry has moved to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;forest-rs&#x2F;imaging&quot;&gt;imaging&lt;&#x2F;a&gt; as an abstraction over the 2D rendering engine (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1696&quot;&gt;xilem#1696&lt;&#x2F;a&gt;).
Previously it had been hardcoded to use Vello classic.
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.&lt;&#x2F;p&gt;
&lt;p&gt;Masonry has bunch of new widgets, including Svg, Divider, CollapsePanel, StepInput, RadioButtons, Switch, Clip, Split.&lt;&#x2F;p&gt;
&lt;p&gt;Masonry now has a new layout system (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1560&quot;&gt;xilem#1560&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Masonry is using &lt;code&gt;ui-events&lt;&#x2F;code&gt; for more of the integration with system capabilities, including IME (input method editing).
This reduces the dependency on winit, and opens the door to deployments not dependent on winit.
In the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;317477-masonry&#x2F;topic&#x2F;Embeddable.20GUI.20backend.2E&#x2F;with&#x2F;582566308&quot;&gt;#masonry &amp;gt; Embeddable GUI backend&lt;&#x2F;a&gt; Zulip thread, there is discussion of embedding Masonry in a VST plugin, using baseview instead of winit.&lt;&#x2F;p&gt;
&lt;!-- Should we mention that work on Placehero has stalled out now that it&#x27;s no longer funded?--&gt;
&lt;p&gt;We&#x27;re seeing some cool Xilem apps in the ecosystem, including a port of Runebender to Xilem (&lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197829-runebender&#x2F;topic&#x2F;Runebender.20Xilem&#x2F;with&#x2F;574012987&quot;&gt;Zulip thread&lt;&#x2F;a&gt;).
That&#x27;s especially gratifying to see, as it was the &quot;hero app&quot; for Druid for several years.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto;&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;rb-mar-16-2026.jpeg&quot; alt=&quot;A screenshot of Runebender.
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.&quot;&gt;
&lt;figcaption&gt;
A screenshot of Runebender Xilem.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We&#x27;ve also gotten word of Boomaga-IPP, a refresh of a virtual printer project (&lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;354396-xilem&#x2F;topic&#x2F;Boomaga-IPP.3A.20A.20new.20app.20using.20XILEM&#x2F;with&#x2F;576938266&quot;&gt;Zulip thread&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Another interesting app is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;RagibHasin&#x2F;scrolled-quran&quot;&gt;Scrolled Quran&lt;&#x2F;a&gt; by Muhammad Ragib Hasin.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto;&quot; width=&quot;802&quot; height=&quot;639&quot; src=&quot;scrolled_quran_index.png&quot; alt=&quot;A screenshot of the Scrolled Quran app, showing an index page of recently read surahs&quot;&gt;
&lt;figcaption&gt;
A screenshot of Scrolled Quran.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
It provides a solid, portable way to write SIMD code that compiles to Wasm, AArch64, x86, and x86_64.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;releases&#x2F;tag&#x2F;v0.4.0&quot;&gt;fearless_simd 0.4.0&lt;&#x2F;a&gt;, a large step towards the library being generally useful.
The major improvement is the use of AVX2 intrinsics on supported platforms.
That fulfills the vision of being able to write code that works efficiently in a variety of SIMD vector widths — 128 bit on Neon, and 256 bits on x86.&lt;&#x2F;p&gt;
&lt;p&gt;We are starting to see adoption outside Linebender, notably &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;QuState&#x2F;PhastFT&quot;&gt;PhastFT&lt;&#x2F;a&gt;, a high performance FFT library.
Applications that can benefit from SIMD acceleration should consider fearless_simd, and we are open to feedback on how to improve it further.&lt;&#x2F;p&gt;
&lt;p&gt;There will be SIMD discussion at RustWeek, both as part of the Linebender unconference section and hopefully a session in the all-hands.
Get in touch if you&#x27;d be interested.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;related-ecosystem-projects&quot;&gt;Related ecosystem projects&lt;&#x2F;h2&gt;
&lt;p&gt;There&#x27;s a lot of interesting activity surrounding Linebender, including projects that use Linebender crates, and adjacent bits of infrastructure.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;subduction&quot;&gt;Subduction&lt;&#x2F;h3&gt;
&lt;p&gt;It&#x27;s long been clear there is value in more fully exploiting system compositor capabilities, but it&#x27;s a hard problem and Linebender projects have so far just been using plain windows and swapchains.
I&#x27;ve had a blog post stuck in rough draft for over four years — &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;raphlinus.github.io&#x2F;issues&#x2F;77&quot;&gt;How to think about the compositor in 2022&lt;&#x2F;a&gt;.
Compositor integration is needed for efficient video playback, and is also the best way to stitch native widgets into a GPU-accelerated rendering surface.
Bruce Mitchener got tired of waiting and has started the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;forest-rs&#x2F;subduction&quot;&gt;subduction&lt;&#x2F;a&gt; crate, with compelling examples.
To learn more, see the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Subduction.3A.20System.20compositor.20integration&#x2F;with&#x2F;582293122&quot;&gt;Subduction: System compositor integration&lt;&#x2F;a&gt; Zulip thread.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto;&quot; width=&quot;1152&quot; height=&quot;864&quot; src=&quot;subduction_screenshot.png&quot; alt=&quot;A screenshot of subduction, showing native mac widgets&quot;&gt;
&lt;figcaption&gt;
A screenshot of the subduction sample app.
There are AppKit widgets including text editing, a wgpu surface running shaders, and other layers.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;rustweek&quot;&gt;RustWeek&lt;&#x2F;h2&gt;
&lt;p&gt;There are two talks from Linebender affiliated people: Nico Burns&#x27; &lt;a href=&quot;https:&#x2F;&#x2F;2026.rustweek.org&#x2F;talks&#x2F;nico&#x2F;&quot;&gt;talk on Blitz&lt;&#x2F;a&gt;, and Taj Pereira and Alex Jakubowicz&#x27; &lt;a href=&quot;https:&#x2F;&#x2F;2026.rustweek.org&#x2F;talks&#x2F;wasm&#x2F;&quot;&gt;talk on WASM&lt;&#x2F;a&gt;.
In addition, Linebender is one of the &lt;a href=&quot;https:&#x2F;&#x2F;2026.rustweek.org&#x2F;unconf-intro&#x2F;&quot;&gt;Unconference&lt;&#x2F;a&gt; tracks.
If you are interested in participating in the latter, reach out to me, as I&#x27;m the designated community leader.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.
Note that office hours are on a break for the remainder of the year.
They are expected to continue in January, keep an eye on Zulip for details.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in December 2025</title>
        <published>2026-01-15T00:00:00+00:00</published>
        <updated>2026-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Kaur Kuut
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-24/"/>
        <id>https://linebender.org/blog/tmil-24/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-24/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;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&#x2F;CPU one called Vello Hybrid.
They can draw large 2D scenes with high performance.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1294&quot;&gt;vello#1294&lt;&#x2F;a&gt;: Added features to Vello CPU to switch between &lt;code&gt;u8&lt;&#x2F;code&gt; and &lt;code&gt;f32&lt;&#x2F;code&gt; pipelines.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1327&quot;&gt;vello#1327&lt;&#x2F;a&gt;: Eliminated overdraw for opaque image fills.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1325&quot;&gt;vello#1325&lt;&#x2F;a&gt;: Reduced the memory usage of wide tile commands.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1303&quot;&gt;vello#1303&lt;&#x2F;a&gt;: Fixed filter expansion logic for transforms with scale&#x2F;skew and for clipped layers.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1313&quot;&gt;vello#1313&lt;&#x2F;a&gt;: Fixed gradients within a clip layer in Vello Hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1323&quot;&gt;vello#1323&lt;&#x2F;a&gt;: Fixed non-deterministic GPU stroke artifacts.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto;&quot; width=&quot;1280&quot; height=&quot;960&quot; src=&quot;image_overdraw.jpg&quot; alt=&quot;A photo of a flower being layered on top of itself at decreasing size.&quot;&gt;
&lt;figcaption&gt;
30% performance improvement in this flower&#x27;s case with the new overdraw handling in Vello CPU &#x2F; Vello Hybrid.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The work on rendering sparse strip alpha values in GPU compute shaders continued in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1293&quot;&gt;vello#1293&lt;&#x2F;a&gt;, which added tile intersection checking.
You can follow the progress in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Thoughts.20on.20GPU.20sparse.20strips&#x2F;with&#x2F;567687539&quot;&gt;#vello &amp;gt; Thoughts on GPU sparse strips&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry-and-xilem&quot;&gt;Masonry and Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1519&quot;&gt;xilem#1519&lt;&#x2F;a&gt;: Added &lt;code&gt;Canvas&lt;&#x2F;code&gt; widget, for 2d vector drawing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1510&quot;&gt;xilem#1510&lt;&#x2F;a&gt;: Added a new &lt;code&gt;CollectionWidget&lt;&#x2F;code&gt; trait to unify collection widget method naming.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1527&quot;&gt;xilem#1527&lt;&#x2F;a&gt;: Added &lt;code&gt;Gap&lt;&#x2F;code&gt; property to &lt;code&gt;Flex&lt;&#x2F;code&gt; and &lt;code&gt;Grid&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1528&quot;&gt;xilem#1528&lt;&#x2F;a&gt;: Added alternative text to &lt;code&gt;Image&lt;&#x2F;code&gt; widget.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1526&quot;&gt;xilem#1526&lt;&#x2F;a&gt;: Implemented &lt;code&gt;Into&amp;lt;BrushRef&amp;gt;&lt;&#x2F;code&gt; for &lt;code&gt;BorderColor&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1534&quot;&gt;xilem#1534&lt;&#x2F;a&gt;: Migrated to Kurbo&#x27;s &lt;code&gt;Axis&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1488&quot;&gt;xilem#1488&lt;&#x2F;a&gt;: Renamed &lt;code&gt;map_message&lt;&#x2F;code&gt; to &lt;code&gt;map_message_result&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1533&quot;&gt;xilem#1533&lt;&#x2F;a&gt;: Renamed &lt;code&gt;Grid&lt;&#x2F;code&gt; attributes from &lt;code&gt;width&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;height&lt;&#x2F;code&gt; to &lt;code&gt;row_count&lt;&#x2F;code&gt;, &lt;code&gt;column_count&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1484&quot;&gt;xilem#1484&lt;&#x2F;a&gt;: Split Android examples into separate files.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1503&quot;&gt;xilem#1503&lt;&#x2F;a&gt;: Split some Xilem code into new a new &lt;code&gt;xilem_masonry&lt;&#x2F;code&gt; package.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1504&quot;&gt;xilem#1504&lt;&#x2F;a&gt;: Fixed &lt;code&gt;TextInput&lt;&#x2F;code&gt; placeholder alignment.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1537&quot;&gt;xilem#1537&lt;&#x2F;a&gt;: Fixed &lt;code&gt;ScrollBar&lt;&#x2F;code&gt; behavior with large content sizes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1540&quot;&gt;xilem#1540&lt;&#x2F;a&gt;: Improved &lt;code&gt;Flex&lt;&#x2F;code&gt; child constraint accuracy.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1507&quot;&gt;xilem#1507&lt;&#x2F;a&gt;: Wrote guidelines for writing Xilem doc examples.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1544&quot;&gt;xilem#1544&lt;&#x2F;a&gt;: Documented node non-persistence in accessibility method.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1545&quot;&gt;xilem#1545&lt;&#x2F;a&gt;: Now using third person more consistently in docs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;436&quot;&gt;parley#436&lt;&#x2F;a&gt;: Migrated text analysis and internationalization to ICU4X.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;479&quot;&gt;parley#479&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;481&quot;&gt;parley#481&lt;&#x2F;a&gt;: Started work on a dedicated glyph rendering crate.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;475&quot;&gt;parley#475&lt;&#x2F;a&gt;: Now using ICU4X &lt;code&gt;Script&lt;&#x2F;code&gt; type in &lt;code&gt;fontique&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;473&quot;&gt;parley#473&lt;&#x2F;a&gt;: We now bake composite properties data.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;487&quot;&gt;parley#487&lt;&#x2F;a&gt;: Export &lt;code&gt;Tag&lt;&#x2F;code&gt; from HarfRust, to allow users to use it directly.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;490&quot;&gt;parley#490&lt;&#x2F;a&gt;: Fixed bidi state leaking across layouts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;493&quot;&gt;parley#493&lt;&#x2F;a&gt;: Fixed crash with empty layout.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;498&quot;&gt;parley#498&lt;&#x2F;a&gt;: Updated to &lt;code&gt;ui-events&lt;&#x2F;code&gt; 0.2.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;534&quot;&gt;kurbo#534&lt;&#x2F;a&gt;: Optimized &lt;code&gt;RoundedRect::winding&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;533&quot;&gt;kurbo#533&lt;&#x2F;a&gt;: Clarified the order of &lt;code&gt;PathEl&lt;&#x2F;code&gt; points.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;peniko&quot;&gt;Peniko&lt;&#x2F;h2&gt;
&lt;p&gt;Peniko is a 2D graphics type library which provides a set of generic types that define styles for rendering and composition.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;155&quot;&gt;peniko#155&lt;&#x2F;a&gt;: Updated to Kurbo 0.13.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
It provides a solid way for writing SIMD operations portably across Wasm, AArch64, x86, and x86_64.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;141&quot;&gt;fearless_simd#141&lt;&#x2F;a&gt;: Added &lt;code&gt;any_true&lt;&#x2F;code&gt;, &lt;code&gt;all_true&lt;&#x2F;code&gt;, &lt;code&gt;any_false&lt;&#x2F;code&gt;, and &lt;code&gt;all_false&lt;&#x2F;code&gt; methods for mask types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;167&quot;&gt;fearless_simd#167&lt;&#x2F;a&gt;: Added precise float-to-integer conversions, which saturate out-of-bounds results and convert &lt;code&gt;NaN&lt;&#x2F;code&gt; to &lt;code&gt;0&lt;&#x2F;code&gt; on all platforms.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;168&quot;&gt;fearless_simd#168&lt;&#x2F;a&gt;: Added &lt;code&gt;Level::is_fallback&lt;&#x2F;code&gt;, which states whether the current SIMD level is the scalar fallback.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;155&quot;&gt;fearless_simd#155&lt;&#x2F;a&gt;: Added a vectored shift left operation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;154&quot;&gt;fearless_simd#154&lt;&#x2F;a&gt;: Added documentation for operations and vector types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;149&quot;&gt;fearless_simd#149&lt;&#x2F;a&gt;: Reworked the API.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;158&quot;&gt;fearless_simd#158&lt;&#x2F;a&gt;: Renamed &lt;code&gt;madd&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;msub&lt;&#x2F;code&gt; to &lt;code&gt;mul_add&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;mul_sub&lt;&#x2F;code&gt; for consistency with &lt;code&gt;std&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;159&quot;&gt;fearless_simd#159&lt;&#x2F;a&gt;: Now using native vector types to back SIMD types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;170&quot;&gt;fearless_simd#170&lt;&#x2F;a&gt;: Made &lt;code&gt;Element&lt;&#x2F;code&gt; an associated type on &lt;code&gt;SimdBase&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;180&quot;&gt;fearless_simd#180&lt;&#x2F;a&gt;: &lt;code&gt;SimdFrom::simd_from&lt;&#x2F;code&gt; now takes the SIMD token as the first argument instead of the second.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;velato&quot;&gt;Velato&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;releases&#x2F;tag&#x2F;v0.8.0&quot;&gt;Velato 0.8&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;releases&#x2F;tag&#x2F;v0.8.1&quot;&gt;0.8.1&lt;&#x2F;a&gt;. 🎉&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bevy-vello&quot;&gt;Bevy Vello&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;releases&#x2F;tag&#x2F;v0.11.0&quot;&gt;Bevy Vello 0.11&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;releases&#x2F;tag&#x2F;v0.12.0&quot;&gt;0.12&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;releases&#x2F;tag&#x2F;v0.12.1&quot;&gt;0.12.1&lt;&#x2F;a&gt;. 🎉&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;185&quot;&gt;bevy_vello#185&lt;&#x2F;a&gt;: Added support for &lt;code&gt;UiTransform&lt;&#x2F;code&gt; for raw Vello scenes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;188&quot;&gt;bevy_vello#188&lt;&#x2F;a&gt;: Finished adding Bevy 0.17 support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;191&quot;&gt;bevy_vello#191&lt;&#x2F;a&gt;: Renamed &lt;code&gt;SSRenderTarget&lt;&#x2F;code&gt; to &lt;code&gt;VelloRenderTarget&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;195&quot;&gt;bevy_vello#195&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;196&quot;&gt;bevy_vello#196&lt;&#x2F;a&gt;: Fixed AABBs not being correctly calculated.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resvg&quot;&gt;Resvg&lt;&#x2F;h2&gt;
&lt;p&gt;Resvg is our fast, small, portable SVG library.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;980&quot;&gt;resvg#980&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;981&quot;&gt;resvg#981&lt;&#x2F;a&gt;: No longer writing empty &lt;code&gt;&amp;lt;defs &#x2F;&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;987&quot;&gt;resvg#987&lt;&#x2F;a&gt;: Now using checked arithmetic when computing bounding box.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;990&quot;&gt;resvg#990&lt;&#x2F;a&gt;: Fixed panicking during pixmap creation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;simplecss&quot;&gt;SimpleCSS&lt;&#x2F;h2&gt;
&lt;p&gt;SimpleCSS is a basic CSS 2.1 parser and selector.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;simplecss&#x2F;pull&#x2F;39&quot;&gt;simplecss#39&lt;&#x2F;a&gt;: Added support for parsing &lt;code&gt;@font-face&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;druid&quot;&gt;Druid&lt;&#x2F;h2&gt;
&lt;p&gt;Druid is a GUI library which was a predecessor to Xilem, and an ancestor of Masonry.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;druid&#x2F;pull&#x2F;2410&quot;&gt;druid#2410&lt;&#x2F;a&gt;: Updated to Piet 0.7, which is going to be the final Piet version compatible with Druid.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in November 2025</title>
        <published>2025-12-15T00:00:00+00:00</published>
        <updated>2025-12-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Kaur Kuut
          </name>
        </author>
        
        <author>
          <name>
            Robert Brewitz Borg
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-23/"/>
        <id>https://linebender.org/blog/tmil-23/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-23/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1203&quot;&gt;vello#1203&lt;&#x2F;a&gt;: Introduced a new clipping algorithm for non-layer based clipping.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1286&quot;&gt;vello#1286&lt;&#x2F;a&gt;: Added image filters to Vello CPU.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1301&quot;&gt;vello#1301&lt;&#x2F;a&gt;: Optimized gradient rendering in Vello CPU.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1237&quot;&gt;vello#1237&lt;&#x2F;a&gt;: Added support for non-isolated masks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1309&quot;&gt;vello#1309&lt;&#x2F;a&gt;: Added comprehensive examples to Vello CPU.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto;&quot; width=&quot;1820&quot; height=&quot;1818&quot; src=&quot;image_filters.png&quot; alt=&quot;A grid of nine colorful shapes with various blur and shadow effects applied.&quot;&gt;
&lt;figcaption&gt;
Vello CPU now has Gaussian Blur, Drop Shadow, and Flood effects.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;masonry-and-xilem&quot;&gt;Masonry and Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1443&quot;&gt;xilem#1443&lt;&#x2F;a&gt;: Added text size config to &lt;code&gt;Checkbox&lt;&#x2F;code&gt; and &lt;code&gt;TextInput&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1444&quot;&gt;xilem#1444&lt;&#x2F;a&gt;: Added support for non-contiguous app state.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1448&quot;&gt;xilem#1448&lt;&#x2F;a&gt;: Changed default background and text colors.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1461&quot;&gt;xilem#1461&lt;&#x2F;a&gt;: Refactored &lt;code&gt;xilem_core&lt;&#x2F;code&gt; module structure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1455&quot;&gt;xilem#1455&lt;&#x2F;a&gt;: Reworked &lt;code&gt;to_do_mvc&lt;&#x2F;code&gt; example.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1471&quot;&gt;xilem#1471&lt;&#x2F;a&gt;: Lifted common &lt;code&gt;View&lt;&#x2F;code&gt; wrappers to &lt;code&gt;xilem_core&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1470&quot;&gt;xilem#1470&lt;&#x2F;a&gt;: Renamed &lt;code&gt;MessageContext&lt;&#x2F;code&gt; to &lt;code&gt;MessageCtx&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1440&quot;&gt;xilem#1440&lt;&#x2F;a&gt;: Added &lt;code&gt;ResizeObserver&lt;&#x2F;code&gt; for detecting widget size changes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1482&quot;&gt;xilem#1482&lt;&#x2F;a&gt;: Added &lt;code&gt;Passthrough&lt;&#x2F;code&gt; widget for simple widget encapsulation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1493&quot;&gt;xilem#1493&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1494&quot;&gt;xilem#1494&lt;&#x2F;a&gt;: Added support for efficient child replacement in all widgets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1497&quot;&gt;xilem#1497&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1502&quot;&gt;xilem#1502&lt;&#x2F;a&gt;: Standardized widget child management methods.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1492&quot;&gt;xilem#1492&lt;&#x2F;a&gt;: Added &lt;code&gt;FocusedBorderColor&lt;&#x2F;code&gt; property.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1505&quot;&gt;xilem#1505&lt;&#x2F;a&gt;: Now accepting &lt;code&gt;state&lt;&#x2F;code&gt; in &lt;code&gt;Task&lt;&#x2F;code&gt; view.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1499&quot;&gt;xilem#1499&lt;&#x2F;a&gt;: Split off &lt;code&gt;WindowView&lt;&#x2F;code&gt; code into &lt;code&gt;MasonryRoot&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1490&quot;&gt;xilem#1490&lt;&#x2F;a&gt;: Upgraded to Parley v0.7.0.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Eli Heuer has made significant progress in porting our old Druid hero app, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;runebender&quot;&gt;Runebender&lt;&#x2F;a&gt;, to Xilem.&lt;br &#x2F;&gt;
Check out the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;eliheuer&#x2F;runebender-xilem&quot;&gt;port&#x27;s repo&lt;&#x2F;a&gt; or follow the progress on &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197829-runebender&#x2F;topic&#x2F;Runebender.20Xilem&#x2F;with&#x2F;560954771&quot;&gt;Zulip&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto;&quot; width=&quot;1920&quot; height=&quot;1326&quot; src=&quot;runebender_xilem.png&quot; alt=&quot;A screenshot of the Runebender font editor showing the letter a being edited.&quot;&gt;
&lt;figcaption&gt;
Runebender is being ported to Xilem.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;releases&#x2F;tag&#x2F;v0.7.0&quot;&gt;Parley 0.7&lt;&#x2F;a&gt;. 🎉&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;449&quot;&gt;parley#449&lt;&#x2F;a&gt;: Optimized line height computation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;367&quot;&gt;parley#367&lt;&#x2F;a&gt;: Added &lt;code&gt;TextWrapMode&lt;&#x2F;code&gt; style.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;452&quot;&gt;parley#452&lt;&#x2F;a&gt;: Introduced Unicode data in preparation of migrating to ICU4X.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;468&quot;&gt;parley#468&lt;&#x2F;a&gt;: Added word and letter spacing to text layout based on style properties.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;467&quot;&gt;parley#467&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;471&quot;&gt;parley#471&lt;&#x2F;a&gt;: Added &lt;code&gt;fontconfig-dlopen&lt;&#x2F;code&gt; feature to Fontique to control how to load the fontconfig library.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;276&quot;&gt;parley#276&lt;&#x2F;a&gt;: Improved trailing whitespace handling.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We have also won not just &lt;a href=&quot;https:&#x2F;&#x2F;nlnet.nl&#x2F;project&#x2F;Parley&#x2F;&quot;&gt;one&lt;&#x2F;a&gt; but &lt;a href=&quot;https:&#x2F;&#x2F;nlnet.nl&#x2F;project&#x2F;Parley-copypaste&#x2F;&quot;&gt;two&lt;&#x2F;a&gt; grants from &lt;a href=&quot;https:&#x2F;&#x2F;nlnet.nl&#x2F;&quot;&gt;NLnet&lt;&#x2F;a&gt; for additional work on Parley in 2026.
More updates to follow as we finalize the plans.&lt;&#x2F;p&gt;
&lt;img style=&quot;width: 25%;&quot; src=&quot;nlnet_banner.svg&quot; alt=&quot;NLnet foundation logo.&quot; &#x2F;&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;releases&#x2F;tag&#x2F;v0.13.0&quot;&gt;Kurbo 0.13&lt;&#x2F;a&gt;. 🎉&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;493&quot;&gt;kurbo#493&lt;&#x2F;a&gt;: Converted &lt;code&gt;CubicBez::nearest&lt;&#x2F;code&gt; to the &lt;code&gt;poly-cool&lt;&#x2F;code&gt; quintic solver for a nice speedup (3000x for high accuracy!) and better robustness. This just missed the 0.13 release train.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;521&quot;&gt;kurbo#521&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;522&quot;&gt;kurbo#522&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;525&quot;&gt;kurbo#525&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;524&quot;&gt;kurbo#524&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;526&quot;&gt;kurbo#526&lt;&#x2F;a&gt;: Marked a bunch of methods &lt;code&gt;const&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;527&quot;&gt;kurbo#527&lt;&#x2F;a&gt;: Derived &lt;code&gt;Hash&lt;&#x2F;code&gt; for &lt;code&gt;Axis&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
It provides a solid way for writing SIMD operations portably across WASM, Aarch64, x86, and x86_64.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;115&quot;&gt;fearless_simd#115&lt;&#x2F;a&gt;: Updated x86 codegen to use AVX2 intrinsics.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;123&quot;&gt;fearless_simd#123&lt;&#x2F;a&gt;: Widened AVX2&#x27;s associated types to 256 bits.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;120&quot;&gt;fearless_simd#120&lt;&#x2F;a&gt;: Implemented the reinterpret operations without &lt;code&gt;bytemuck&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;130&quot;&gt;fearless_simd#130&lt;&#x2F;a&gt;: Implemented &lt;code&gt;core::ops::Not&lt;&#x2F;code&gt; for integer types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;134&quot;&gt;fearless_simd#134&lt;&#x2F;a&gt;: All float-to-integer and integer-to-float conversions are implemented properly on x86. They should now handle all values correctly, including &lt;code&gt;NaN&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;136&quot;&gt;fearless_simd#136&lt;&#x2F;a&gt;: The floating-point &lt;code&gt;min_precise&lt;&#x2F;code&gt; and &lt;code&gt;max_precise&lt;&#x2F;code&gt; operations now behave the same way on x86 and WebAssembly as they do on AArch64, returning the non-&lt;code&gt;NaN&lt;&#x2F;code&gt; operand if one operand is &lt;code&gt;NaN&lt;&#x2F;code&gt; and the other is not.
Previously, they returned the second operand if either was &lt;code&gt;NaN&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;140&quot;&gt;fearless_simd#140&lt;&#x2F;a&gt;: The &lt;code&gt;load_interleaved&lt;&#x2F;code&gt; and &lt;code&gt;store_interleaved&lt;&#x2F;code&gt; operations now use native intrinsics on x86, instead of using the fallback implementations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;143&quot;&gt;fearless_simd#143&lt;&#x2F;a&gt;: Now using WebAssembly&#x27;s relaxed SIMD intrinsics if available.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;145&quot;&gt;fearless_simd#145&lt;&#x2F;a&gt;: Added the &lt;code&gt;ceil&lt;&#x2F;code&gt; and &lt;code&gt;round_ties_even&lt;&#x2F;code&gt; operations to floating-point vector types.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;velato&quot;&gt;Velato&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;An assortment of fixes and improvements to Velato&#x27;s Lottie support to render more complex animations correctly, see the linked PRs for details.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;78&quot;&gt;velato#78&lt;&#x2F;a&gt;: Restructured schema to reflect the specification types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;79&quot;&gt;velato#79&lt;&#x2F;a&gt;: Now allowing any skew value.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;80&quot;&gt;velato#80&lt;&#x2F;a&gt;: Replaced &lt;code&gt;keyframe&lt;&#x2F;code&gt; with &lt;code&gt;kurbo&lt;&#x2F;code&gt; for tweening.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;81&quot;&gt;velato#81&lt;&#x2F;a&gt;: Now tweening with a cubic bezier curve.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;82&quot;&gt;velato#82&lt;&#x2F;a&gt;: Fixed flickering issues for certain Lottie configurations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;83&quot;&gt;velato#83&lt;&#x2F;a&gt;: Added support for trimmed paths.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;84&quot;&gt;velato#84&lt;&#x2F;a&gt;: Fixed matte layers.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;85&quot;&gt;velato#85&lt;&#x2F;a&gt;: Fixed easing handles, by only use the first two components.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;bevy-vello&quot;&gt;Bevy Vello&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;A lot of work was done to update Bevy Vello for Bevy 0.17.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;180&quot;&gt;bevy_vello#180&lt;&#x2F;a&gt;: Updated to Bevy 0.17, plus other dependency updates.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;bevy_vello&#x2F;pull&#x2F;182&quot;&gt;bevy_vello#182&lt;&#x2F;a&gt;: Fixed resize render targets on camera viewport change.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.
Note that office hours are on a break for the remainder of the year.
They are expected to continue in January, keep an eye on Zulip for details.&lt;&#x2F;p&gt;
&lt;p&gt;If you wish to discuss the Linebender project individually, Daniel is offering &lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;&quot;office hours&quot; appointments&lt;&#x2F;a&gt;, which are free to book.
It really helps us to learn what aspects our users care about the most.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in October 2025</title>
        <published>2025-11-13T00:00:00+00:00</published>
        <updated>2025-11-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-22/"/>
        <id>https://linebender.org/blog/tmil-22/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-22/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;October saw steady progress on our core crates, including a number of releases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;p&gt;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.
The &lt;a href=&quot;https:&#x2F;&#x2F;ethz.ch&#x2F;content&#x2F;dam&#x2F;ethz&#x2F;special-interest&#x2F;infk&#x2F;inst-pls&#x2F;plf-dam&#x2F;documents&#x2F;StudentProjects&#x2F;MasterTheses&#x2F;2025-Laurenz-Thesis.pdf&quot;&gt;masters thesis&lt;&#x2F;a&gt; is now published.
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.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;1170&quot; height=&quot;920&quot; src=&quot;sparse_strip.png&quot; alt=&quot;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.&quot;&gt;
&lt;!-- &lt;img style=&quot;height: auto; width: 50%; margin-left: 25%;&quot; width=&quot;666&quot; height=&quot;673&quot; src=&quot;hybrid-blending.png&quot; alt=&quot;A series of overlapping shapes of various colours, variously composited.&quot;&gt; --&gt;
&lt;figcaption&gt;
&lt;p&gt;An illustration from Laurenz Stampfl&#x27;s Masters Thesis, showing the effect of tile size on rendering efficiency.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We released version &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;sparse-strips-v0.0.4&quot;&gt;0.0.4 of the sparse strips&lt;&#x2F;a&gt; versions of the renderer.
It should be a solid version of &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;vello_cpu&quot;&gt;Vello CPU&lt;&#x2F;a&gt;, suitable for a wider range of applications where CPU-only rendering is appropriate.
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.&lt;&#x2F;p&gt;
&lt;p&gt;Vello CPU now supports non-isolated blending (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1159&quot;&gt;vello#1159&lt;&#x2F;a&gt; among others), which is important for HTML5 canvas compatibility.
SVG and COLRv1 emoji, by contrast, which has set priorities for Vello in the past, only support isolated blending.
There are also promising early results for supporting image filters including blurs.&lt;&#x2F;p&gt;
&lt;p&gt;A major development in Vello Hybrid is support for multiple image atlases (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1252&quot;&gt;vello#1252&lt;&#x2F;a&gt;), which improves performance for image rendering.&lt;&#x2F;p&gt;
&lt;p&gt;Thomas Smith has been making excellent progress on rendering sparse strip alpha values in GPU compute shaders.
This was the original motivation for the sparse strip work.
You can follow the progress in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Thoughts.20on.20GPU.20sparse.20strips&#x2F;near&#x2F;543334092&quot;&gt;#vello &amp;gt;  Thoughts on GPU sparse strips&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Work on Vello Classic focused on support for web standard compatibility, motivated by Servo integration.
Those features include support for non-premultiplied alpha (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1173&quot;&gt;vello#1173&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1262&quot;&gt;vello#1262&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1145&quot;&gt;vello#1145&lt;&#x2F;a&gt;).
This has been released in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.6.0&quot;&gt;Vello v0.6.0&lt;&#x2F;a&gt;, which also upgraded to wgpu v26 for compatibility with Bevy v0.17.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry-and-xilem&quot;&gt;Masonry and Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;releases&#x2F;tag&#x2F;v0.4.0&quot;&gt;version 0.4&lt;&#x2F;a&gt; of both Masonry and Xilem in October.
This release comprises 7 crates, including Xilem Web.
It is the first release to switch over to the new HarfRust library, developed by Google Fonts, for shaping, replacing Swash.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;p&gt;We released version &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;releases&#x2F;tag&#x2F;v0.6.0&quot;&gt;0.6 of Parley&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Slint has moved from their hand-rolled text implementation to Parley, and released version &lt;a href=&quot;https:&#x2F;&#x2F;slint.dev&#x2F;blog&#x2F;slint-1.14-released&quot;&gt;1.14&lt;&#x2F;a&gt;.
Linebender is thrilled to have other UI toolkits in the ecosystem adopt our crates.&lt;&#x2F;p&gt;
&lt;p&gt;Much of the development work on Parley is directed toward supporting HTML floats, particularly in Blitz.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;421&quot;&gt;parley#421&lt;&#x2F;a&gt; is the main PR tracking this work, and references several other PRs.&lt;&#x2F;p&gt;
&lt;p&gt;There has also been some performance work, which especially impacts larger paragraphs.
This work continues, and we hope to publish quantitative benchmark results (based on the benchmark suite in Cosmic Text) in November.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;re also in the process of migrating to ICU4X for Unicode primitives, replacing our own hand-rolled implementations (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;436&quot;&gt;parley#436&lt;&#x2F;a&gt;).
This change should improve maintainability.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
It provides a solid way for writing SIMD operations portably across Wasm, AArch64, x86, and x86_64.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;Fearless SIMD 0.3&lt;&#x2F;a&gt; in October.
This release contains improvements in integer operations, particularly variable sized shifting, and better native support for fused multiply-add and multiply-subtract.&lt;&#x2F;p&gt;
&lt;p&gt;As development work, we are pursuing a new approach to using intrinsics safely inside &lt;code&gt;#[target_feature]&lt;&#x2F;code&gt; blocks: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;108&quot;&gt;fearless_simd#108&lt;&#x2F;a&gt;.
&lt;a href=&quot;https:&#x2F;&#x2F;blog.rust-lang.org&#x2F;2025&#x2F;05&#x2F;15&#x2F;Rust-1.87.0&#x2F;#safe-architecture-intrinsics&quot;&gt;Safe SIMD intrinsics&lt;&#x2F;a&gt; were added in Rust 1.87, and we encourage using them when writing architecture-specific code.
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 &quot;downcasting&quot; to a specific SIMD level when those intrinsics offer higher performance than the portable choice.
For more details on downcasting, see the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;a-plan-for-simd&#x2F;&quot;&gt;A plan for SIMD&lt;&#x2F;a&gt; blog post.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;p&gt;If you wish to discuss the Linebender project individually, Daniel is offering &lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;&quot;office hours&quot; appointments&lt;&#x2F;a&gt;, which are free to book.
It really helps us to learn what aspects our users care about the most.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in September 2025</title>
        <published>2025-10-14T00:00:00+00:00</published>
        <updated>2025-10-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-21/"/>
        <id>https://linebender.org/blog/tmil-21/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-21/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1183&quot;&gt;vello#1183&lt;&#x2F;a&gt;: Support for luminance masks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1187&quot;&gt;vello#1187&lt;&#x2F;a&gt;: Fix flattening tolerance calculation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1192&quot;&gt;vello#1192&lt;&#x2F;a&gt;: Add &lt;code&gt;push_clip_layer&lt;&#x2F;code&gt;, in preparation for removing &lt;code&gt;Mix::Clip&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1224&quot;&gt;vello#1224&lt;&#x2F;a&gt;: Update to the latest Peniko main.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1229&quot;&gt;vello#1229&lt;&#x2F;a&gt;: Put wgpu&#x27;s default features behind a &lt;code&gt;wgpu_default&lt;&#x2F;code&gt; feature flag, by Stefan Tammer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We&#x27;re planning to make a Vello release early in October for compatibility with Bevy v0.17.&lt;&#x2F;p&gt;
&lt;p&gt;Our sparse strip renderers are moving towards maturity.
In September, we have had some improvements in Vello Hybrid&#x27;s capabilities, and further performance optimisation.
We&#x27;re planning on making an alpha release of Vello Hybrid in October.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1188&quot;&gt;vello#1188&lt;&#x2F;a&gt;: Make the aliasing threshold configurable.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1196&quot;&gt;vello#1196&lt;&#x2F;a&gt;: Gradient rendering in Vello Hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1206&quot;&gt;vello#1206&lt;&#x2F;a&gt;: Store data about filled areas in a strip.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1209&quot;&gt;vello#1209&lt;&#x2F;a&gt;: Optimise the &lt;code&gt;estimate_num_squads&lt;&#x2F;code&gt; method.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1215&quot;&gt;vello#1215&lt;&#x2F;a&gt;: Glyph caching for hinting instances and outline paths.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1221&quot;&gt;vello#1221&lt;&#x2F;a&gt;: Unify our sweep gradient handling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1239&quot;&gt;vello#1239&lt;&#x2F;a&gt;: Release &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;sparse-stips-v0.0.2&quot;&gt;Vello CPU v0.0.2&lt;&#x2F;a&gt;. This release was a final release for Peniko v0.4.x compatibility, and we are planning to release Vello CPU v0.1.0 within the first half of October.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We&#x27;re planning to make the beta release of Vello CPU in early October.&lt;&#x2F;p&gt;
&lt;!-- TODO: What to say exactly here? --&gt;
&lt;p&gt;Its performance is now extremely competitive - according to &lt;a href=&quot;https:&#x2F;&#x2F;laurenzv.github.io&#x2F;vello_chart&#x2F;&quot;&gt;our benchmarking&lt;&#x2F;a&gt; is likely the fastest CPU-only renderer in Rust.&lt;&#x2F;p&gt;
&lt;!-- TODO: We&#x27;d like to thank Laurenz, something about Master&#x27;s project, etc. --&gt;
&lt;!-- TODO: This roadmap is a bit out of date.
Our [working roadmap](https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1ZquH-53j2OedTbgEKCJBKTh4WLE11UveM10mNdnVARY&#x2F;edit?tab=t.0#heading=h.j3duh9pgdm94) outlines the planned timeline for work on the renderers into next year. --&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;2048&quot; height=&quot;1480&quot; src=&quot;vello_hybrid_gradients.png&quot; alt=&quot;A grid of different gradient types. The top row is linear gradients, the middle row is radial, and the bottom row is sweep. The left column is extend, the middle column is reflect, and the right column is repeat.&quot;&gt;
&lt;!-- &lt;img style=&quot;height: auto; width: 50%; margin-left: 25%;&quot; width=&quot;666&quot; height=&quot;673&quot; src=&quot;hybrid-blending.png&quot; alt=&quot;A series of overlapping shapes of various colours, variously composited.&quot;&gt; --&gt;
&lt;figcaption&gt;
&lt;p&gt;Vello Hybrid now fully supports gradient paint types.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Linebender will be represented at the Graphite Community Meetup, details of which can be found in &lt;a href=&quot;https:&#x2F;&#x2F;graphite.rs&#x2F;blog&#x2F;graphite-community-meetup-in-germany&#x2F;&quot;&gt;their post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;linebender-resource-handle&quot;&gt;Linebender Resource Handle&lt;&#x2F;h3&gt;
&lt;p&gt;Peniko&#x27;s &lt;code&gt;Font&lt;&#x2F;code&gt; (and therefore also &lt;code&gt;Blob&lt;&#x2F;code&gt;) are used as vocabulary types for font resources between crates (such as Vello and Parley).
However, this meant that when Peniko made semver-incompatible releases, those crates could no longer (easily) interoperate.
Additionally, some crates (notably both Parley and Cosmic Text) only depended on Peniko for these interoperability types.&lt;&#x2F;p&gt;
&lt;p&gt;To resolve this, &lt;code&gt;Font&lt;&#x2F;code&gt;, &lt;code&gt;Blob&lt;&#x2F;code&gt;, and &lt;code&gt;WeakBlob&lt;&#x2F;code&gt; in Peniko are now re-exports from a new crate called &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;linebender_resource_handle&quot;&gt;Linebender Resource Handle&lt;&#x2F;a&gt;.
These types have identical API as in previous releases, but will now be the same type across Peniko versions.
We have made this migration in such a way that these types are also used in the minor releases of Peniko since &lt;code&gt;v0.3.x&lt;&#x2F;code&gt;.
This means that all releases of Parley and Vello from 2025 are entirely cross-compatible.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, in future releases, Parley will only depend on Linebender Resource Handle instead of Peniko, improving its compilation time for users who use Parley without Vello.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;peniko&quot;&gt;Peniko&lt;&#x2F;h3&gt;
&lt;p&gt;In addition to the migration to Linebender Resource Handle, we have made small but important improvements in Peniko, our crate for shared 2d rendering types.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;115&quot;&gt;peniko#115&lt;&#x2F;a&gt;: Add an &lt;code&gt;InterpolationAlphaSpace&lt;&#x2F;code&gt; to gradients. This is helpful for implementing web specs, and should otherwise be ignored by most users.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;123&quot;&gt;peniko#123&lt;&#x2F;a&gt;: Rename &lt;code&gt;ImageRenderParams&lt;&#x2F;code&gt; to &lt;code&gt;ImageSampler&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;126&quot;&gt;peniko#126&lt;&#x2F;a&gt;: Migrated to Linebender Resource Handle.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;130&quot;&gt;peniko#130&lt;&#x2F;a&gt;: Clarify Sweep Gradient Angle rotation and unit. This now is defined to match how Vello was interpreting it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;139&quot;&gt;peniko#139&lt;&#x2F;a&gt;: Better document &lt;code&gt;Mix&lt;&#x2F;code&gt;, &lt;code&gt;Compose&lt;&#x2F;code&gt; and &lt;code&gt;Fill&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;144&quot;&gt;peniko#144&lt;&#x2F;a&gt;: Deprecate &lt;code&gt;Mix::Clip&lt;&#x2F;code&gt; and make it no longer the default blend mode.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Release &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;releases&#x2F;tag&#x2F;v0.4.1&quot;&gt;v0.4.1&lt;&#x2F;a&gt; is a backport release for the Linebender Resource Handle migration.
We expect to release Peniko v0.5.0 very early in October.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry-and-xilem&quot;&gt;Masonry and Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1383&quot;&gt;xilem#1383&lt;&#x2F;a&gt;: Add more window options&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1378&quot;&gt;xilem#1378&lt;&#x2F;a&gt;: Add Slider widget and demo&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1386&quot;&gt;xilem#1386&lt;&#x2F;a&gt;: Text area improvements&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1388&quot;&gt;xilem#1388&lt;&#x2F;a&gt;: Simplify multi-window code&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1393&quot;&gt;xilem#1393&lt;&#x2F;a&gt;: Fix blitting on a transparent window&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There was some work in Placehero, the Mastodon client which serves as the flagship Xilem application, to support login, but not yet wired up to the UI.&lt;&#x2F;p&gt;
&lt;!-- TODO: Add screenshot. --&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;410&quot;&gt;parley#410&lt;&#x2F;a&gt;: Fix the last line of justified text.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;414&quot;&gt;parley#414&lt;&#x2F;a&gt;: Remove Kurbo and Peniko dependencies by using &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-21&#x2F;#linebender-resource-handle&quot;&gt;Linebender Resource Handle&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;418&quot;&gt;parley#418&lt;&#x2F;a&gt;: Upgrade to icu4x 2.0.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;421&quot;&gt;parley#421&lt;&#x2F;a&gt; (draft): Enable floats and other advanced layouts.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.
We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;releases&#x2F;tag&#x2F;v0.12.0&quot;&gt;v0.12&lt;&#x2F;a&gt; at the start of September, primarily including the new stroking work, which improves performance considerably over the previous version.
In addition to the changes in that release, we also performed various optimisations.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
It provides a solid way for writing SIMD operations portably across WASM, Aarch64, x86, and x86_64.
The improvements we made in September include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;76&quot;&gt;fearless_simd#76&lt;&#x2F;a&gt;: Add &lt;code&gt;SimdBase::witness&lt;&#x2F;code&gt;, allowing access to the &lt;code&gt;Simd&lt;&#x2F;code&gt; implementation from vector types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;79&quot;&gt;fearless_simd#79&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;86&quot;&gt;fearless_simd#86&lt;&#x2F;a&gt;: Improved bitshifting support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;80&quot;&gt;fearless_simd#80&lt;&#x2F;a&gt;: Implement assignment operators (&lt;code&gt;+=&lt;&#x2F;code&gt;, etc.).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;81&quot;&gt;fearless_simd#81&lt;&#x2F;a&gt;: Enable bitcasting between native-width vectors.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;88&quot;&gt;fearless_simd#88&lt;&#x2F;a&gt;: Adopt FMA semantics to match &lt;code&gt;std&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;91&quot;&gt;fearless_simd#91&lt;&#x2F;a&gt;: Unary integer negation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;96&quot;&gt;fearless_simd#96&lt;&#x2F;a&gt;: Expression-oriented dispatch macro.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We look forward to seeing ecosystem use cases develop.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;p&gt;If you wish to discuss the Linebender project individually, Daniel is offering &lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;&quot;office hours&quot; appointments&lt;&#x2F;a&gt;, which are free to book.
It really helps us to learn what aspects our users care about the most.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in August 2025</title>
        <published>2025-09-12T00:00:00+00:00</published>
        <updated>2025-09-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-20/"/>
        <id>https://linebender.org/blog/tmil-20/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-20/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;400&quot;&gt;parley#400&lt;&#x2F;a&gt;: Migrates Parley to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;harfbuzz&#x2F;harfrust&quot;&gt;HarfRust&lt;&#x2F;a&gt; for shaping, which is a Rust port of HarfBuzz.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;405&quot;&gt;parley#405&lt;&#x2F;a&gt;: Adds a selection of benchmarks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;406&quot;&gt;parley#406&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;413&quot;&gt;parley#413&lt;&#x2F;a&gt;: Adds internal caching, improving performance significantly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1096&quot;&gt;vello#1096&lt;&#x2F;a&gt;: Updated to Wgpu version 26.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1161&quot;&gt;vello#1161&lt;&#x2F;a&gt;: Simplifies the API for rendering a wgpu &lt;code&gt;Texture&lt;&#x2F;code&gt; into a Vello &lt;code&gt;Scene&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1169&quot;&gt;vello#1169&lt;&#x2F;a&gt;: Increased the Skrifa version to v0.35.0. This was backported as &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.5.1&quot;&gt;Vello v0.5.1&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1182&quot;&gt;vello#1182&lt;&#x2F;a&gt;: Fixed a longstanding issue with our examples, where they would crash if the window was minimised on windows.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The biggest updates to the sparse strip renderers this month are the support for blending and caching in Vello Hybrid.
We have also had continued SIMD improvements, including x86 support.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1136&quot;&gt;vello#1136&lt;&#x2F;a&gt;: Allows disabling anti-aliasing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1137&quot;&gt;vello#1137&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1153&quot;&gt;vello#1153&lt;&#x2F;a&gt;: Add support for caching sparse strips.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1149&quot;&gt;vello#1149&lt;&#x2F;a&gt;: Support for SSE4.2 and AVX2 SIMD (i.e. on x86 and x86_64).
The &lt;a href=&quot;https:&#x2F;&#x2F;laurenzv.github.io&#x2F;vello_chart&#x2F;&quot;&gt;benchmark results viewer&lt;&#x2F;a&gt; has been updated to include some x86_64 results.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1177&quot;&gt;vello#1177&lt;&#x2F;a&gt;: Move to the new v0.2.0 release of Fearless SIMD.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1155&quot;&gt;vello#1155&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1178&quot;&gt;vello#1178&lt;&#x2F;a&gt;: Add full support for blending to Vello Hybrid.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- TODO: This roadmap is a bit out of date.
Our [working roadmap](https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1ZquH-53j2OedTbgEKCJBKTh4WLE11UveM10mNdnVARY&#x2F;edit?tab=t.0#heading=h.j3duh9pgdm94) outlines the planned timeline for work on the renderers into next year. --&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto; width: 50%; margin-left: 25%;&quot; width=&quot;666&quot; height=&quot;673&quot; src=&quot;hybrid-blending.png&quot; alt=&quot;A series of overlapping shapes of various colours, variously composited.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Blending is now supported by Vello Hybrid.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We have additionally been doing further work on Vello&#x27;s imaging model.
This is partly in service of the integrations of Vello in &lt;a href=&quot;https:&#x2F;&#x2F;graphite.rs&#x2F;&quot;&gt;Graphite&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;servo.org&#x2F;&quot;&gt;Servo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;191&quot;&gt;color#191&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;115&quot;&gt;peniko#115&lt;&#x2F;a&gt; (in progress): Add support for interpolating gradients in unpremultiplied space.
This is provided for web compatibility, and shouldn&#x27;t be used by most users.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;117&quot;&gt;peniko#117&lt;&#x2F;a&gt;: Split Image into the sampler and data.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;120&quot;&gt;peniko#120&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;121&quot;&gt;peniko#121&lt;&#x2F;a&gt;: Add &lt;code&gt;Brga&lt;&#x2F;code&gt; and premultiplied image formats.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1183&quot;&gt;vello#1183&lt;&#x2F;a&gt; (in progress): Support luminance masks.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;As of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;servo&#x2F;servo&#x2F;pull&#x2F;38962&quot;&gt;servo#38962&lt;&#x2F;a&gt;, Vello and Vello CPU are the only canvas backends used in Servo.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h3&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
We are developing it in concert with the Vello sparse strips renderers, particularly &lt;code&gt;vello_cpu&lt;&#x2F;code&gt;.
We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;releases&#x2F;tag&#x2F;v0.2.0&quot;&gt;Fearless SIMD v0.2.0&lt;&#x2F;a&gt;, the first Fearless SIMD release since 2018.
This included the following changes from August:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;50&quot;&gt;fearless_simd#50&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;52&quot;&gt;fearless_simd#52&lt;&#x2F;a&gt;: Add SSE4.2 support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;58&quot;&gt;fearless_simd#58&lt;&#x2F;a&gt;: Add some initial docs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;59&quot;&gt;fearless_simd#59&lt;&#x2F;a&gt;: Add basic AVX2 support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;61&quot;&gt;fearless_simd#61&lt;&#x2F;a&gt;: Removes &lt;code&gt;f16&lt;&#x2F;code&gt; support to prepare for release.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;69&quot;&gt;fearless_simd#69&lt;&#x2F;a&gt;: Fixes a soundness issue with unsafe SIMD functions.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With this release, Fearless SIMD is now ready for experimental use outside of Linebender.
It now provides a solid way for writing portable SIMD operations across WASM, Aarch64, x86, and x86_64.
Note however that the library is still in a quite early state - in particular, our documentation is currently only cursory.
Contributions to improve this would be welcome!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1207&quot;&gt;xilem#1207&lt;&#x2F;a&gt;: Make &lt;code&gt;ObjectFit&lt;&#x2F;code&gt;, &lt;code&gt;Linebreaking&lt;&#x2F;code&gt; and &lt;code&gt;SpinnerColor&lt;&#x2F;code&gt; properties.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1212&quot;&gt;xilem#1212&lt;&#x2F;a&gt;: Add &lt;code&gt;Widget::Action&lt;&#x2F;code&gt;, which indicates the action type widgets return.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1226&quot;&gt;xilem#1226&lt;&#x2F;a&gt;: Refactor tab focus.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1228&quot;&gt;xilem#1228&lt;&#x2F;a&gt;: Add placeholder text to text input.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1250&quot;&gt;xilem#1250&lt;&#x2F;a&gt;: Move widgets to use a &lt;code&gt;Length&lt;&#x2F;code&gt; type, which represents a number of logical pixels.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1269&quot;&gt;xilem#1269&lt;&#x2F;a&gt;: Introduce &quot;focus fallback&quot; mechanism.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1273&quot;&gt;xilem#1273&lt;&#x2F;a&gt;: Update to Anymore v1.0.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1282&quot;&gt;xilem#1282&lt;&#x2F;a&gt;, many others: Add unit tests for passes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1295&quot;&gt;xilem#1295&lt;&#x2F;a&gt;: Merge &lt;code&gt;TextColor&lt;&#x2F;code&gt; and &lt;code&gt;SpinnerColor&lt;&#x2F;code&gt; into &lt;code&gt;ContentColor&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1310&quot;&gt;xilem#1310&lt;&#x2F;a&gt;: Cleans up how the event loop handles being suspended, by Nixon.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1312&quot;&gt;xilem#1312&lt;&#x2F;a&gt;: Remove the generic on VirtualScroll.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1314&quot;&gt;xilem#1314&lt;&#x2F;a&gt;: Makes the focused indicator for checkboxes larger, by tannal.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1320&quot;&gt;xilem#1320&lt;&#x2F;a&gt;: Add &lt;code&gt;NewWindow&lt;&#x2F;code&gt; struct to encapsulate attributes needed to create a window.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1321&quot;&gt;xilem#1321&lt;&#x2F;a&gt;: When a new font is loaded, relayout everything.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1332&quot;&gt;xilem#1332&lt;&#x2F;a&gt;: Restore base colour customisation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1349&quot;&gt;xilem#1349&lt;&#x2F;a&gt;: Move Masonry&#x27;s examples from &quot;Masonry Winit&quot; to &quot;Masonry&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1353&quot;&gt;xilem#1353&lt;&#x2F;a&gt;: Limit the size of screenshot tests to 8KiB by default.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1366&quot;&gt;xilem#1366&lt;&#x2F;a&gt;: Make the &lt;code&gt;Checkbox&lt;&#x2F;code&gt;&#x27;s checked state be controlled only by the driver.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1371&quot;&gt;xilem#1371&lt;&#x2F;a&gt;: Fix and optimise window resizing and minimising.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1260&quot;&gt;xilem#1260&lt;&#x2F;a&gt;: Make the virtual scroll implementation much saner.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1273&quot;&gt;xilem#1273&lt;&#x2F;a&gt;: Update to Anymore v1.0.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1363&quot;&gt;xilem#1363&lt;&#x2F;a&gt;: Fix the &lt;code&gt;declare_property_tuple&lt;&#x2F;code&gt; macro, by Alex Moon.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1278&quot;&gt;xilem#1278&lt;&#x2F;a&gt;: Add &lt;code&gt;Prop&lt;&#x2F;code&gt;, which changes how Masonry &lt;code&gt;Properties&lt;&#x2F;code&gt; are applied to more closely match Xilem Web.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1318&quot;&gt;xilem#1318&lt;&#x2F;a&gt;: Fix initial font loading in easy cases.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1333&quot;&gt;xilem#1333&lt;&#x2F;a&gt;: Add docs about precise capturing, by Nils Martel.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1348&quot;&gt;xilem#1348&lt;&#x2F;a&gt;: Add &lt;code&gt;flex_row&lt;&#x2F;code&gt; and &lt;code&gt;flex_col&lt;&#x2F;code&gt; as convenience functions, by Paul Xu.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1352&quot;&gt;xilem#1352&lt;&#x2F;a&gt;: Add error handling to virtual cats example, by Nils Martel.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1357&quot;&gt;xilem#1357&lt;&#x2F;a&gt;: Fix how the &lt;code&gt;disabled&lt;&#x2F;code&gt; property is handled for text input.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1364&quot;&gt;xilem#1364&lt;&#x2F;a&gt;: Remove the &lt;code&gt;app_state&lt;&#x2F;code&gt; parameter from teardown, by Alex Moon.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Placehero:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1323&quot;&gt;xilem#1323&lt;&#x2F;a&gt;: Use an Action for navigation (rather than directly setting fields on the app state).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1337&quot;&gt;xilem#1337&lt;&#x2F;a&gt;: Use virtual scrolling for timelines.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1370&quot;&gt;xilem#1370&lt;&#x2F;a&gt;: Show the blurhash based preview of media attachments.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;1991&quot; height=&quot;891&quot; src=&quot;placehero-progress.png&quot; alt=&quot;Two screenshots of a Mastodon app. Left shows the post announcing Matt Campbell&#x27;s RustWeek 2025 talk, including a very low detail image with alt text shown below. The right screen shows posts from googlefonts@typo.social, which was entered in a box in the left sidebar of the app.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Placehero can now load content from anywhere in a user&#x27;s timeline, and preview images (left).
It can also jump directly to a specific user&#x27;s timeline by username (right).
Note that full image loading is not yet supported, only the preview based on the blurhash.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;anymore&quot;&gt;Anymore&lt;&#x2F;h2&gt;
&lt;p&gt;On 4 August, we released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;anymore&#x2F;releases&#x2F;tag&#x2F;v1.0.0&quot;&gt;Anymore v1.0.0&lt;&#x2F;a&gt;.
This is our crate for the fundamental &lt;code&gt;AnyDebug&lt;&#x2F;code&gt; trait, which greatly aids debugging when using dynamically typed values.
Anymore is designed to be used in public APIs; it has a minimal API surface so that it can be extremely stable.
We recommend considering it for use cases where you would otherwise be returning (potentially wrapped) &lt;code&gt;Box&amp;lt;dyn Any&amp;gt;&lt;&#x2F;code&gt; values from your libraries.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.
We&#x27;ve been preparing for the 0.12 release:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;476&quot;&gt;kurbo#476&lt;&#x2F;a&gt;: Adds an &lt;code&gt;Axis&lt;&#x2F;code&gt; type taken from Masonry.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;483&quot;&gt;kurbo#483&lt;&#x2F;a&gt;: Document Kurbo&#x27;s feature flags.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;485&quot;&gt;kurbo#485&lt;&#x2F;a&gt;: Better handle edge cases in cubic_to_quadratic, by Cosimo Lupo.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;486&quot;&gt;kurbo#486&lt;&#x2F;a&gt;: Deprecate and replace existing &lt;code&gt;aspect_ratio&lt;&#x2F;code&gt; methods, which used a non-standard definition of aspect ratio.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;487&quot;&gt;kurbo#487&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;488&quot;&gt;kurbo#488&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;489&quot;&gt;kurbo#489&lt;&#x2F;a&gt;: Remove many long-deprecated items.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;490&quot;&gt;kurbo#490&lt;&#x2F;a&gt;: Fix miter join in dashed strokes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;493&quot;&gt;kurbo#493&lt;&#x2F;a&gt; (in progress): Convert &lt;code&gt;CubicBez::nearest&lt;&#x2F;code&gt; to the &lt;code&gt;poly-cool&lt;&#x2F;code&gt; quintic solver.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;p&gt;If you wish to discuss the Linebender project individually, Daniel is offering &lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;&quot;office hours&quot; appointments&lt;&#x2F;a&gt;, which are free to book.
It really helps us to learn what aspects our users care about the most.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in July 2025</title>
        <published>2025-08-06T00:00:00+00:00</published>
        <updated>2025-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
             Laurenz Stampfl
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-19/"/>
        <id>https://linebender.org/blog/tmil-19/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-19/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;785&quot;&gt;vello#785&lt;&#x2F;a&gt;: Fixed strokes with a width of zero being treated as fills.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;908&quot;&gt;vello#908&lt;&#x2F;a&gt;: Updated to wgpu version 25.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1093&quot;&gt;vello#1093&lt;&#x2F;a&gt;: Disabled runtime checks in shaders using wgpu&#x27;s new &lt;code&gt;create_shader_module_trusted&lt;&#x2F;code&gt; API, by sagudev.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This month&#x27;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1064&quot;&gt;vello#1064&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1086&quot;&gt;vello#1086&lt;&#x2F;a&gt;: Image rendering in Vello Hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1078&quot;&gt;vello#1078&lt;&#x2F;a&gt;: Rewrote Vello CPU to be more SIMD-friendly.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1092&quot;&gt;vello#1092&lt;&#x2F;a&gt;: Adds support for SIMD flattening.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1103&quot;&gt;vello#1103&lt;&#x2F;a&gt;: Optimises alpha coverage calculation in strip rendering.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1105&quot;&gt;vello#1105&lt;&#x2F;a&gt;: Ignores paths containing NaN points, giving a warning.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1122&quot;&gt;vello#1122&lt;&#x2F;a&gt;: Adds opacity layers to Vello Hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1134&quot;&gt;vello#1134&lt;&#x2F;a&gt;: Reuses FlattenCtx for paths.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;427&quot;&gt;kurbo#427&lt;&#x2F;a&gt;: Contains a new stroke expander with significant performance improvements.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Our &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1ZquH-53j2OedTbgEKCJBKTh4WLE11UveM10mNdnVARY&#x2F;edit?tab=t.0#heading=h.j3duh9pgdm94&quot;&gt;working roadmap&lt;&#x2F;a&gt; outlines the planned timeline for work on the renderers into next year.&lt;&#x2F;p&gt;
&lt;p&gt;An integration of Vello as the backend for Servo&#x27;s canvas rendering has landed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;servo&#x2F;servo&#x2F;pull&#x2F;36821&quot;&gt;servo#36821&lt;&#x2F;a&gt; (and also Vello CPU in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;servo&#x2F;servo&#x2F;pull&#x2F;38282&quot;&gt;servo#38282&lt;&#x2F;a&gt;).
You can follow this work at &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;servo&#x2F;servo&#x2F;pull&#x2F;38345&quot;&gt;servo#38345&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;benchmarking&quot;&gt;Benchmarking&lt;&#x2F;h3&gt;
&lt;p&gt;We have performed some benchmarking to understand where Vello CPU&#x27;s performance lies in the available 2d renderers.
We did this by creating &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LaurenzV&#x2F;blend2d-apps&#x2F;tree&#x2F;benching&quot;&gt;a fork of the Blend2D benchmark harness&lt;&#x2F;a&gt; with the addition of Vello CPU.
We also added Tiny Skia, which is also stewarded by Linebender and is another popular renderer written in Rust.
You can read more about the benchmark methodology on &lt;a href=&quot;https:&#x2F;&#x2F;blend2d.com&#x2F;performance.html&quot;&gt;Blend2D&#x27;s performance page&lt;&#x2F;a&gt;.
We wish to thank the Blend2D team for creating this excellent suite of tests.&lt;&#x2F;p&gt;
&lt;!-- We did try embedding the results here, but it doesn&#x27;t really work nicely --&gt;
&lt;!-- &lt;details&gt;

&lt;style&gt;
@media screen and (max-width: 800px) {
  #tmil19-vello-charts-frame {
    width: 800px;
    position: relative;
    left: -15px;
  }
}
@media screen and (max-width: 1000px) {
  #tmil19-vello-charts-frame {
  width: 800px;
  position: relative;
  left: -30px;
  &#x2F;* min-height: 65vh *&#x2F;
}
  }
#tmil19-vello-charts-frame {
  width: 1000px;
  position: relative;
  left: -80px;
  height: 65vh;
  max-height: content;
}
&lt;&#x2F;style&gt;

&lt;iframe src=&quot;https:&#x2F;&#x2F;laurenzv.github.io&#x2F;vello_chart&#x2F;&quot; id=&quot;tmil19-vello-charts-frame&quot;&gt;&lt;&#x2F;iframe&gt;

&lt;&#x2F;details&gt; --&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;laurenzv.github.io&#x2F;vello_chart&#x2F;&quot;&gt;benchmark results page&lt;&#x2F;a&gt; shows the results of running this suite on an Apple M1 Pro.
This shows the results for Blend2D, Agg, Tiny Skia, Vello CPU, Cairo, Skia, and JUCE.
The source for this results page is available on GitHub at &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LaurenzV&#x2F;vello_chart&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;LaurenzV&#x2F;vello_chart&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Some things that should be noted here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Vello CPU is still under active development, so these are only preliminary results.&lt;&#x2F;li&gt;
&lt;li&gt;We currently do not support x86-64 SIMD, which is why these charts currently only show an ARM machine.
As noted below, we&#x27;re actively working on x86-64 support.&lt;&#x2F;li&gt;
&lt;li&gt;Tiny Skia&#x27;s relative performance &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;tiny-skia?tab=readme-ov-file#performance&quot;&gt;is documented&lt;&#x2F;a&gt; to be worse on ARM than on x86-64.
We therefore expect the performance gap between Vello CPU and Tiny Skia to be smaller on x86-64.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It is clear that &lt;code&gt;vello-cpu&lt;&#x2F;code&gt; has very impressive performance and on track to become the fastest CPU-only renderer in the Rust ecosystem!
Blend2D is still the clear winner in these tests, but &lt;code&gt;vello-cpu&lt;&#x2F;code&gt; takes second place in many of the benchmarks, often beating other mature renderers such as Skia and Cairo.
This is especially the case as the size of the geometry gets larger.
Blend2D and &lt;code&gt;vello-cpu&lt;&#x2F;code&gt; both offer multi-threaded rendering modes (marked by the 2T&#x2F;4T&#x2F;8T suffixes, as opposed to ST for single threaded).
Vello CPU&#x27;s multithreading is especially effective when drawing larger geometries with curves or when using complex paints such as gradients or patterns.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h3&gt;
&lt;p&gt;Fearless SIMD is our SIMD infrastructure library.
We are developing it in concert with the Vello sparse strips renderers, particularly &lt;code&gt;vello_cpu&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To support the significant Vello CPU refactor using SIMD, this month saw the addition of more methods implemented in both Neon and WebAssembly.
Thanks to new contributions from Benjamin Saunders we&#x27;ve started on SSE 4.2 support for &lt;code&gt;x86&lt;&#x2F;code&gt; architectures.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;24&quot;&gt;fearless_simd#24&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;26&quot;&gt;fearless_simd#26&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;27&quot;&gt;fearless_simd#27&lt;&#x2F;a&gt;: Implement all WASM SIMD methods.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;31&quot;&gt;fearless_simd#31&lt;&#x2F;a&gt;: Introduce semantic conversion traits, by Benjamin Saunders.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&#x2F;pull&#x2F;42&quot;&gt;fearless_simd#42&lt;&#x2F;a&gt; (not yet merged): SSE 4.2 support, by Benjamin Saunders.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;!-- TODO: Maybe trim again? --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1077&quot;&gt;xilem#1077&lt;&#x2F;a&gt;: Added the accessibility integration for VirtualScroll.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1096&quot;&gt;xilem#1096&lt;&#x2F;a&gt;: Improved the default styles in Masonry, by Marco Melorio.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1124&quot;&gt;xilem#1124&lt;&#x2F;a&gt;: Make Checkbox support keyboard interaction, by tannal.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1130&quot;&gt;xilem#1130&lt;&#x2F;a&gt;: Rename &lt;code&gt;Textbox&lt;&#x2F;code&gt; to &lt;code&gt;TextInput&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1163&quot;&gt;xilem#1163&lt;&#x2F;a&gt;: Make text color controlled through properties.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1168&quot;&gt;xilem#1168&lt;&#x2F;a&gt;: Add &lt;code&gt;IndexedStack&lt;&#x2F;code&gt; widget, by Kiran Wells.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1170&quot;&gt;xilem#1170&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1178&quot;&gt;xilem#1178&lt;&#x2F;a&gt;: Use &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-19&#x2F;#anymore&quot;&gt;Anymore&lt;&#x2F;a&gt; for all actions.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1189&quot;&gt;xilem#1189&lt;&#x2F;a&gt;: Add the active status.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1200&quot;&gt;xilem#1200&lt;&#x2F;a&gt;: Simplify both exclusive and immutable raw access to child widgets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1212&quot;&gt;xilem#1212&lt;&#x2F;a&gt;: Add a convenience associated type for the action type generated by each widget.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1213&quot;&gt;xilem#1213&lt;&#x2F;a&gt;: Add a post_paint pass, designed for box shadows.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1215&quot;&gt;xilem#1215&lt;&#x2F;a&gt;: Create a &lt;code&gt;NewWidget&lt;&#x2F;code&gt; type, which encapsulates the metadata associated with new widgets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1223&quot;&gt;xilem#1223&lt;&#x2F;a&gt;: Add cache to avoid relayouts when constraints haven&#x27;t changed.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1237&quot;&gt;xilem#1237&lt;&#x2F;a&gt;: Add rudimentary clipboard support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1239&quot;&gt;xilem#1239&lt;&#x2F;a&gt;: Add pixel snapping to layout pass.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1246&quot;&gt;xilem#1246&lt;&#x2F;a&gt;: Use properties in &lt;code&gt;ProgressBar&lt;&#x2F;code&gt;, by Pufferfish.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1248&quot;&gt;xilem#1248&lt;&#x2F;a&gt;: Make all widget associated properties be stored in the same arena.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1253&quot;&gt;xilem#1253&lt;&#x2F;a&gt;: Let Masonry&#x27;s button have any, by Nixon.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;521&quot; height=&quot;420&quot; src=&quot;masonry_new_style.png&quot; alt=&quot;A todo list app, with items referring to aspects of the new design language, namely &#x27;New Colours&#x27;, &#x27;Increased Consistency&#x27;, and &#x27;More Rounded Corners&#x27;. The item labelled &#x27;A full design system&#x27; is unchecked.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;As of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1096&quot;&gt;xilem#1096&lt;&#x2F;a&gt; Masonry&#x27;s default styles have been improved.
This is not a full design system, but is a piecewise improvement.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.
Our work on Placehero, which is the working name for our Mastodon client example, has inspired several significant architectural improvements in Xilem.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1117&quot;&gt;xilem#1117&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1122&quot;&gt;xilem#1122&lt;&#x2F;a&gt;: Make &lt;code&gt;DynMessage&lt;&#x2F;code&gt; not require &lt;code&gt;Send&lt;&#x2F;code&gt;, and remove the &lt;code&gt;Message&lt;&#x2F;code&gt; generic from View.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1142&quot;&gt;xilem#1142&lt;&#x2F;a&gt;: Add an environment system.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1170&quot;&gt;xilem#1170&lt;&#x2F;a&gt;: Use &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-19&#x2F;#anymore&quot;&gt;Anymore&lt;&#x2F;a&gt; for messages.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1220&quot;&gt;xilem#1220&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1256&quot;&gt;xilem#1256&lt;&#x2F;a&gt;: Use the environment system for avatars in Placehero.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1257&quot;&gt;xilem#1257&lt;&#x2F;a&gt;: Avoid per-frame potential  allocations in views with multiple children (i.e. Flex, Grid).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;1202&quot; height=&quot;1029&quot; src=&quot;xilem_chess.png&quot; alt=&quot;A chess board, with several controls to the left. The white queen is highlighted, and all its valid moves are also highlighted.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;For July, we would like to showcase this Chess GUI developed using Xilem by Dr. Salewski.
It can be found in its repository at &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;StefanSalewski&#x2F;xilem-chess&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;StefanSalewski&#x2F;xilem-chess&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;anymore&quot;&gt;Anymore&lt;&#x2F;h2&gt;
&lt;p&gt;You might have noticed mentions of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;anymore&quot;&gt;Anymore&lt;&#x2F;a&gt; in both the Xilem and Masonry sections.
This is a new crate which we&#x27;ve created for the &lt;code&gt;AnyDebug&lt;&#x2F;code&gt; trait.
This allows creating dynamically typed values which can be inspected, making debugging downcasting failures much easier.
This crate is designed for stability, so that it can be used for interoperability between projects (without allocation).
We plan to release version 1.0 in early August.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;378&quot;&gt;parley#378&lt;&#x2F;a&gt;: Reimplements the fontconfig backend using FFI, improving font matching.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;378&quot;&gt;parley#378&lt;&#x2F;a&gt;: Implements shift-click selection extension, by kekelp.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;389&quot;&gt;parley#389&lt;&#x2F;a&gt;: Renames variants to more closely match CSS.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;395&quot;&gt;parley#395&lt;&#x2F;a&gt;: Adds a method to unregister a loaded font.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;releases&#x2F;tag&#x2F;v0.11.3&quot;&gt;Kurbo 0.11.3&lt;&#x2F;a&gt;, with some ergonomics and performance improvements, calculation of moments using Green&#x27;s theorem, and other methods.&lt;&#x2F;p&gt;
&lt;p&gt;As mentioned in the Vello section, the new, faster stroke expansion logic (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;427&quot;&gt;kurbo#427&lt;&#x2F;a&gt;) has landed in main.
This will be in the upcoming 0.12 release, which is semver-breaking because of changes to the API to reduce memory allocation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;raph-s-job-change&quot;&gt;Raph&#x27;s job change&lt;&#x2F;h2&gt;
&lt;p&gt;Raph Levien has decided to take a voluntary exit offer from Google.
He is very grateful for the opportunity and the support from Google Fonts of Linebender and Rust UI projects.
His last day there will be October 12.
He has a new gig lined up, as well – he plans to join Canva in January, working on rendering and Rust.
That also involves a move to Australia, an exciting new adventure.
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.
The timing of office hours will also need to change, to accommodate the time zone; more updates will be forthcoming.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;p&gt;If you wish to discuss the Linebender project individually, Daniel is offering &lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;&quot;office hours&quot; appointments&lt;&#x2F;a&gt;, which are free to book.
It really helps us to learn what aspects our users care about the most.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in June 2025</title>
        <published>2025-07-09T00:00:00+00:00</published>
        <updated>2025-07-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-18/"/>
        <id>https://linebender.org/blog/tmil-18/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-18/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1062&quot;&gt;vello#1062&lt;&#x2F;a&gt;: Add smoke test for layer size, by sagudev.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1019&quot;&gt;vello#1019&lt;&#x2F;a&gt;: Add Kompari support.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This month we continued seeing a massive amount of activity on the sparse strips renderers, a collaborative evolution of Vello.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1023&quot;&gt;vello#1023&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1029&quot;&gt;vello#1029&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1041&quot;&gt;vello#1041&lt;&#x2F;a&gt; (among others): Optimisations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1044&quot;&gt;vello#1044&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1047&quot;&gt;vello#1047&lt;&#x2F;a&gt;: Multithreading support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1053&quot;&gt;vello#1053&lt;&#x2F;a&gt;: Add SIMD support (see below).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1060&quot;&gt;vello#1060&lt;&#x2F;a&gt;: Make glyph rendering optional in the CPU renderer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1065&quot;&gt;vello#1065&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1070&quot;&gt;vello#1070&lt;&#x2F;a&gt;: Improved automated testing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;427&quot;&gt;kurbo#427&lt;&#x2F;a&gt; (in review): A new stroke expander with significant performance improvements.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1ZquH-53j2OedTbgEKCJBKTh4WLE11UveM10mNdnVARY&#x2F;edit?tab=t.0#heading=h.j3duh9pgdm94&quot;&gt;working roadmap&lt;&#x2F;a&gt; outlines the planned timeline for work on the renderers over the next year.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fearless-simd&quot;&gt;Fearless SIMD&lt;&#x2F;h3&gt;
&lt;p&gt;Much of the recent work on sparse strip rendering has been SIMD-accelerated implementation of the parts running on CPU.
Here, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1053&quot;&gt;vello#1053&lt;&#x2F;a&gt; is something of the tip of the iceberg.
Our &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;a-plan-for-simd&#x2F;&quot;&gt;&lt;em&gt;A plan for SIMD&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; blog post sketched out our plans to build an abstraction layer to write SIMD code in a safe, portable way, in contrast to the original prototyping which was all done in unsafe &lt;code&gt;core::arch&lt;&#x2F;code&gt; intrinsics.
Since then, there has been rapid progress on the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;fearless_simd&quot;&gt;Fearless SIMD&lt;&#x2F;a&gt; project, focusing on SIMD primitives needed to accelerate rendering.
Support for WASM is particularly strong.&lt;&#x2F;p&gt;
&lt;p&gt;The crate has been moving fast and there are no stability guarantees yet, but we are very hopeful that it will be a solid foundation for other projects that can benefit from SIMD acceleration.
We invite projects to start experimenting, and give us feedback.
Discussion is in the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;514230-simd&quot;&gt;#simd channel&lt;&#x2F;a&gt; on the Linebender Zulip.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;987&quot;&gt;xilem#987&lt;&#x2F;a&gt;: Route text events to the root widget if there is no focused widget.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1038&quot;&gt;xilem#1038&lt;&#x2F;a&gt;: Support multiple (top-level) desktop windows in Masonry, by Martin Fischer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1009&quot;&gt;xilem#1009&lt;&#x2F;a&gt;: Add properties which only take effect when a widget is hovered&#x2F;disabled&#x2F;active.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1043&quot;&gt;xilem#1043&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1044&quot;&gt;xilem#1044&lt;&#x2F;a&gt;: Split out a Masonry Core crate, which can increase parallelism in compilation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1048&quot;&gt;xilem#1048&lt;&#x2F;a&gt;: Split testing into a Masonry Testing crate, allowing certainty that test code isn&#x27;t inadvertently included in release binaries.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1053&quot;&gt;xilem#1053&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1054&quot;&gt;xilem#1054&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1055&quot;&gt;xilem#1055&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1056&quot;&gt;xilem#1056&lt;&#x2F;a&gt;: Add properties to &lt;code&gt;Textbox&lt;&#x2F;code&gt;, &lt;code&gt;Checkbox&lt;&#x2F;code&gt;, &lt;code&gt;Flex&lt;&#x2F;code&gt;, &lt;code&gt;Grid&lt;&#x2F;code&gt;, and &lt;code&gt;SizedBox&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1086&quot;&gt;xilem#1086&lt;&#x2F;a&gt;: Validate accessibility tree updates in tests.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;1464&quot; height=&quot;955&quot; src=&quot;multiple_windows.png&quot; alt=&quot;Three overlapping windows on a black background. The frontmost window is titled Second Window, has text displaying a count of 11, a plus button, and a minus button, stacked vertically. Behind it is First Window, which is the same with a count of 13. At the back is a window titled Multiple Windows, which shows a map from the aforementioned windows to their values above a textbox and Add button. The textbox contains the text Next Window.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;As of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1038&quot;&gt;xilem#1038&lt;&#x2F;a&gt; Masonry (and Xilem) support multiple windows.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;608&quot;&gt;xilem#608&lt;&#x2F;a&gt;: A &lt;code&gt;ViewSequence&lt;&#x2F;code&gt; called &lt;code&gt;WithoutElements&lt;&#x2F;code&gt;, to allow including side-effects in lists of element children.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;992&quot;&gt;xilem#992&lt;&#x2F;a&gt;: Add support for multiple (top-level) desktop windows in Xilem, by Martin Fischer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1071&quot;&gt;xilem#1071&lt;&#x2F;a&gt;: Split Xilem into modules.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1079&quot;&gt;xilem#1079&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1085&quot;&gt;xilem#1085&lt;&#x2F;a&gt;: Provide the app&#x27;s state to each &lt;code&gt;View&lt;&#x2F;code&gt; during more phases. This will allow many future architecture explorations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1078&quot;&gt;xilem#1078&lt;&#x2F;a&gt;: Allow accessing the channel of new requests for a &lt;code&gt;worker&lt;&#x2F;code&gt; directly.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1094&quot;&gt;xilem#1094&lt;&#x2F;a&gt;: Refactor &lt;code&gt;lens&lt;&#x2F;code&gt; into its own view so that the state doesn&#x27;t need to passed when constructing the view.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1097&quot;&gt;xilem#1097&lt;&#x2F;a&gt;: Small example to teach variable length lists, by Nils Martel.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1102&quot;&gt;xilem#1102&lt;&#x2F;a&gt;: Add a helper for flex rows, to improve readability of layout code.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In June, we started a new initiative for Xilem, a Mastodon client example.
This is being developed alongside Xilem to focus its development.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1087&quot;&gt;xilem#1087&lt;&#x2F;a&gt;: Display a single scrollable timeline.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1089&quot;&gt;xilem#1089&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1116&quot;&gt;xilem#1116&lt;&#x2F;a&gt;: Add simple HTML processing to make posts more readable.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1091&quot;&gt;xilem#1091&lt;&#x2F;a&gt;: Load and display the avatar of post authors.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1092&quot;&gt;xilem#1092&lt;&#x2F;a&gt;: Improve the styling of posts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1108&quot;&gt;xilem#1108&lt;&#x2F;a&gt;: Correctly display boosted posts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;1114&quot;&gt;xilem#1114&lt;&#x2F;a&gt;: Allow viewing replies to a post.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;802&quot; height=&quot;609&quot; src=&quot;placehero.png&quot; alt=&quot;A window vertically split into two panes, where the left pane is empty except for the text Connected to Mastodon. Two Mastodon Posts are visible in the right pane, each showing their author&#x27;s avatar and name, the post&#x27;s time and contents, and the number of interactions the post has had. Each post also has a button labelled View Replies.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;The Hero app is currently hardcoded to show a subset of &lt;a href=&quot;https:&#x2F;&#x2F;mastodon.online&#x2F;@raph&quot;&gt;Raph&#x27;s timeline&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;p&gt;In June, we released Parley &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;releases&#x2F;tag&#x2F;v0.5.0&quot;&gt;0.5.0&lt;&#x2F;a&gt;.
This includes features we talked about in previous months, including restoring &lt;code&gt;Layout: Sync&lt;&#x2F;code&gt;, and improvements to line height handling.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;376&quot;&gt;parley#376&lt;&#x2F;a&gt;: An initial version of &lt;code&gt;AttributedText&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;381&quot;&gt;parley#381&lt;&#x2F;a&gt;: Select &quot;hard lines&quot; rather than soft lines when triple clicking.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;382&quot;&gt;parley#382&lt;&#x2F;a&gt;: Use ui-events-winit in the Vello Editor example.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;android-view&quot;&gt;Android View&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-mobile&#x2F;android-view&quot;&gt;Andrdoid View&lt;&#x2F;a&gt; was handed over to the Rust Mobile organisation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
We&#x27;re also running a separate office hours time dedicated to the renderer collaboration, details also available at that link.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;p&gt;If you wish to discuss the Linebender project individually, Daniel is offering &lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;&quot;office hours&quot; appointments&lt;&#x2F;a&gt;, which are free to book.
It really helps us to learn what aspects our users care about the most.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in May 2025</title>
        <published>2025-06-17T00:00:00+00:00</published>
        <updated>2025-06-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            Olivier Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-17/"/>
        <id>https://linebender.org/blog/tmil-17/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-17/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustweek&quot;&gt;RustWeek&lt;&#x2F;h2&gt;
&lt;p&gt;This month saw the &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;&quot;&gt;RustWeek 2025&lt;&#x2F;a&gt; conference, in Utrecht in the Netherlands.&lt;&#x2F;p&gt;
&lt;p&gt;A lot of things happened!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-talks&quot;&gt;The talks&lt;&#x2F;h3&gt;
&lt;p&gt;Raph Levien gave a talk titled &lt;em&gt;Faster, easier 2D vector rendering&lt;&#x2F;em&gt;, about Vello&#x27;s new architecture.
The talk had some nice visuals and a pretty cool demo!&lt;&#x2F;p&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;991&quot; height=&quot;626&quot; src=&quot;sparse-strips.png&quot; alt=&quot;Image from the sparse strips demo&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;_sv8K190Zps?si=s-NdOxRPaBmS9FdQ&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;Matt Campbell gave a talk titled &lt;em&gt;AccessKit: reusable UI accessibility&lt;&#x2F;em&gt;, showing off AccessKit and its API and architecture.
The talk also came with a cool demo, showcasing AccessKit&#x27;s Android integration.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;OI2TzJ6Sw10?si=FBRXVnlmasTLr_bF&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;h3 id=&quot;the-anniversary&quot;&gt;The Anniversary&lt;&#x2F;h3&gt;
&lt;p&gt;RustWeek also saw &lt;a href=&quot;https:&#x2F;&#x2F;blog.rust-lang.org&#x2F;2025&#x2F;05&#x2F;15&#x2F;Rust-1.87.0&#x2F;&quot;&gt;the release of Rust 1.87&lt;&#x2F;a&gt;, which coincided (&lt;a href=&quot;https:&#x2F;&#x2F;poignardazur.github.io&#x2F;2025&#x2F;06&#x2F;13&#x2F;anniversary-trivia&#x2F;&quot;&gt;to the day!&lt;&#x2F;a&gt;) with the &quot;10 years of Rust&quot; party.&lt;&#x2F;p&gt;
&lt;p&gt;Some members of Linebender were at the party, which was a great experience. See who you can spot on the group photo!&lt;&#x2F;p&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;1752&quot; height=&quot;996&quot; src=&quot;party.jpg&quot; alt=&quot;Rust Anniversary group photo&quot;&gt;
&lt;h3 id=&quot;the-unconference&quot;&gt;The Unconference&lt;&#x2F;h3&gt;
&lt;p&gt;The Linebender team also went to the UI Unconference, a roundtable where various subjects were broached (accessibility, platform integrations, SVG rendering, etc).&lt;&#x2F;p&gt;
&lt;p&gt;Overall it felt like various project leaders were increasingly interested in pooling resources and using common libraries, but there is still a long way to go on that front.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;950&quot;&gt;xilem#950&lt;&#x2F;a&gt;: Adds support for &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;endoli&#x2F;ui-events&quot;&gt;&lt;code&gt;ui-events&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; crate.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;961&quot;&gt;xilem#961&lt;&#x2F;a&gt;: Adds default property values and a default theme.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;973&quot;&gt;xilem#973&lt;&#x2F;a&gt;: Releases Masonry &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;0.3.0&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; width=&quot;300&quot; height=&quot;300&quot; src=&quot;button-shadows.png&quot; alt=&quot;Screenshot of the new shadows.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;960&quot;&gt;xilem#960&lt;&#x2F;a&gt;: Adds new shadow property to buttons.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;964&quot;&gt;xilem#964&lt;&#x2F;a&gt;: Handles Masonry properties for more styling options.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;973&quot;&gt;xilem#973&lt;&#x2F;a&gt;: Release Xilem &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;0.3.0&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;524&quot;&gt;vello#524&lt;&#x2F;a&gt;: Implements pipeline caching, drastically improving Android startup times.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;963&quot;&gt;vello#963&lt;&#x2F;a&gt;: Rounds vertical hinting offsets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;966&quot;&gt;vello#966&lt;&#x2F;a&gt;: Releases Vello &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.5.0&quot;&gt;0.5.0&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This month we continued seeing a massive amount of activity on Vello&#x27;s sparse strips renderers (see Raph&#x27;s video above for details), thanks in part to the tireless contributions of Canva developers Alex Gemberg, Taj Pereira and Andrew Jakubowicz, and to the continued work of Laurenz Stampfl as part of his master&#x27;s project.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;937&quot;&gt;vello#937&lt;&#x2F;a&gt;: Adds support for rendering bitmap and COLR glyphs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;948&quot;&gt;vello#948&lt;&#x2F;a&gt;: Adds support for drawing blurred, rounded rectangles.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;957&quot;&gt;vello#957&lt;&#x2F;a&gt;: Adds clipping and spatiotemportal allocation to vello_hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1011&quot;&gt;vello#1011&lt;&#x2F;a&gt;: Adds native WebGL backend for vello_hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;1008&quot;&gt;vello#1008&lt;&#x2F;a&gt;: Makes vello_common and vello_cpu no_std.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This month also saw the first release of &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;vello_cpu&quot;&gt;vello_cpu&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;p&gt;As the name implies, vello_cpu is a CPU-only renderer for vector graphics using Vello&#x27;s tech stack.
It&#x27;s still very experimental (version &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;sparse-strips-v0.0.1&quot;&gt;0.0.1&lt;&#x2F;a&gt;) and likely to see all sorts of breaking changes, and performance isn&#x27;t great, but if you want to experiment with it, you can run &lt;code&gt;cargo add vello_cpu&lt;&#x2F;code&gt; in your terminal and start hacking away.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;334&quot;&gt;parley#334&lt;&#x2F;a&gt;: Adds editor features required for Android IME.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;344&quot;&gt;parley#344&lt;&#x2F;a&gt;: Adds option to quantize vertical layout metrics.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;346&quot;&gt;parley#346&lt;&#x2F;a&gt;: Enables Parley&#x2F;Fontique to compile to wasm with default features enabled, for better discoverability of the wasm target.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;349&quot;&gt;parley#349&lt;&#x2F;a&gt;: Releases Parley &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;releases&#x2F;tag&#x2F;v0.4.0&quot;&gt;0.4.0&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;362&quot;&gt;parley#362&lt;&#x2F;a&gt;: Adds absolute and metrics-relative line height styles.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;ve also started a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A plan for SIMD</title>
        <published>2025-06-06T00:00:00+00:00</published>
        <updated>2025-06-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/a-plan-for-simd/"/>
        <id>https://linebender.org/blog/a-plan-for-simd/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/a-plan-for-simd/">&lt;h1 id=&quot;a-plan-for-simd&quot;&gt;A plan for SIMD&lt;&#x2F;h1&gt;
&lt;p&gt;This document is a followup to the blog post, “&lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;towards-fearless-simd&#x2F;&quot;&gt;Towards fearless SIMD, 7 years later&lt;&#x2F;a&gt;”.
My goal in publishing that was to start a conversation about the best way for Rust to support SIMD programming.
I’ve also done a bit more exploration and had some discussions at RustWeek, and am now prepared to offer a plan.
Ideally, I’d like some level of buy-in from the Rust ecosystem, but in any case it feels Good Enough to proceed with writing a large quantity of SIMD code, which is required for Linebender projects to meet their performance goals.
There&#x27;s also a companion PR, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;fearless_simd&#x2F;pull&#x2F;3&quot;&gt;fearless_simd#3&lt;&#x2F;a&gt;, which moves this proposal forward.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;goals&quot;&gt;Goals&lt;&#x2F;h2&gt;
&lt;p&gt;The main goals are spelled out in the above-linked blog.
SIMD results in massive speedups for workloads operating on bulk data, especially image processing, media codec, audio.
It is also possible to exploit SIMD for speedups in other applications such as string processing.
The primary goal of this library is to make SIMD programming ergonomic and safe for Rust programmers, making it as easy as possible to achieve near-peak performance across a wide variety of CPUs.
These goals are very similar to those of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;highway&quot;&gt;Highway&lt;&#x2F;a&gt;, a mature and capable SIMD library for C++.&lt;&#x2F;p&gt;
&lt;p&gt;After some more experimentation and reflection, I’d like to explicitly add the following goals:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Lightweight dependency.
The library itself should be quick to build.
It should have no expensive transitive dependencies.
In particular, it should not require proc macro infrastructure.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Fine-grained levels.
I’ve spent more time looking at CPU stats, and it’s clear there is value in supporting at least SSE 4.2 – in the &lt;a href=&quot;https:&#x2F;&#x2F;firefoxgraphics.github.io&#x2F;telemetry&#x2F;#view=system&quot;&gt;Firefox hardware survey&lt;&#x2F;a&gt;, AVX-2 support is only 74.2% (previously I was relying on Steam, which has it as 94.66%).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;We build in the direction of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;fearless_simd&#x2F;pull&#x2F;2&quot;&gt;fearless_simd#2&lt;&#x2F;a&gt;, but with a few course corrections.
In particular, instead of manually curating the library and using (declarative) macros to try to reduce repetition and boilerplate, we rely heavily on code generation.
For example, here is the current way to express dispatch:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;inline&lt;&#x2F;span&gt;&lt;span&gt;(always)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;to_srgb_impl&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;S: Simd&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;simd&lt;&#x2F;span&gt;&lt;span&gt;: S, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rgba&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; 4]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] {
&lt;&#x2F;span&gt;&lt;span&gt;    ...
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;simd_dispatch!(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;to_srgb&lt;&#x2F;span&gt;&lt;span&gt;(level, rgba: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] = to_srgb_impl);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But with an attribute, it could be simplified to something like this (exact syntax may vary):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;simd_dispatch&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;to_srgb&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;S: Simd&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;level&lt;&#x2F;span&gt;&lt;span&gt;: Level, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rgba&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; 4]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; simd: S = level.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;get_simd&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;    ...
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While the current fearless_simd#2 prototype implements a handful of types, the goal is to support a full cartesian product of SIMD width 64 to 512, signed and unsigned integer types from 8 to 32 (possibly 64), f32 (possibly f64), and f16 where available (primarily newer ARM chips, though Sapphire Rapids does support it).
For widths greater than native, the library will polyfill with arrays of the native SIMD width.&lt;&#x2F;p&gt;
&lt;p&gt;Note: since that blog post, f16 and Neon f16 instructions are supported in Rust nightly.
It would be possible to polyfill in a hacky way (as is done in fearless_simd#2), but my inclination is to have these depend on Rust support, and similarly for AVX-512.
With luck, these will stabilize soon (and obviously that’s one of our big asks of the Rust project).
[Update: AVX-512 will land in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;pull&#x2F;138940&quot;&gt;1.89&lt;&#x2F;a&gt; if things go well; still gathering more info about fp16 but that might also be very soon]&lt;&#x2F;p&gt;
&lt;h2 id=&quot;explicit-vs-variable-width&quot;&gt;Explicit vs variable width&lt;&#x2F;h2&gt;
&lt;p&gt;One of the big decisions in writing SIMD code is whether to write code with types of explicit width, or to use associated types in a trait which have chip-dependent widths.
The design of &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;pulp&#x2F;latest&#x2F;pulp&#x2F;&quot;&gt;pulp&lt;&#x2F;a&gt; strongly favors the latter; the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;pulp&#x2F;latest&#x2F;pulp&#x2F;trait.Simd.html&quot;&gt;Simd&lt;&#x2F;a&gt; trait has only “natural width” types, and, in particular, there is no implementation of, for example, 256 bit wide operations on Neon.
A key departure from pulp, then, is support for portable explicit width programming.&lt;&#x2F;p&gt;
&lt;p&gt;For Linebender work, I expect 256 bits to be a sweet spot.
Obviously, it’s the natural width of AVX-2, which is a pretty big majority of x86_64 chips.
On Neon, code written for 256 bits will be unrolled somewhat, but there are 32 registers (as opposed to 16 for AVX-2), so register pressure should not be a problem, and high end chips (such as Apple Silicon) have very wide issue, meaning that the number of elements that can be processed in a single clock cycle is similar to other chips with 256 bit vectors but narrower issue.
The main reason to go smaller is when the loop has a high probability of consuming less than 256 bits of input.&lt;&#x2F;p&gt;
&lt;p&gt;In the other direction, the majority of shipping AVX-512 chips are double-pumped, meaning that a 512 bit vector is processed in two clock cycles (see &lt;a href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20250526102842&#x2F;https:&#x2F;&#x2F;www.mersenneforum.org&#x2F;node&#x2F;21615#post614191&quot;&gt;mersenneforum post&lt;&#x2F;a&gt; for more details), each handling 256 bits, so code written to use 512 bits is not significantly faster (I assert this based on some serious experimentation on a Zen 5 laptop).
I also expect this state of affairs to continue for a while; AMD won this design war and Intel is struggling to catch up after flailing for many years.
If and when a significant number of true 512 bit chips ship, that would justify more work to write variants optimized for 512 bits.&lt;&#x2F;p&gt;
&lt;p&gt;For simpler (map-like) workloads performing the same scalar computation for each element separately, I propose adding pulp-like associated natural-width types and operations to the &lt;code&gt;Simd&lt;&#x2F;code&gt; trait.
Following Highway, I think it also makes sense to have some more operations that work in 128 bit blocks.
A motivating use case is f32 color space conversion, where the alpha channel is passed through unmodified; a very reasonable implementation strategy is to do the nonlinear conversion for all channels, then do a blend operation on lane 3 of 128 bit blocks.
(Additional note: in experiments, trying to do this absolutely broke autovectorization).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;light-use-of-macros&quot;&gt;Light use of macros&lt;&#x2F;h2&gt;
&lt;p&gt;I am quite concerned about the compile time.
A cold build of fearless_simd#2 on an M1 Max is 3.25s.
Considering that building out the full cartesian product of sizes and types will cause about an order of magnitude increase in size, it’s clear that the library has the potential for major impact on compile times.&lt;&#x2F;p&gt;
&lt;p&gt;Using &lt;code&gt;-Z self-profile&lt;&#x2F;code&gt; to investigate, 87.6% of the time is in expand_crate, which I believe is primarily macro expansion [an expert in rustc can confirm or clarify].
This is not hugely surprising, as (following the example of pulp), declarative macros are used very heavily.
A large fraction of that is the safe wrappers for intrinsics (corresponding to &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;pulp&#x2F;latest&#x2F;pulp&#x2F;core_arch&#x2F;x86&#x2F;index.html&quot;&gt;core_arch&lt;&#x2F;a&gt; in pulp).&lt;&#x2F;p&gt;
&lt;p&gt;I believe that using codegen to expand out the macros before crate publish time will help greatly with compile times, but this needs to be experimentally validated.
A possible downside is the size of the crate (especially uncompressed), but I expect zlib compression to be very effective given the repetitive, boilerplate nature of the contents.&lt;&#x2F;p&gt;
&lt;p&gt;One use of macros will remain: &lt;code&gt;simd_dispatch&lt;&#x2F;code&gt; as a declarative macro to generate the dispatch wrappers.
Likely the proposed &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.github.io&#x2F;rust-project-goals&#x2F;2025h1&#x2F;macro-improvements.html&quot;&gt;declarative macro improvements&lt;&#x2F;a&gt; could help a lot here.
I’m especially positive about the ability to write attributes as a declarative macro, as that would reduce the stuttering in the existing syntax.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;topics-discussed-in-the-blog&quot;&gt;Topics discussed in the blog&lt;&#x2F;h2&gt;
&lt;p&gt;These topics are discussed in the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;towards-fearless-simd&#x2F;&quot;&gt;towards fearless SIMD, 7 years later&lt;&#x2F;a&gt; blog, but I&#x27;ll touch on them here as they are quite important.&lt;&#x2F;p&gt;
&lt;p&gt;Dispatch is done by doing runtime detection once at the beginning of the application, resulting in a &lt;code&gt;Level&lt;&#x2F;code&gt; enum, each variant of which is a zero-sized token type representing CPU capability.
This choice (same as pulp) minimizes cost of runtime detection.&lt;&#x2F;p&gt;
&lt;p&gt;It is possible to write code in a generic SIMD style, and this will work well in some use cases, but we also support downcasting the generic &lt;code&gt;Simd&lt;&#x2F;code&gt; bound to a specific level, at which point that level&#x27;s chip-specific capabilities are available.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s an example of downcasting:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;inline&lt;&#x2F;span&gt;&lt;span&gt;(always)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;copy_alpha&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;S: Simd&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;: f32x4&amp;lt;S&amp;gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span&gt;: f32x4&amp;lt;S&amp;gt;) -&amp;gt; f32x4&amp;lt;S&amp;gt; {
&lt;&#x2F;span&gt;&lt;span&gt;    #[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span&gt;(target_arch = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;x86_64&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if let &lt;&#x2F;span&gt;&lt;span&gt;Some(avx2) = a.simd.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;level&lt;&#x2F;span&gt;&lt;span&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;as_avx2&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; avx2
&lt;&#x2F;span&gt;&lt;span&gt;            .sse4_1
&lt;&#x2F;span&gt;&lt;span&gt;            ._mm_blend_ps::&amp;lt;8&amp;gt;(a.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span&gt;(), b.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span&gt;())
&lt;&#x2F;span&gt;&lt;span&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;simd_into&lt;&#x2F;span&gt;&lt;span&gt;(a.simd);
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;    #[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span&gt;(target_arch = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;aarch64&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if let &lt;&#x2F;span&gt;&lt;span&gt;Some(neon) = a.simd.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;level&lt;&#x2F;span&gt;&lt;span&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;as_neon&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; neon
&lt;&#x2F;span&gt;&lt;span&gt;            .neon
&lt;&#x2F;span&gt;&lt;span&gt;            .vcopyq_laneq_f32::&amp;lt;3, 3&amp;gt;(a.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span&gt;(), b.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span&gt;())
&lt;&#x2F;span&gt;&lt;span&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;simd_into&lt;&#x2F;span&gt;&lt;span&gt;(a.simd);
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span&gt; result = a;
&lt;&#x2F;span&gt;&lt;span&gt;    result[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;] = b[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;];
&lt;&#x2F;span&gt;&lt;span&gt;    result
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In addition, the SIMD types all support &lt;code&gt;core::ops&lt;&#x2F;code&gt;, including implicit splat so it is easy to, say, multiply a vector by a scalar.
This ergonomic feature is present in &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;simdeez&#x2F;latest&#x2F;simdeez&#x2F;&quot;&gt;simdeez&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;simd&#x2F;index.html&quot;&gt;std::simd&lt;&#x2F;a&gt;, but not &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;pulp&#x2F;latest&#x2F;pulp&#x2F;&quot;&gt;pulp&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alternatives-considered&quot;&gt;Alternatives considered&lt;&#x2F;h2&gt;
&lt;p&gt;I started prototyping a DSL that compiles into Rust, using proc macro infrastructure.
This would operate in one of two modes, either as a proc macro run at build time, or as codegen to generate .rs files which would typically be checked into a repo, to minimize build time impact.
(I’ll note that this is a particular instance of a much more general need for better staged compilation, which we’re feeling particularly acutely for shader compilation).
At some point I&#x27;ll post the prototype, as I think it&#x27;s worthy of being considered if we&#x27;re going to be doing a full exploration.&lt;&#x2F;p&gt;
&lt;p&gt;While I think this approach has some advantages, it approaches the cost of building a real programming language, with associated needs for tooling etc.
In addition, the proc macro approach really shows seams when it comes to cross-module interactions.&lt;&#x2F;p&gt;
&lt;p&gt;Another possibility is to evolve &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;pulp&#x2F;latest&#x2F;pulp&#x2F;&quot;&gt;pulp&lt;&#x2F;a&gt; in the direction we need.
That’s still not out of the question, but the changes proposed are quite extensive, and this could be disruptive to the existing user base, particularly &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;faer&#x2F;latest&#x2F;faer&#x2F;&quot;&gt;faer&lt;&#x2F;a&gt;.
One goal in publishing this plan is to gather feedback from the pulp community about what they’d like to see happen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;on-rvv-and-sve&quot;&gt;On RVV and SVE&lt;&#x2F;h2&gt;
&lt;p&gt;One topic I didn’t cover in my blog post is RVV and SVE, which are pretty marginal these days but will become more important.
There are some pretty big challenges, and for the most part we’re blocked on Rust support for the intrinsics.
There is work in this direction, including a &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.github.io&#x2F;rust-project-goals&#x2F;2025h1&#x2F;arm-sve-sme.html&quot;&gt;project goal&lt;&#x2F;a&gt; and an &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;pull&#x2F;3729&quot;&gt;RFC for sized traits&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Taking a longer view, I think there are two modes for “scalable vector” SIMD.
One is to generate asm which operates correctly no matter the SIMD width.
It’s fairly easy to see how to do this for map-like workloads, and I think it’s reasonable to consider this mostly a codegen problem for autovectorization, as opposed to a good use case for explicit SIMD.&lt;&#x2F;p&gt;
&lt;p&gt;The other is to treat scalable vectors as an annoying instruction encoding for SIMD width not known at compile time, and with partial support for operating on fixed-width (128 bit) blocks.
This is essentially the same concept as “&lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;zingaburga&#x2F;805669eb891c820bd220418ee3f0d6bd#fixed-width-vector-workloads-on-variable-width-vectors&quot;&gt;Fixed Width Vector Workloads on Variable Width Vectors&lt;&#x2F;a&gt;”.
The entire concept is a bit frustrating because nearly all ARM chips are 128 bits anyway.&lt;&#x2F;p&gt;
&lt;p&gt;See also the paper &lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;pdf&#x2F;2309.16509&quot;&gt;SIMD Everywhere Optimization from ARM NEON to RISC-V Vector Extensions&lt;&#x2F;a&gt; for an approach to making explicit SIMD code portable to RVV.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;considerations-for-wasm-simd&quot;&gt;Considerations for WASM SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;There’s a &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;WASM.20SIMD&quot;&gt;Zulip thread&lt;&#x2F;a&gt; on this.
One tricky bit is that WASM doesn’t have runtime feature detection, rather they expect feature detection to be done as part of the negotiation for deciding which WASM blob to serve.
In some ways, this makes sense, as it avoids pretty much all of the difficulties of multiversioning (including potential binary size impact), but it does require attention to build and deployment, especially as the number of cases will grow as &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;WebAssembly&#x2F;relaxed-simd&quot;&gt;relaxed-simd&lt;&#x2F;a&gt; and other extensions ship.
In WASM, since SIMD capabilities are determined at compile time, the &lt;code&gt;Level&lt;&#x2F;code&gt; enum will compile to nothing.
When writing code portable to other targets that require runtime detection, it still makes sense to write code using the &lt;code&gt;Level&lt;&#x2F;code&gt; enum, but on WASM it has zero runtime cost.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;very-small-simd&quot;&gt;Very small SIMD&lt;&#x2F;h2&gt;
&lt;p&gt;In the embedded world, there are a variety of SIMD extensions for small widths.
I believe the standard RVV extension (intended for application class chips) requires a width of at least 128 bits, but there is a Zve64 profile intended for embedded.
Additionally, embedded ARM processors have a SIMD extension called “&lt;a href=&quot;https:&#x2F;&#x2F;en.wikichip.org&#x2F;wiki&#x2F;arm&#x2F;helium&quot;&gt;Helium&lt;&#x2F;a&gt;”, which is still 128 bit but with a smaller register count and more limited instructions.
Given that Linebender is pushing more into &lt;code&gt;no_std&lt;&#x2F;code&gt;, it’s possible we’ll want to support these.
However, I’m not able to find much evidence of Rust support for these.
At this point, probably best to consider it an open question and potential future work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;discussion&quot;&gt;Discussion&lt;&#x2F;h2&gt;
&lt;p&gt;There’s a &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;255911-rust&#x2F;topic&#x2F;A.20plan.20for.20SIMD&#x2F;with&#x2F;520769933&quot;&gt;discussion thread&lt;&#x2F;a&gt; on Linebender Zulip.
I’ve also opened a &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;219381-t-libs&#x2F;topic&#x2F;is.20.60arch.3A.3Aaarch64.3A.3Afloat16x8_t.60.20supposed.20to.20be.20stable.3F&#x2F;with&#x2F;520762685&quot;&gt;thread&lt;&#x2F;a&gt; on Rust Zulip with some gnarly details about stabilizing fp16 on Neon.
There&#x27;s also a post on &lt;a href=&quot;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;rust&#x2F;comments&#x2F;1l5yf3b&#x2F;a_plan_for_simd&#x2F;&quot;&gt;&#x2F;r&#x2F;rust&lt;&#x2F;a&gt; open for discussion.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m posting this now to the Linebender blog to encourage more discussion in the Rust community.
The best place for serious technical discussion is the Zulip thread.
We expect development to continue in the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;fearless_simd&quot;&gt;fearless_simd repo&lt;&#x2F;a&gt;.
The library is not yet usable for broad applications, but it might be possible to start implementing SIMD speedups.
We will be implementing speedups in Vello&#x27;s CPU and hybrid renderers in the coming weeks, and that will guide our priorities.
We are very interested in feedback about which features are missing, or any other friction; these can be filed as issues against the repo, or raised on the Zulip thread.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in April 2025</title>
        <published>2025-05-07T00:00:00+00:00</published>
        <updated>2025-05-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Taj Pereira
          </name>
        </author>
        
        <author>
          <name>
            Tom Churchman
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-16/"/>
        <id>https://linebender.org/blog/tmil-16/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-16/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustweek&quot;&gt;RustWeek&lt;&#x2F;h2&gt;
&lt;p&gt;Many members of the Linebender community will be attending the &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;&quot;&gt;RustWeek 2025&lt;&#x2F;a&gt; conference, in Utrecht next month.
At the time of writing, there are no longer tickets available, although there is a waitlist.
Raph Levien will be giving a talk, titled &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;talks&#x2F;raph&#x2F;&quot;&gt;&lt;em&gt;Faster, easier 2D vector rendering&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;.
This will be covering a lot of the sparse strips work discussed in &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-16&#x2F;#vello&quot;&gt;the Vello section&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Matt Campbell will give a talk, titled &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;talks&#x2F;matt&#x2F;&quot;&gt;&lt;em&gt;AccessKit: reusable UI accessibility&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We will also be attending the &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;unconf-intro&#x2F;&quot;&gt;unconference&lt;&#x2F;a&gt;, as part of the &quot;UI, App dev &amp;amp; Browser Summit&quot; group.
We&#x27;re looking forward to working with other teams in the Rust UI ecosystem there.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;913&quot;&gt;xilem#913&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;938&quot;&gt;xilem#938&lt;&#x2F;a&gt;: Ongoing work on properties, in preparation for adding more styling options.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;906&quot;&gt;xilem#906&lt;&#x2F;a&gt;: Improves Virtual Scrolling to support non-infinite use cases.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;922&quot;&gt;xilem#922&lt;&#x2F;a&gt;: Adds support for multiline text input, by alexjg.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;925&quot;&gt;xilem#925&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;927&quot;&gt;xilem#927&lt;&#x2F;a&gt;: Update &quot;line&quot; scrolling to have a more correct speed, by Aaron Muir Hamilton and Alix Bott.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;929&quot;&gt;xilem#929&lt;&#x2F;a&gt;: Used trait upcasting to simplify how widgets use &lt;code&gt;Any&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;937&quot;&gt;xilem#937&lt;&#x2F;a&gt;: Unifies test screenshots into a single folder, making it clearer which widget they relate to.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;multiline_textbox.png&quot; alt=&quot;To do list app, where the next item input says turn off the newline factory, with newlines before newline and factory. The final item also contains a newline.&quot; width=&quot;600&quot; height=&quot;252&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Masonry now has support for multi-line text inputs.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;920&quot;&gt;xilem#920&lt;&#x2F;a&gt;: Slightly improves the handling of messages, using trait upcasting.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;921&quot;&gt;xilem#921&lt;&#x2F;a&gt;: Supports Masonry&#x27;s virtual scrolling in Xilem.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;886&quot;&gt;vello#886&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;887&quot;&gt;vello#887&lt;&#x2F;a&gt;: Update the SDL2 example to SDL3.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;892&quot;&gt;vello#892&lt;&#x2F;a&gt;: Improved how our snapshot tests are handled in preparation for Kompari integration.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Progress on the sparse strips renderers has also been continuing at pace.
The big standout this month is the significant leap in Vello CPU functionality:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;923&quot;&gt;vello#923&lt;&#x2F;a&gt;: Blending, compositing, and layers.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;893&quot;&gt;vello#893&lt;&#x2F;a&gt;: Linear, radial and sweep gradients.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;878&quot;&gt;vello#878&lt;&#x2F;a&gt;: Clipping.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;919&quot;&gt;vello#919&lt;&#x2F;a&gt;: Image rendering.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;cowboy.png&quot; alt=&quot;Cowboy emoji, with a rainbox gradient mixed on top.&quot; width=&quot;300&quot; height=&quot;300&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;An adapted version of Vello CPU&#x27;s tests, showing support for blending, gradients and image rendering.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The above PRs set the foundation for introducing these features into Vello Hybrid over the coming months.
Another notable released feature is text outline rendering, which allows both renderers to draw text (emoji are not yet supported).&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;883&quot;&gt;vello#883&lt;&#x2F;a&gt;: Text outline rendering for Vello CPU and Hybrid.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;896&quot;&gt;vello#896&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;897&quot;&gt;vello#897&lt;&#x2F;a&gt;: Make the hinting robust, allowing clearer drawing in more cases.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Our working roadmap can be found &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1ZquH-53j2OedTbgEKCJBKTh4WLE11UveM10mNdnVARY&#x2F;edit?tab=t.0#heading=h.j3duh9pgdm94&quot;&gt;here&lt;&#x2F;a&gt;.
This roadmap outlines our planned timeline for work on the renderers over the next year.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;272&quot;&gt;parley#272&lt;&#x2F;a&gt;: Added Kompari integration for testing into Parley.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;315&quot;&gt;parley#315&lt;&#x2F;a&gt;: Implemented properties based on CSS&#x27;s &lt;code&gt;word-break&lt;&#x2F;code&gt; and &lt;code&gt;overflow-wrap&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;342&quot;&gt;parley#342&lt;&#x2F;a&gt;: Fixes a bug in &lt;code&gt;align&lt;&#x2F;code&gt; where the offset wasn&#x27;t being reset between calls.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;break_all_second_half.png&quot; alt=&quot;Text with a line break halfway through the word Antidisestablishmentarianism. The first characters after this break are underlined (indicating that those have the WordBreak property set).&quot; width=&quot;626&quot; height=&quot;408&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;315&quot;&gt;parley#315&lt;&#x2F;a&gt; added the &lt;code&gt;WordBreak&lt;&#x2F;code&gt; style property, which is set to &lt;code&gt;BreakAll&lt;&#x2F;code&gt; on &#x27;anism&#x27; in this screenshot.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;kurbo&#x2F;&quot;&gt;Kurbo&lt;&#x2F;a&gt; provides data structures and algorithms for curves and vector paths.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;releases&#x2F;tag&#x2F;v0.11.2&quot;&gt;Kurbo 0.11.2&lt;&#x2F;a&gt;, adding the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;kurbo&#x2F;0.11.2&#x2F;kurbo&#x2F;struct.Triangle.html&quot;&gt;&lt;code&gt;Triangle&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; shape, providing more ergomic methods on various shapes, and improving performance.
The following are some highlights of this release.
See the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;releases&#x2F;tag&#x2F;v0.11.2&quot;&gt;changelog&lt;&#x2F;a&gt; for a full overview.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;350&quot;&gt;kurbo#350&lt;&#x2F;a&gt;: Adds the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;kurbo&#x2F;0.11.2&#x2F;kurbo&#x2F;struct.Triangle.html&quot;&gt;&lt;code&gt;Triangle&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; shape.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;383&quot;&gt;kurbo#383&lt;&#x2F;a&gt;: Adds an efficient numerical method for approximating ellipse perimeters, originally described by Kummer (1837) and rediscovered by Linderholm and Segal (1995).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;418&quot;&gt;kurbo#418&lt;&#x2F;a&gt;: Adds &lt;code&gt;BezPath::with_capacity&lt;&#x2F;code&gt; to allow more efficient allocation if the size of the bezier path is known beforehand.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;379&quot;&gt;kurbo#379&lt;&#x2F;a&gt;: Adds some common derives to &lt;code&gt;Stroke&lt;&#x2F;code&gt; and &lt;code&gt;StrokeOpts&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;384&quot;&gt;kurbo#384&lt;&#x2F;a&gt;: Implements &lt;code&gt;Div&amp;lt;f64&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;Mul&amp;lt;f64&amp;gt;&lt;&#x2F;code&gt; for &lt;code&gt;Insets&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;399&quot;&gt;kurbo#399&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;409&quot;&gt;kurbo#409&lt;&#x2F;a&gt;: Implement &lt;code&gt;Sum&lt;&#x2F;code&gt; for &lt;code&gt;Vec2&lt;&#x2F;code&gt;, add &lt;code&gt;Vec2::turn_90&lt;&#x2F;code&gt; and &lt;code&gt;Vec2::rotate_scale&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;412&quot;&gt;kurbo#412&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;413&quot;&gt;kurbo#413&lt;&#x2F;a&gt;: Add &lt;code&gt;Size::{min,max}&lt;&#x2F;code&gt; and &lt;code&gt;Size::INFINITY&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;429&quot;&gt;kurbo#429&lt;&#x2F;a&gt;: Adds &lt;code&gt;Affine::scale_about&lt;&#x2F;code&gt; and &lt;code&gt;Affine::then_scale_about&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;390&quot;&gt;kurbo#390&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;428&quot;&gt;kurbo#428&lt;&#x2F;a&gt;: Improve performance by reducing the number of operations in &lt;code&gt;Triangle::circumscribed_circle&lt;&#x2F;code&gt; and improving inlining.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Multiple improvements to Kurbo are on the roadmap, such as improved stroke expansion in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;427&quot;&gt;kurbo#427&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;color&quot;&gt;Color&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; provides functionality for representing, converting, parsing, serializing, and manipulating colors in a variety of color spaces.
It closely follows the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;css-color-4&#x2F;&quot;&gt;CSS Color Module Level 4&lt;&#x2F;a&gt; draft spec.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;Color 0.3.0&lt;&#x2F;a&gt;, featuring the addition of manual chromatic adaptation and absolute color conversions, improved type conversion ergonomics, and more.
This month saw the following changes, all included in the 0.3.0 release.
See the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;changelog&lt;&#x2F;a&gt; for a full overview.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;156&quot;&gt;color#156&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;164&quot;&gt;color#164&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;165&quot;&gt;color#165&lt;&#x2F;a&gt;: Add specialized absolute color conversion methods for ProPhoto RGB, ACES2065-1 and ACEScg.
While &lt;code&gt;ColorSpace&lt;&#x2F;code&gt; includes default implementations for absolute color conversions, having these specializations improves computational efficiency.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;166&quot;&gt;color#166&lt;&#x2F;a&gt;: Uses faster (and &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;0.3.0&#x2F;color&#x2F;struct.AlphaColor.html#method.to_rgba8&quot;&gt;almost-correct&lt;&#x2F;a&gt;) rounding for conversion from double precision floating point to 8-bit integer RGBA formats.
This works around slow x86 rounding behavior.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;155&quot;&gt;color#155&lt;&#x2F;a&gt;: Improves ergonomics by implementing &lt;code&gt;From&amp;lt;AlphaColor&amp;lt;_&amp;gt;&amp;gt; for DynamicColor&lt;&#x2F;code&gt; for all color spaces that have a &lt;code&gt;DynamicColor&lt;&#x2F;code&gt; counterpart.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;157&quot;&gt;color#157&lt;&#x2F;a&gt;: Removes the deprecated &lt;code&gt;From&amp;lt;Rgba8&amp;gt; for PremulColor&amp;lt;Srgb&amp;gt;&lt;&#x2F;code&gt; implementation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;145&quot;&gt;color#145&lt;&#x2F;a&gt;: Fixes handling of powerless&#x2F;missing components of the HWB color space, which is necessary for correct color interpolation when components are missing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;158&quot;&gt;color#158&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;159&quot;&gt;color#159&lt;&#x2F;a&gt;: Improve documentation for &lt;code&gt;DynamicColor::interpolate&lt;&#x2F;code&gt; and &lt;code&gt;gradient&lt;&#x2F;code&gt;, including usage examples.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;149&quot;&gt;color#149&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;150&quot;&gt;color#150&lt;&#x2F;a&gt;: Improve constructing constant &lt;code&gt;Missing&lt;&#x2F;code&gt; flags and &lt;code&gt;Missing&lt;&#x2F;code&gt; documentation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;android-view&quot;&gt;Android View&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mwcampbell&#x2F;android-view&quot;&gt;Android View&lt;&#x2F;a&gt; is a platform integration for Rust code in Android apps.
In April, Android View gained support for text input using the software keyboard, with accessibility support.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;android_view_voice_input.png&quot; alt=&quot;Android Screen, with text on the top half, and a keyboard visible with the word listening, followed by an ellipsis.&quot; width=&quot;252&quot; height=&quot;257&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Android View now allows many input methods on Android.
This screenshot shows voice to text working in an app using Linebender libraries.
This image has been edited to remove blank areas.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;research-and-future-directions&quot;&gt;Research and Future Directions&lt;&#x2F;h2&gt;
&lt;p&gt;Linebender has an origin story in being a very research oriented group, looking to break new ground.
While we are focused on shipping code today, we still have an eye on the future and how to be prepared for the new opportunities and technologies that are coming.&lt;&#x2F;p&gt;
&lt;p&gt;Towards the end of April, some members of Linebender started working on ecosystem standardisation of input events, based on the web input events specification.
This work is happening in the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;endoli&#x2F;ui-events&quot;&gt;UI Events&lt;&#x2F;a&gt; repository.
This is not a Linebender project, but we&#x27;re watching it with great interest.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ve also started thinking about how to make a renderer abstraction, allowing APIs which can use any of Vello&#x27;s backends.
The largest difficulty there is related to resources such as images.
For example Vello Hybrid&#x27;s image type would be a &lt;code&gt;wgpu&lt;&#x2F;code&gt; Texture, whereas Vello CPU should just use a heap-allocated buffer.
We have some existing prototypes, see &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Rendering.20abstraction.20prototype&#x2F;with&#x2F;516197002&quot;&gt;#vello &amp;gt; Rendering abstraction prototype&lt;&#x2F;a&gt; for example.
This work is likely to now continue after RustWeek.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;ve also started a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in March 2025</title>
        <published>2025-04-04T00:00:00+00:00</published>
        <updated>2025-04-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Bruce Mitchener
          </name>
        </author>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-15/"/>
        <id>https://linebender.org/blog/tmil-15/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-15/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We have made a major change to the internal design of Masonry, in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;910&quot;&gt;xilem#910&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;914&quot;&gt;xilem#914&lt;&#x2F;a&gt;.
This change splits Masonry into two packages, &lt;code&gt;masonry_core&lt;&#x2F;code&gt; and &lt;code&gt;masonry&lt;&#x2F;code&gt;.
The Masonry crate provides a runner for Masonry core using Winit, and should be used for an integrated app development experience.
Masonry Core contains the implementation of Masonry&#x27;s widgets and passes, and is designed to be be embedded into existing apps (currently only those which use wgpu).
This should be transparent to existing Masonry users.&lt;&#x2F;p&gt;
&lt;p&gt;We hoped to release a new alpha of Xilem and Masonry to crates.io in March.
However, this was put on hold whilst the Properties experiment we mentioned last month continues:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;873&quot;&gt;xilem#873&lt;&#x2F;a&gt;: Implements properties, which is additional data attached to each widget in a uniform way, intended to enable styling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;892&quot;&gt;xilem#892&lt;&#x2F;a&gt;: Uses properties for styling the built-in &lt;code&gt;Button&lt;&#x2F;code&gt; widget.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;styled-button.png&quot; alt=&quot;A button with a red border, a red font, and placeholder text.&quot; width=&quot;200&quot; height=&quot;80&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;An example of a styled button.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We have also made significant progress outside of these highlighted areas:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;897&quot;&gt;xilem#897&lt;&#x2F;a&gt;: Reduced the size of many of our screenshot tests.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;904&quot;&gt;xilem#904&lt;&#x2F;a&gt;: Implemented a new algorithm for screenshot testing, which better reflects the aspects of the screenshots we wish to test.
It also implements automatic compression of blessed screenshots using the excellent &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;shssoichiro&#x2F;oxipng&quot;&gt;oxipng&lt;&#x2F;a&gt; library.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;899&quot;&gt;xilem#899&lt;&#x2F;a&gt;: Added documentation for lots of items and methods which were missing documentation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;882&quot;&gt;xilem#882&lt;&#x2F;a&gt;: Adds the core of a virtual scrolling widget, a scroll area which loads its child widgets only when they would be visible to the user.
This allows it to be used for extremely large datasets.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;virtual-scroll.png&quot; alt=&quot;A screenshot of a desktop window, showing a list of numbers around 999900. Every number divisible by 3 has been replaced with the word &#x27;Fizz&#x27;, &#x27;Buzz&#x27; for 5, and &#x27;FizzBuzz&#x27; for numbers divisible by both. The &#x27;FizzBuzz&#x27; which would be item 999900 is twice as large as the other items.&quot; width=&quot;458&quot; height=&quot;509&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;882&quot;&gt;xilem#882&lt;&#x2F;a&gt; added a virtual scrolling widget. This is the &#x27;Infinite FizzBuzz&#x27; example, which also shows how the virtual scrolling can support items with arbitrary heights.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;887&quot;&gt;xilem#887&lt;&#x2F;a&gt;: Added a View for the already existing Split widget.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;899&quot;&gt;xilem#899&lt;&#x2F;a&gt;: Added some more documentation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;841&quot;&gt;vello#841&lt;&#x2F;a&gt;: Fixed incorrect COLR Emoji rendering, which especially impacted users on Windows.
We backported this to create &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.4.1&quot;&gt;Vello 0.4.1&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;817&quot;&gt;vello#817&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;877&quot;&gt;vello#877&lt;&#x2F;a&gt;: Updates some of our GPU encoding code to not assume that allocators will give over-aligned allocations.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We have also renamed the #gpu channel on Zulip to &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&quot;&gt;#vello&lt;&#x2F;a&gt;, which better reflects the purpose of the channel.
Progress on the sparse strips renderer has also been continuing at pace:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;827&quot;&gt;vello#827&lt;&#x2F;a&gt;: Added some core API types.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;828&quot;&gt;vello#828&lt;&#x2F;a&gt;: Imported the implementation of sparse strip production, without rasterisation (Vello Common).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;830&quot;&gt;vello#830&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;832&quot;&gt;vello#832&lt;&#x2F;a&gt;: Added on CPU rasterisation of sparse strips, with integration tests (Vello CPU).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;834&quot;&gt;vello#834&lt;&#x2F;a&gt;: Added a tool (Vello Toy) for visualising different stages of the new pipeline.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;831&quot;&gt;vello#831&lt;&#x2F;a&gt;: Added the fragment shader based GPU rasteriser for sparse strips (Vello Hybrid).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;872&quot;&gt;vello#872&lt;&#x2F;a&gt;: Enable running Vello Hybrid using WebGL2.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;867&quot;&gt;vello#867&lt;&#x2F;a&gt;: Benchmarking harness for Vello Common and Vello CPU.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;paris-30k-webgl.png&quot; alt=&quot;A browser window showing a partial map of the center of Paris, France.&quot; width=&quot;2256&quot; height=&quot;752&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Paris-30k rendered using Vello&#x27;s new hybrid renderer in Firefox on Linux, a browser which does not yet support WebGPU.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The current state of the sparse strip renderers is that they can reliably render scenes where all elements are a solid colour.
Laurenz Stampfl started their master&#x27;s project working on the CPU-only renderer full-time at the end of March, working towards this roadmap and on a write-up.
The planned ordering of next steps is laid out in &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1L0Ji44GiFMygK_6h6_TP0Id8ghTMxUirgrM_5nb5zyQ&#x2F;edit?tab=t.0#heading=h.atiojofshbyp&quot;&gt;our loose roadmap&lt;&#x2F;a&gt;.
You can also follow the progress in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Vello.20Hybrid&quot;&gt;#vello &amp;gt; Vello Hybrid&lt;&#x2F;a&gt; and other threads in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&quot;&gt;#vello&lt;&#x2F;a&gt;.
Our weekly renderer office hours specifically aimed at furthering this collaboration are public - for more information about how to join these, follow &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours&lt;&#x2F;a&gt;.
Work on the renderers is continuing at pace, most recently in these open PRs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;878&quot;&gt;vello#878&lt;&#x2F;a&gt;: Add clipping to Vello CPU.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;883&quot;&gt;vello#883&lt;&#x2F;a&gt;: Implements text&#x2F;glyph rendering.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;879&quot;&gt;vello#879&lt;&#x2F;a&gt;: Experimentally runs Vello Hybrid on Android, using the new Android View work, discussed &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-15&#x2F;#research-and-future-directions&quot;&gt;below&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.
The biggest news in March was that an egui community member has opened &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emilk&#x2F;egui&#x2F;pull&#x2F;5784&quot;&gt;a PR&lt;&#x2F;a&gt; to replace egui&#x27;s bespoke text handling with Parley, with buy-in from egui&#x27;s maintainer.
The author of that change, valadaptive, has been doing fantastic work improving Parley, and has authored many of these changes.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;306&quot;&gt;parley#306&lt;&#x2F;a&gt;: Updated &lt;code&gt;register_fonts&lt;&#x2F;code&gt; to take a &lt;code&gt;Blob&lt;&#x2F;code&gt;, which allows more efficient memory usage.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;312&quot;&gt;parley#312&lt;&#x2F;a&gt;: Allows customising how registered fonts are matched, useful for implementing web fonts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;296&quot;&gt;parley#296&lt;&#x2F;a&gt;: Makes selected newline characters visible.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;316&quot;&gt;parley#316&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;317&quot;&gt;parley#317&lt;&#x2F;a&gt;: Provides greater access to the internals of &lt;code&gt;PlainEditor&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;318&quot;&gt;parley#318&lt;&#x2F;a&gt;: &lt;code&gt;is_done&lt;&#x2F;code&gt; method on &lt;code&gt;BreakLines&lt;&#x2F;code&gt;, for detecting whether linebreaking is finished.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;299&quot;&gt;parley#299&lt;&#x2F;a&gt;: Fixed text editing for layouts containing inline boxes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;egui-with-parley.png&quot; alt=&quot;A screenshot of an egui widget, titled &#x27;Complex text 🔡&#x27;. It also contains emoji support, arabic text (which is partially selected across the left-to-right to right-to-left boundary, giving a logically contiguous but visually split selection), and a properly typeset fraction 37 over 54. The final line has the the text &#x27;plus variable fonts&#x27;, where the font weight is increasing smoothly from left to right.&quot; width=&quot;549&quot; height=&quot;178&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emilk&#x2F;egui&#x2F;pull&#x2F;5784&quot;&gt;egui#5784&lt;&#x2F;a&gt; significantly improves egui&#x27;s text rendering by using Parley.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;427&quot;&gt;kurbo#427&lt;&#x2F;a&gt;: First cut at least-squares offset curves.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;428&quot;&gt;kurbo#428&lt;&#x2F;a&gt;: Improve performance of debug builds by more aggressively enabling inlining.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;429&quot;&gt;kurbo#429&lt;&#x2F;a&gt;: Add &lt;code&gt;Affine::scale_about&lt;&#x2F;code&gt;. This makes implementing zoom in a user interface more concise.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;One of the core features in kurbo is expanding a stroked outline to a filled path, which is based on computing accurate approximations to offset curves, a difficult problem in computational geometry.
As tracked in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;issues&#x2F;317&quot;&gt;kurbo#317&lt;&#x2F;a&gt;, our existing solution, based on quartic solving, produced good results but was slow.
We&#x27;ve been doing research into much faster techniques based on least-squares error minimization and accelerated Newton techniques, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;427&quot;&gt;kurbo#427&lt;&#x2F;a&gt; is the first step in landing that work.
Over the coming months, we plan to refine robustness and performance of the stroke expansion algorithm, and will also explore generalizing it to variable width strokes, an often-requested feature.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;color&quot;&gt;Color&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; provides functionality for representing, converting, parsing, serializing, and manipulating colors in a variety of color spaces.
It closely follows the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;css-color-4&#x2F;&quot;&gt;CSS Color Module Level 4&lt;&#x2F;a&gt; draft spec.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;144&quot;&gt;color#144&lt;&#x2F;a&gt;: Improves correctness when interpolating a color with missing components in the ACES 2065-1 colorspace.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kompari&quot;&gt;Kompari&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&quot;&gt;Kompari&lt;&#x2F;a&gt; is a tool for visual inspection of snapshot tests.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;26&quot;&gt;kompari#26&lt;&#x2F;a&gt;: Added support for optimising screenshots using &lt;code&gt;oxipng&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;27&quot;&gt;kompari#27&lt;&#x2F;a&gt;: Support detecting unoptimised screenshots (useful for CI).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;34&quot;&gt;kompari#34&lt;&#x2F;a&gt;: Added parallel processing of compute intensive tasks.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;research-and-future-directions&quot;&gt;Research and Future Directions&lt;&#x2F;h2&gt;
&lt;p&gt;Linebender has an origin story in being a very research oriented group, looking to break new ground.
While we are focused on shipping code today, we still have an eye on the future and how to be prepared for the new opportunities and technologies that are coming.&lt;&#x2F;p&gt;
&lt;p&gt;Matt Campbell has started work on a new platform integration for Rust code in Android, called &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mwcampbell&#x2F;android-view&quot;&gt;Android View&lt;&#x2F;a&gt;.
This is designed to work around several issues from  the activities available when using Winit, which use either &lt;code&gt;NativeActivity&lt;&#x2F;code&gt; or &lt;code&gt;GameActivity&lt;&#x2F;code&gt;.
Both of these do not integrate well with text input, and struggle to interoperate inside existing apps.
This work is in an early stage, and is taking inspiration from several existing solutions to these problems, with a special focus on getting accessibility integration correct.&lt;&#x2F;p&gt;
&lt;p&gt;We have also started work on a Styled Text library, which is designed to allow sharing rich text functionality between Rust libraries.
This is in the very early stages - if you&#x27;re working on a project which can use this, then input on your requirements will be welcome.
These can be added in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;419691-linebender&#x2F;topic&#x2F;Styled.20Text.20repo&#x2F;with&#x2F;512864431&quot;&gt;#linebender &amp;gt; Styled Text repo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustweek&quot;&gt;RustWeek&lt;&#x2F;h2&gt;
&lt;p&gt;Many members of the Linebender community will be attending the &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;&quot;&gt;RustWeek 2025&lt;&#x2F;a&gt; conference, in Utrecht in May.
At the time of writing, there are still tickets available.
Raph Levien will be giving a talk, titled &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;talks&#x2F;raph&#x2F;&quot;&gt;&lt;em&gt;Faster, easier 2D vector rendering&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;.
This will be covering a lot of the sparse strips work discussed in &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-15&#x2F;#vello&quot;&gt;the Vello section&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Matt Campbell will give a talk, titled &lt;a href=&quot;https:&#x2F;&#x2F;rustweek.org&#x2F;talks&#x2F;matt&#x2F;&quot;&gt;&lt;em&gt;AccessKit: reusable UI accessibility&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;ve also started a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Towards fearless SIMD, 7 years later</title>
        <published>2025-03-29T00:00:00+00:00</published>
        <updated>2025-03-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/towards-fearless-simd/"/>
        <id>https://linebender.org/blog/towards-fearless-simd/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/towards-fearless-simd/">&lt;p&gt;Seven years ago I wrote a blog post &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;rust&#x2F;simd&#x2F;2018&#x2F;10&#x2F;19&#x2F;fearless-simd.html&quot;&gt;Towards fearless SIMD&lt;&#x2F;a&gt;, outlining a vision for Rust as a compelling language for writing fast SIMD programs.
Where are we now?&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately, the present-day experience of writing SIMD in Rust is still pretty rough, though there has been progress, and there are promising efforts underway.
As in the previous post, this post will outline a possible vision.&lt;&#x2F;p&gt;
&lt;p&gt;Up to now, Linebender projects have not used SIMD, but that is changing.
As we work on CPU&#x2F;GPU hybrid rendering techniques, it&#x27;s clear that we need SIMD to get maximal performance of the CPU side.
We also see opportunities in faster color conversion and accelerated 2D geometry primitives.&lt;&#x2F;p&gt;
&lt;p&gt;This blog post is also a companion to a &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=y0WcCUKxk50&quot;&gt;podcast&lt;&#x2F;a&gt; I recorded recently with André Popovitch.
That podcast is a good introduction to SIMD concepts, while this blog post focuses more on future directions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-simple-example&quot;&gt;A simple example&lt;&#x2F;h2&gt;
&lt;p&gt;As a running example, we&#x27;ll compute a &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;audio&#x2F;2018&#x2F;09&#x2F;05&#x2F;sigmoid.html&quot;&gt;sigmoid&lt;&#x2F;a&gt; function for a vector of 4 values.
The scalar version is as follows:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;sigmoid&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; 4]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] {
&lt;&#x2F;span&gt;&lt;span&gt;    x.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;y&lt;&#x2F;span&gt;&lt;span&gt;| y &#x2F; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1.0 &lt;&#x2F;span&gt;&lt;span&gt;+ y * y).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;sqrt&lt;&#x2F;span&gt;&lt;span&gt;())
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This particular simple code autovectorizes nicely (&lt;a href=&quot;https:&#x2F;&#x2F;rust.godbolt.org&#x2F;z&#x2F;TfThE5r33&quot;&gt;Godbolt link&lt;&#x2F;a&gt;), but more complex examples often fail to autovectorize, often because of subtle differences in floating point semantics.
(Editorial note: a previous version of this post didn&#x27;t autovectorize (&lt;a href=&quot;https:&#x2F;&#x2F;rust.godbolt.org&#x2F;z&#x2F;GoTEK3KT3&quot;&gt;Godbolt&lt;&#x2F;a&gt;) because optimization level was set at &lt;code&gt;-O&lt;&#x2F;code&gt;, which is less aggressive than &lt;code&gt;-C opt-level=3&lt;&#x2F;code&gt;, the latter of which is the default for release builds)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;safety&quot;&gt;Safety&lt;&#x2F;h2&gt;
&lt;p&gt;One of the biggest problems with writing SIMD in Rust is that all exposed SIMD intrinsics are marked as &lt;code&gt;unsafe&lt;&#x2F;code&gt;, even in cases where they can be used safely.
The reason is that support for SIMD features varies widely, and executing a SIMD instruction on a CPU that does not support it is undefined behavior – the chip can crash, ignore the instruction, or do something unexpected.
To be used safely, there must be some other mechanism to establish that the CPU does support the feature.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the running example in hand-written intrinsic code, showing the need to write &lt;code&gt;unsafe&lt;&#x2F;code&gt; to access SIMD intrinsics at all:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span&gt;(target_arch = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;aarch64&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;sigmoid_neon&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; 4]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span&gt;core::arch::aarch64::*;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;unsafe &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; x_simd = core::mem::transmute(x);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; x_squared = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;vmulq_f32&lt;&#x2F;span&gt;&lt;span&gt;(x_simd, x_simd);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; ones = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;vdupq_n_f32&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; sum = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;vaddq_f32&lt;&#x2F;span&gt;&lt;span&gt;(ones, x_squared);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; sqrt = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;vsqrtq_f32&lt;&#x2F;span&gt;&lt;span&gt;(sum);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; ratio = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;vdivq_f32&lt;&#x2F;span&gt;&lt;span&gt;(x_simd, sqrt);
&lt;&#x2F;span&gt;&lt;span&gt;        core::mem::transmute(ratio)
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span&gt;(target_arch = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;x86_64&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;sigmoid_sse2&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; 4]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span&gt;core::arch::x86_64::*;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;unsafe &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; x_simd = core::mem::transmute(x);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; x_squared = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;_mm_mul_ps&lt;&#x2F;span&gt;&lt;span&gt;(x_simd, x_simd);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; ones = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;_mm_set1_ps&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; sum = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;_mm_add_ps&lt;&#x2F;span&gt;&lt;span&gt;(ones, x_squared);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; sqrt = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;_mm_sqrt_ps&lt;&#x2F;span&gt;&lt;span&gt;(sum);
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; ratio = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;_mm_div_ps&lt;&#x2F;span&gt;&lt;span&gt;(x_simd, sqrt);
&lt;&#x2F;span&gt;&lt;span&gt;        core::mem::transmute(ratio)
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is quite a simplified example.
For one, the SIMD width is fixed at 4 lanes (128 bits).
Most likely, in practice you&#x27;d iterate over a larger slice, taking chunks equal to the natural SIMD width.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;multiversioning&quot;&gt;Multiversioning&lt;&#x2F;h2&gt;
&lt;p&gt;A central problem important for SIMD is multiversioning and runtime dispatch.
In some cases, you know the exact CPU target, for example when compiling a binary you&#x27;ll run only on your machine (in which case &lt;code&gt;target-cpu=native&lt;&#x2F;code&gt; is appropriate).
But when distributing software more widely, there may be a range of capabilities.
For highest performance, it&#x27;s necessary to compile multiple versions of the code, and do runtime detection to dispatch to the best SIMD code the hardware can run.
This problem was expressed in the original fearless SIMD blog post, and there hasn&#x27;t been significant advance at the Rust language level since then.&lt;&#x2F;p&gt;
&lt;p&gt;In the C++ world, the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;highway&quot;&gt;Highway&lt;&#x2F;a&gt; library provides excellent SIMD support for a very wide range of targets, and also solves the multiversioning problem.
Among other uses are the codecs for the JPEG-XL image format.
Such codecs are an ideal use case for SIMD programming in general, and shipping them in a browser requires a good solution to multiversioning.
Highway has a really good explanation of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kfjahnke&#x2F;zimt&#x2F;blob&#x2F;multi_isa&#x2F;examples&#x2F;multi_isa_example&#x2F;multi_simd_isa.md&quot;&gt;their approach to multiversioning&lt;&#x2F;a&gt;.
It will be useful to study it carefully to see how they&#x27;ve solved various problems.
And a concise way of saying what I&#x27;d like to see is &quot;Highway for Rust.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;One possible approach is a crate called &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;multiversion&#x2F;latest&#x2F;multiversion&#x2F;&quot;&gt;multiversion&lt;&#x2F;a&gt;, which uses macros to replicate the code for multiple versions.
A more recent macro-based approach is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;a4lg&#x2F;rust-target-feature-dispatch&quot;&gt;rust-target-feature-dispatch&lt;&#x2F;a&gt;.
It is generally a similar approach to multiversion, and the specific differences are set out in that crate&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;a4lg&#x2F;rust-target-feature-dispatch&#x2F;blob&#x2F;main&#x2F;src&#x2F;README.md&quot;&gt;README&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Another approach, as I believe first advocated in my 2018 blog post, is to write functions polymorphic on a zero-sized type representing the SIMD capabilities, then rely on monomorphization to create the various versions.
One motivation for this approach is to encode safety in Rust&#x27;s type system.
Having the zero-sized token is proof of the underlying CPU having a certain level of SIMD capability, so calling those intrinsics is safe.
A major library that uses this approach is &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;pulp&#x2F;latest&#x2F;pulp&#x2F;&quot;&gt;pulp&lt;&#x2F;a&gt;, which also powers the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;faer&#x2F;latest&#x2F;faer&#x2F;&quot;&gt;faer&lt;&#x2F;a&gt; linear algebra library.&lt;&#x2F;p&gt;
&lt;p&gt;I started putting together a pulp version of the running example, but ran into the immediate problem that it lacks a &lt;code&gt;sqrt&lt;&#x2F;code&gt; intrinsic (this would be easy enough to add, however).
It also works a bit differently, in that it only supports vectors of the natural width, not ones of a fixed width.
For general linear algebra, that&#x27;s fine, but for some other applications it adds friction, for example colors with alpha are naturally chunks of 4 scalars.
To see an example of pulp code, as well as some discussion, see this &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;255911-rust&#x2F;topic&#x2F;Rust.20SIMD.20thoughts&#x2F;near&#x2F;489370476&quot;&gt;Zulip thread&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;fearless_simd&#x2F;pull&#x2F;2&quot;&gt;fearless_simd#2&lt;&#x2F;a&gt; I propose a prototype of reasonably-ergonomic SIMD multiversioning.
Like the original fearless_simd prototype, vector data types are polymorphic on SIMD level.
The new prototype goes beyond that in several important ways.
For one, arithmetic traits in std::ops are implemented for vector types, so it&#x27;s possible to add two vectors together, multiply vectors by scalars, etc.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s what the running example looks like in that prototype:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;inline&lt;&#x2F;span&gt;&lt;span&gt;(always)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;sigmoid_impl&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;S: Simd&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;simd&lt;&#x2F;span&gt;&lt;span&gt;: S, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; 4]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; x_simd: f32x4&amp;lt;S&amp;gt; = x.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;simd_into&lt;&#x2F;span&gt;&lt;span&gt;(simd);
&lt;&#x2F;span&gt;&lt;span&gt;    (x_simd &#x2F; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1.0 &lt;&#x2F;span&gt;&lt;span&gt;+ x_simd * x_simd).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;sqrt&lt;&#x2F;span&gt;&lt;span&gt;()).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;simd_dispatch!(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;sigmoid&lt;&#x2F;span&gt;&lt;span&gt;(level, rgba: [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;]) -&amp;gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] = sigmoid_impl);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;An advantage of the fearless_simd#2 prototype over pulp is a feature for downcasting based on SIMD level, so it&#x27;s possible to write different code optimized for different chips.
See the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;fearless_simd&#x2F;pull&#x2F;2&#x2F;files#diff-be8aece917a9235076ff8ec42749b1f1a803d2a3cbc2ccdd5425b405c74f7436&quot;&gt;srgb example&lt;&#x2F;a&gt; in that pull request for more detail.
Though there are clear advantages, at this point I&#x27;m not sure whether this is the direction to go.
It would be a lot of work to build out all the needed types and operations, with potentially a large amount of repetitive boilerplate code in the library, which in turn may cause issues with compile time.
Another possible direction is a smarter, compiler-like proc macro which synthesizes the SIMD intrinsics as needed based on the types and operations in the source program.&lt;&#x2F;p&gt;
&lt;p&gt;One additional consideration for Rust is that the implementation of runtime feature detection is &lt;a href=&quot;https:&#x2F;&#x2F;internals.rust-lang.org&#x2F;t&#x2F;better-codegen-for-cpu-feature-detection&#x2F;22083&quot;&gt;slower than it should be&lt;&#x2F;a&gt;.
Thus, feature detection and dispatch shouldn&#x27;t be done at every function call.
A good working solution is to do feature detection once, at the start of the program, then pass that token down through function calls.
It&#x27;s workable but definitely an ergonomic paper cut.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fp16-and-avx-512&quot;&gt;FP16 and AVX-512&lt;&#x2F;h2&gt;
&lt;p&gt;A general trend in parallel computation, really fueled by AI workloads, is smaller scalars with higher throughputs.
While not yet common on x86_64, the FP16 extension is supported on all Apple Silicon desktop CPUs and most recent high-ish end ARM-based phones.
Since Neon is only 128 bits wide, having 8 lanes is welcome.
I find the f16 format to be especially useful for pixel values, as it can encode color values with more than enough precision to avoid visual artifacts (8 bits is not quite enough, though it is good enough for some applications, as long as you&#x27;re not trying to do HDR).&lt;&#x2F;p&gt;
&lt;p&gt;Native Rust support for the &lt;code&gt;f16&lt;&#x2F;code&gt; type has not yet landed (tracked in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;issues&#x2F;125440&quot;&gt;rust#125440&lt;&#x2F;a&gt;), which makes use of this scalar size harder.
However, there is some support in the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;half&#x2F;latest&#x2F;half&#x2F;&quot;&gt;half&lt;&#x2F;a&gt; library, and also the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;raphlinus&#x2F;fearless_simd&#x2F;pull&#x2F;2&quot;&gt;fearless_simd#2&lt;&#x2F;a&gt; prototype exports a number of FP16 Neon instructions through inline assembly.
When true f16 support lands, it will be possible to switch over to intrinsics, which will have better optimization and ergonomics (for example, the same method will splat constants converted to &lt;code&gt;f16&lt;&#x2F;code&gt; at compile time and &lt;code&gt;f32&lt;&#x2F;code&gt; variables to be converted at runtime).&lt;&#x2F;p&gt;
&lt;p&gt;AVX-512 is a somewhat controversial SIMD capability.
It first appeared in the ill-fated Larrabee project, which shipped in limited numbers as the Xeon Phi starting in 2010, and has since appeared in scattered Intel CPUs, but with compromises.
In particular, sprinkling even a small amount of AVX-512 code into a program could result in downclocking, reducing performance for all workloads (see &lt;a href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;56852812&#x2F;simd-instructions-lowering-cpu-frequency#comment100256395_56852812&quot;&gt;Stack Overflow thread on throttling&lt;&#x2F;a&gt; for more details).
These days, the most likely way to get a CPU with AVX-512 is an AMD Zen 4 or Zen 5; it is on their strength that AVX-512 makes up about 16% of computers in the Steam hardware survey.&lt;&#x2F;p&gt;
&lt;p&gt;The increased width is not the main reason to be enthusiastic about AVX-512.
Indeed, on Zen 4 and most Zen 5 chips, the datapath is 256 bits so full 512 bit instructions are &quot;double pumped.&quot; The most exciting aspect is predication based on masks, a common implementation technique on GPUs.
In particular, memory load and store operations are safe when the mask bit is zero, which is especially helpful for using SIMD efficiently on strings.
Without predication, a common technique is to write two loops, the first handling only even multiples of the SIMD width, and a second, usually written as scalars, to handle the odd-size &quot;tail&quot;.
There are lots of problems with this - code bloat, worse branch prediction, inability to exploit SIMD for chunks slightly less than the natural SIMD width (which gets worse as SIMD grows wider), and risks that the two loops don&#x27;t have exactly the same behavior.&lt;&#x2F;p&gt;
&lt;p&gt;Going forward, Intel has proposed AVX10, and will hopefully ship AVX 10.2 chips in the next few years.
This extension has pretty much all of the features of AVX-512, with some cleanups and new features (until recently, AVX10 was defined has having a 256 bit base width and optionally 512, but 512 is now the baseline).
In addition, AVX10.2 will include 16-bit floats (currently available only in the Sapphire Rapids high-end server and workstation chips).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;about-std-simd&quot;&gt;About std::simd&lt;&#x2F;h2&gt;
&lt;p&gt;The &quot;portable SIMD&quot; work has been going on for many years and currently has a home as the nightly &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;simd&#x2F;index.html&quot;&gt;std::simd&lt;&#x2F;a&gt;.
While I think it will be very useful in many applications, I am not personally very excited about it for my applications.
For one, because it emphasizes portability, it encourages a &quot;lowest common denominator&quot; approach, while I believe that for certain use cases it will be important to tune algorithms to best use the specific quirks of the different SIMD implementations.
For two, std::simd does not itself solve the multiversion problem.
From my perspective, it&#x27;s probably best to consider it as a souped-up version of autovectorization.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;language-evolution&quot;&gt;Language evolution&lt;&#x2F;h2&gt;
&lt;p&gt;Rust&#x27;s out of the box support for SIMD is still quite rough, especially the need to use &lt;code&gt;unsafe&lt;&#x2F;code&gt; extensively.
While some of the gap can be filled with libraries, arguably it should be a goal of the language itself to support safe SIMD code.
There is progress in this direction.&lt;&#x2F;p&gt;
&lt;p&gt;First, the original version of &lt;code&gt;target_feature&lt;&#x2F;code&gt; requires &lt;code&gt;unsafe&lt;&#x2F;code&gt; to call into &lt;em&gt;any&lt;&#x2F;em&gt; function annotated with &lt;code&gt;#[target_feature]&lt;&#x2F;code&gt;.
A proposal to relax that so that functions already under a target_feature gate can call safely call into another function with the same gate is called &quot;&lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.github.io&#x2F;rfcs&#x2F;2396-target-feature-1.1.html&quot;&gt;target_feature 1.1&lt;&#x2F;a&gt;&quot; and is scheduled to ship in 1.86.
Closely related, once inside the suitable target_feature gate, the majority of SIMD intrinsics (broadly, those that don&#x27;t do memory access through pointers) should be considered safe by the compiler, and that feature (safe intrinsics in core::arch) is also in flight.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s more that can be done to help the Rust compiler recognize when SIMD use is safe, in particular to allow target_features when a concrete witness to the SIMD level is passed in as a function argument.
The &quot;struct target_features&quot; proposal (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;pull&#x2F;3525&quot;&gt;RFC 3525&lt;&#x2F;a&gt;) enables target_feature in such cases, and is one of the proposals considered in the proposed Rust project goal &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.github.io&#x2F;rust-project-goals&#x2F;2025h1&#x2F;simd-multiversioning.html&quot;&gt;Nightly support for ergonomic SIMD multiversioning&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In general, improving Rust SIMD support will require both libraries and support in the Rust language.
Different approaches at the library level may indicate different language features to best support them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;looking-forward&quot;&gt;Looking forward&lt;&#x2F;h2&gt;
&lt;p&gt;My main goal in putting these prototypes forward, as well as writing these blog posts, is to spark conversation on how best to support SIMD programming in Rust.
If done well, it is a great opportunity for the language, and fits in with its focus on performance and portability.&lt;&#x2F;p&gt;
&lt;p&gt;As we build out the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Potato.20-.20a.20paper.20design.20for.20a.20CPU.2FGPU.20hybrid.20renderer&quot;&gt;Vello hybrid CPU&#x2F;GPU renderer&lt;&#x2F;a&gt;, performance of the CPU components will rely heavily on SIMD, so we need to invest in writing a lot of SIMD code.
The most conservative approach would be hand-writing unsafe intrinsics-based code for all targets, but that&#x27;s a lot of work and the use of unsafe is unappealing.
I&#x27;d love for the Rust ecosystem can come together and build good infrastructure, competitive with Highway.
For now, I think it&#x27;s time to carefully consider the design space and try to come to consensus on what that should look like.&lt;&#x2F;p&gt;
&lt;!-- TODO: not sure if this is the best link, we don&#x27;t really have a project page for this --&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in February 2025</title>
        <published>2025-03-20T00:00:00+00:00</published>
        <updated>2025-03-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-14/"/>
        <id>https://linebender.org/blog/tmil-14/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-14/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.
February was a slow month for Xilem specific changes, although many changes further down the stack will be relevant to Xilem users.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;861&quot;&gt;xilem#861&lt;&#x2F;a&gt;: makes a method on &lt;code&gt;Pod&lt;&#x2F;code&gt; public to make creating widgets easier, by Evgeny.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;872&quot;&gt;xilem#872&lt;&#x2F;a&gt;: Exported the scale factor for limited use cases (such as single-pixel lines).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There is some important work upcoming:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;873&quot;&gt;xilem#873&lt;&#x2F;a&gt;: Olivier started to develop his &quot;arbitrary properties&quot; feature, which is intended for styling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;875&quot;&gt;xilem#875&lt;&#x2F;a&gt;: Adds an image widget containing arbitrary vector graphics content, by Richard Dodd.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;As Parley has now been released to crates.io (discussed later in this update), we&#x27;re hoping to release a new alpha of Xilem and Masonry to crates.io in March.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;803&quot;&gt;vello#803&lt;&#x2F;a&gt;: Removed the &lt;code&gt;render_to_surface&lt;&#x2F;code&gt; API, as &lt;code&gt;wgpu&lt;&#x2F;code&gt;&#x27;s new &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;wgpu&#x2F;latest&#x2F;wgpu&#x2F;util&#x2F;struct.TextureBlitter.html&quot;&gt;&lt;code&gt;TextureBlitter&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; utility makes it unnecessary.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;832&quot;&gt;vello#832&lt;&#x2F;a&gt; (in review): Jared Moulton added support for font embolden to our text handling.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Last month we mentioned a research exploration into a CPU&#x2F;GPU hybrid 2D rendering mode.
This hybrid mode works well on downlevel GPUs without strong support for compute shaders, and is also more memory efficient.
There has been a lot of interest from the community, and we are now moving forward with building out this rendering mode in Vello.
We are very excited that Alex Gemberg and Taj Pereira, two engineers from Canva, are joining the collaboration on this renderer.&lt;&#x2F;p&gt;
&lt;p&gt;In February, Raph opened &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;818&quot;&gt;vello#818&lt;&#x2F;a&gt;, which provided the first implementation of this hybrid pipeline.
We are planning to refactor this to share most of its code with an ongoing CPU-only implementation, which we expect to be extremely competitive in performance.
To that aim, we have landed &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;826&quot;&gt;vello#826&lt;&#x2F;a&gt;, which provided the repository-layout scaffolding, in the &lt;code&gt;sparse_strips&lt;&#x2F;code&gt; folder.
This initial PR is just a stub, but we are planning on filling these crates out imminently, allowing collaborative work on both pipelines (hybrid and CPU-only).
You can follow the progress in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&#x2F;topic&#x2F;Vello.20Hybrid&quot;&gt;#vello &amp;gt; Vello Hybrid&lt;&#x2F;a&gt; and other threads in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-vello&quot;&gt;#vello&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;Parley and Fontique 0.3.0&lt;&#x2F;a&gt; to crates.io.
These contain many of the features we have discussed over the previous months, including significant improvements to &lt;code&gt;PlainEditor&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resvg&quot;&gt;Resvg&lt;&#x2F;h2&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;releases&#x2F;tag&#x2F;0.45.0&quot;&gt;Resvg 0.45.0&lt;&#x2F;a&gt; in February.
This is the first release under the stewardship of Linebender.
We&#x27;d like to reiterate our many thanks to Yevhenii Reizner for the years of hard work that he has poured into this and other crates.
The largest change in this release is the relicense to dual Apache-2.0 MIT.
It also includes support for the &lt;code&gt;!important&lt;&#x2F;code&gt; CSS flag.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;412&quot;&gt;kurbo#412&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;413&quot;&gt;kurbo#413&lt;&#x2F;a&gt;: Added utility methods to &lt;code&gt;Size&lt;&#x2F;code&gt;, by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nils-mathieu&quot;&gt;@nils-mathieu&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;color&quot;&gt;Color&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; provides functionality for representing, converting, parsing, serializing, and manipulating colors in a variety of color spaces.
It closely follows the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;css-color-4&#x2F;&quot;&gt;CSS Color Module Level 4&lt;&#x2F;a&gt; draft spec.&lt;&#x2F;p&gt;
&lt;p&gt;The biggest update to Color in February was the addition of absolute color conversions, in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;139&quot;&gt;color#139&lt;&#x2F;a&gt;.
This won&#x27;t be visible for most users, but will be useful for those who need to convert between color spaces without changing the white point.
This will also be used in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;137&quot;&gt;color#137&lt;&#x2F;a&gt;, which allows creating a theoretical black-body color from a temperature in Kelvin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;velato&quot;&gt;Velato&lt;&#x2F;h2&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;releases&#x2F;tag&#x2F;v0.5.0&quot;&gt;Velato 0.5.0&lt;&#x2F;a&gt;, bringing compatibility with Vello 0.4.0.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kompari&quot;&gt;Kompari&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&quot;&gt;Kompari&lt;&#x2F;a&gt; is a tool for visual inspection of snapshot tests.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;272&quot;&gt;parley#272&lt;&#x2F;a&gt; (in review) begins the exciting process of integrating Kompari into our existing projects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;research-and-future-directions&quot;&gt;Research and Future Directions&lt;&#x2F;h2&gt;
&lt;p&gt;Linebender has an origin story in being a very research oriented group, looking to break new ground.
While we are focused on shipping code today, we still have an eye on the future and how to be prepared for the new opportunities and technologies that are coming.&lt;&#x2F;p&gt;
&lt;p&gt;While we didn&#x27;t publish much in the way of artifacts in February, there was quite a bit of experimentation with computational geometry ideas related to &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;260979-kurbo&#x2F;topic&#x2F;Two.20point.20shape.20control&quot;&gt;#kurbo &amp;gt; Two-point shape control&lt;&#x2F;a&gt;, a technique that holds promise for faster and more accurate stroke expansion of cubic Béziers.
Stay tuned for more updates.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.
We&#x27;ve also started a separate office hours time dedicated to the renderer collaboration, details also available at that link.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in January 2025</title>
        <published>2025-03-03T00:00:00+00:00</published>
        <updated>2025-03-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Kaur Kuut
          </name>
        </author>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Tom Churchman
          </name>
        </author>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-13/"/>
        <id>https://linebender.org/blog/tmil-13/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-13/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem saw decent direct progress in January and of course Xilem also benefits from all the progress in the rest of our stack which is detailed in later sections.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;420&quot;&gt;xilem#420&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;833&quot;&gt;xilem#833&lt;&#x2F;a&gt;: Added emoji picker example.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;753&quot;&gt;xilem#753&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;828&quot;&gt;xilem#828&lt;&#x2F;a&gt;: Added support for transforming widgets with &lt;code&gt;kurbo::Affine&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;806&quot;&gt;xilem#806&lt;&#x2F;a&gt;: Made &lt;code&gt;Pod&lt;&#x2F;code&gt; more flexible to allow creating a wider variety of wrapper widgets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;840&quot;&gt;xilem#840&lt;&#x2F;a&gt;: Updated to &lt;code&gt;vello&lt;&#x2F;code&gt; 0.4.0.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;emoji_picker.png&quot; alt=&quot;A screenshot of a Xilem example app. It shows sixteen different facial expression emoji with a cat face with a wry smile being selected.&quot; width=&quot;864&quot; height=&quot;1121&quot;&gt;
&lt;figcaption&gt;
Xilem emoji picker example app, showing various emoji options.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We also improved documentation, see e.g. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;818&quot;&gt;xilem#818&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.&lt;&#x2F;p&gt;
&lt;p&gt;January was quite a busy month for Masonry with lots of significant changes landing, including both new features and improved old ones.
Most notable are the following highlights:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;737&quot;&gt;xilem#737&lt;&#x2F;a&gt;: Added &lt;code&gt;zstack&lt;&#x2F;code&gt; widget for composing widgets on top of each other.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;753&quot;&gt;xilem#753&lt;&#x2F;a&gt;: Added support for transforming widgets with &lt;code&gt;kurbo::Affine&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;808&quot;&gt;xilem#808&lt;&#x2F;a&gt;: &lt;code&gt;AppDriver&lt;&#x2F;code&gt; now takes a reference to &lt;code&gt;RenderRoot&lt;&#x2F;code&gt; for more flexibility.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;820&quot;&gt;xilem#820&lt;&#x2F;a&gt;: Added a basic widget inspector for debugging.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;822&quot;&gt;xilem#822&lt;&#x2F;a&gt;: Now widget focus is cleared when a user clicks outside of that focused widget.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;823&quot;&gt;xilem#823&lt;&#x2F;a&gt;: When text of a text area is changed the cursor now gets moved to the end.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;827&quot;&gt;xilem#827&lt;&#x2F;a&gt;: Refactored &lt;code&gt;TreeArena&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;830&quot;&gt;xilem#830&lt;&#x2F;a&gt;: Improved handling of window focus.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;831&quot;&gt;xilem#831&lt;&#x2F;a&gt;: Applied &lt;code&gt;is&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;has&lt;&#x2F;code&gt; naming convention more consistently across context method names.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;834&quot;&gt;xilem#834&lt;&#x2F;a&gt;: Fixed crashing in &lt;code&gt;run_single_update_pass&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;837&quot;&gt;xilem#837&lt;&#x2F;a&gt;: Removed a bunch of redundant &lt;code&gt;Box&lt;&#x2F;code&gt; usage around &lt;code&gt;Widget&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;841&quot;&gt;xilem#841&lt;&#x2F;a&gt;: Added features to help test &lt;code&gt;Textbox&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;848&quot;&gt;xilem#848&lt;&#x2F;a&gt;: Reorganized modules.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We also improved documentation a lot, see e.g. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;787&quot;&gt;xilem#787&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;809&quot;&gt;xilem#809&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;811&quot;&gt;xilem#811&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;813&quot;&gt;xilem#813&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;815&quot;&gt;xilem#815&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;824&quot;&gt;xilem#824&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;826&quot;&gt;xilem#826&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;829&quot;&gt;xilem#829&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;832&quot;&gt;xilem#832&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;835&quot;&gt;xilem#835&lt;&#x2F;a&gt;.
Additionally a bunch of stale code got cleaned up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.4.0&quot;&gt;Vello 0.4.0&lt;&#x2F;a&gt; which has a bunch of improvements and fixes from the preceding four months.
Among the improvements is the change from December that Vello now uses our own &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; library.
Highlights from the additions in January include &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;766&quot;&gt;image extend modes, alpha, and nearest neighbor sampling&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;792&quot;&gt;correct rendering of Apple Color Emoji&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;neighbor.png&quot; alt=&quot;A screenshot of a Vello demo app. It shows four different variations of an image extended with nearest neighbor filtering.&quot; width=&quot;1570&quot; height=&quot;1247&quot;&gt;
&lt;figcaption&gt;
Vello demo, showing image extend modes with nearest neighbor filtering.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Of course work didn&#x27;t stop with this release.
In preparation for the next release we have already &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;791&quot;&gt;upgraded Vello to use wgpu 0.24.0&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo provides data structures and algorithms for curves and vector paths.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;409&quot;&gt;kurbo#409&lt;&#x2F;a&gt;: Added &lt;code&gt;turn_90&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;rotate_scale&lt;&#x2F;code&gt; methods to &lt;code&gt;Vec2&lt;&#x2F;code&gt;, and fixed the docs of &lt;code&gt;Vec2::cross&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;p&gt;In January, a variety of layout edge cases have been fixed, support for bidirectional text was expanded, and testing of text layout and selection has improved.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;238&quot;&gt;parley#238&lt;&#x2F;a&gt;: Updated to &lt;code&gt;swash&lt;&#x2F;code&gt; 0.2.0, which paves the way for future &lt;code&gt;no_std&lt;&#x2F;code&gt; support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;239&quot;&gt;parley#239&lt;&#x2F;a&gt;: Took another step towards supporting &lt;code&gt;no_std&lt;&#x2F;code&gt; by enabling further testing in CI.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;241&quot;&gt;parley#241&lt;&#x2F;a&gt;: Allows configuring the behavior of alignment for lines that overflow the container width.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;244&quot;&gt;parley#244&lt;&#x2F;a&gt;: Added screenshots to selection area and cursor positioning tests.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;245&quot;&gt;parley#245&lt;&#x2F;a&gt;: Enabled detection of the base direction of text layouts (left-to-right or right-to-left).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;249&quot;&gt;parley#249&lt;&#x2F;a&gt;: Fixed issues related to line breaking around inline boxes, by new Linebender member Wim de With.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;254&quot;&gt;parley#254&lt;&#x2F;a&gt;: Now adhering to the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;CSS2&#x2F;text.html#white-space-model&quot;&gt;CSS white space model&lt;&#x2F;a&gt; in stripping leading white space following a new line in white space collapsing mode.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;256&quot;&gt;parley#256&lt;&#x2F;a&gt;: Corrected the calculation of trailing white space, also by Wim de With.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;peniko&quot;&gt;Peniko&lt;&#x2F;h2&gt;
&lt;p&gt;Peniko provides a set of shared types for concepts that are important for drawing&#x2F;stroking paths, but excluding the path geometry itself (which can be found in Kurbo).
It includes types for brush styles (including gradient) and color.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;releases&#x2F;tag&#x2F;v0.3.1&quot;&gt;Peniko 0.3.1&lt;&#x2F;a&gt; which was a simple maintenance release with tweaked docs and updated dependencies.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;color&quot;&gt;Color&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; provides functionality for representing, converting, parsing, serializing, and manipulating colors in a variety of color spaces.
It closely follows the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;css-color-4&#x2F;&quot;&gt;CSS Color Module Level 4&lt;&#x2F;a&gt; draft spec.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;releases&#x2F;tag&#x2F;v0.2.2&quot;&gt;Color 0.2.2&lt;&#x2F;a&gt;, soon followed by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;releases&#x2F;tag&#x2F;v0.2.3&quot;&gt;Color 0.2.3&lt;&#x2F;a&gt;, the latter of which added easier methods to convert 8-bit colors from byte streams (for use with GPUs) and to other color representations in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;135&quot;&gt;color#135&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;136&quot;&gt;color#136&lt;&#x2F;a&gt;.
This release also saw the addition of the ACES2065-1 color space in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;124&quot;&gt;color#124&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;velato&quot;&gt;Velato&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;pull&#x2F;49&quot;&gt;velato#49&lt;&#x2F;a&gt;: Updated to &lt;code&gt;vello&lt;&#x2F;code&gt; 0.4.0.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello-svg&quot;&gt;Vello SVG&lt;&#x2F;h2&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello_svg&#x2F;releases&#x2F;tag&#x2F;v0.6.0&quot;&gt;Vello SVG 0.6.0&lt;&#x2F;a&gt; which most notably includes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello_svg&#x2F;pull&#x2F;50&quot;&gt;vello_svg#50&lt;&#x2F;a&gt;: Added support for raster images to be completely disabled via a feature flag.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello_svg&#x2F;pull&#x2F;53&quot;&gt;vello_svg#53&lt;&#x2F;a&gt;: Updated to &lt;code&gt;vello&lt;&#x2F;code&gt; 0.4.0.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kompari&quot;&gt;Kompari&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&quot;&gt;Kompari&lt;&#x2F;a&gt; is a tool for visual inspection of snapshot tests.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;13&quot;&gt;kompari#13&lt;&#x2F;a&gt;: Interactive review (in HTML).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;14&quot;&gt;kompari#14&lt;&#x2F;a&gt;: Rework of repository layout.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;16&quot;&gt;kompari#16&lt;&#x2F;a&gt;: Alternative diff views.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resvg&quot;&gt;Resvg&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;873&quot;&gt;resvg#873&lt;&#x2F;a&gt;: Added the stylesheet option to the C API.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;878&quot;&gt;resvg#878&lt;&#x2F;a&gt;: Updated to &lt;code&gt;svgtypes&lt;&#x2F;code&gt; 0.15.3.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;svg-types&quot;&gt;SVG Types&lt;&#x2F;h2&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;svgtypes&#x2F;releases&#x2F;tag&#x2F;v0.15.3&quot;&gt;SVG Types 0.15.3&lt;&#x2F;a&gt; with a few minor fixes.
This is also the first release under the stewardship of Linebender.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tiny-skia&quot;&gt;Tiny Skia&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;tiny-skia&#x2F;pull&#x2F;146&quot;&gt;tiny-skia#146&lt;&#x2F;a&gt;: Added &lt;code&gt;scale_by&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;scale_to&lt;&#x2F;code&gt; methods to &lt;code&gt;Size&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;simplecss&quot;&gt;SimpleCSS&lt;&#x2F;h2&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;simplecss&#x2F;releases&#x2F;tag&#x2F;v0.2.2&quot;&gt;SimpleCSS 0.2.2&lt;&#x2F;a&gt; with &lt;code&gt;no_std&lt;&#x2F;code&gt; support, updated docs clarifying Linebender involvement, and to test run the publishing workflow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;research-and-future-directions&quot;&gt;Research and Future Directions&lt;&#x2F;h2&gt;
&lt;p&gt;Linebender has an origin story in being a very research oriented group, looking to break new ground.
While we are focused on shipping code today, we still have an eye on the future and how to be prepared for the new opportunities and technologies that are coming.&lt;&#x2F;p&gt;
&lt;p&gt;While Vello has unmatched rendering speed thanks to its GPU-driven architecture, there are two practical tradeoffs: it can require unpredictable amounts of memory, and it doesn&#x27;t work on downlevel GPUs with weak or nonexistent support for compute shaders.
Raph Levien has been exploring a possible hybrid CPU&#x2F;GPU direction for Vello to address these issues.
Read the &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;document&#x2F;d&#x2F;1gEqf7ehTzd89Djf_VpkL0B_Fb15e0w5fuv_UzyacAPU&#x2F;edit?usp=sharing&quot;&gt;design doc&lt;&#x2F;a&gt;, follow the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-gpu&#x2F;topic&#x2F;Potato.20-.20a.20paper.20design.20for.20a.20CPU.2FGPU.20hybrid.20renderer&quot;&gt;Zulip thread&lt;&#x2F;a&gt;, or stay tuned for more developments.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in December 2024</title>
        <published>2025-01-13T00:00:00+00:00</published>
        <updated>2025-01-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            Bruce Mitchener
          </name>
        </author>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-12/"/>
        <id>https://linebender.org/blog/tmil-12/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-12/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;d like to wish everyone a happy New Year!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;peniko&quot;&gt;Peniko&lt;&#x2F;h2&gt;
&lt;p&gt;Peniko provides a set of shared types for concepts that are important for drawing&#x2F;stroking paths, but excluding the path geometry itself (which can be found in kurbo).
It includes types for brush styles (including gradient) and color.&lt;&#x2F;p&gt;
&lt;p&gt;Last month, we continued down the path to supporting a richer color model and wider gamuts.
We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;Peniko 0.3.0&lt;&#x2F;a&gt; which replaces the old color code with our new &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; crate.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;63&quot;&gt;peniko#63&lt;&#x2F;a&gt;: Use the Color crate&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;71&quot;&gt;peniko#71&lt;&#x2F;a&gt;: &lt;code&gt;Gradient&lt;&#x2F;code&gt; now tracks a hue direction and interpolation color space&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;peniko&#x2F;pull&#x2F;77&quot;&gt;peniko#77&lt;&#x2F;a&gt;: Add x&#x2F;y extend modes and quality hint to images&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;color&quot;&gt;Color&lt;&#x2F;h2&gt;
&lt;p&gt;Color provides functionality for representing, converting, parsing, serializing, and manipulating colors in a variety of color spaces.
It closely follows the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;css-color-4&#x2F;&quot;&gt;CSS Color Module Level 4&lt;&#x2F;a&gt; draft spec.&lt;&#x2F;p&gt;
&lt;p&gt;Last month, we released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;releases&#x2F;tag&#x2F;v0.2.0&quot;&gt;Color 0.2.0&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;releases&#x2F;tag&#x2F;v0.2.1&quot;&gt;Color 0.2.1&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The release of Color 0.2.0 contained a significant amount of work to enable use with Peniko and the rest of the Linebender stack.&lt;&#x2F;p&gt;
&lt;p&gt;Color 0.2.1 included improvements to parsing.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;109&quot;&gt;color#109&lt;&#x2F;a&gt;: Make color parsing case insensitive&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;color&#x2F;pull&#x2F;111&quot;&gt;color#111&lt;&#x2F;a&gt;: Add &lt;code&gt;FromStr&lt;&#x2F;code&gt; impl for &lt;code&gt;AlphaColor&lt;&#x2F;code&gt;, &lt;code&gt;DynamicColor&lt;&#x2F;code&gt;, &lt;code&gt;OpaqueColor&lt;&#x2F;code&gt;, and &lt;code&gt;PremulColor&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We encourage people to give &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;&quot;&gt;Color&lt;&#x2F;a&gt; a try and let us know how it goes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;p&gt;Vello is now using the new Peniko 0.3 release along with the Color crate.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;757&quot;&gt;vello#757&lt;&#x2F;a&gt;: Remove &lt;code&gt;buffer_labels&lt;&#x2F;code&gt; feature as it is no longer optional&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;761&quot;&gt;vello#761&lt;&#x2F;a&gt;: Remove work-around for &lt;code&gt;const&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;let&lt;&#x2F;code&gt; globals in WGSL&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;768&quot;&gt;vello#768&lt;&#x2F;a&gt;: Migrate to notify-debouncer-full&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;774&quot;&gt;vello#774&lt;&#x2F;a&gt;: Initialize wgpu &lt;code&gt;InstanceDescriptor&lt;&#x2F;code&gt; from environment&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;193&quot;&gt;parley#193&lt;&#x2F;a&gt;: Added snapshot tests for text selection areas and cursor positioning&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;192&quot;&gt;parley#192&lt;&#x2F;a&gt;: Changed the &lt;code&gt;PlainEditor&lt;&#x2F;code&gt; abstraction to reduce unneeded work&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;224&quot;&gt;parley#224&lt;&#x2F;a&gt;: Exports the text selection area, ensuring that input selection boxes don&#x27;t overlap content&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;227&quot;&gt;parley#227&lt;&#x2F;a&gt;: Adds infrastructure for easy to understand tests for text editing functionality&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kompari&quot;&gt;Kompari&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&quot;&gt;Kompari&lt;&#x2F;a&gt; is a tool for visual inspection of snapshot tests.
This project is a new addition to Linebender, generously contributed by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;spirali&quot;&gt;Ada Böhm&lt;&#x2F;a&gt; and is currently in pre-alpha.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;kompari.png&quot; alt=&quot;A screenshot of a web page, titled &#x27;Kompari Report&#x27;. The report has a section called &#x27;test1.png&#x27;, which shows that two images of the text &#x27;Linebender&#x27; have 2482 different pixels. An image displaying which pixels are different is next to these.&quot; height=&quot;1040&quot; width=&quot;2364&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;A report for snapshot test, generated by Kompari.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We plan for Kompari to standardise and improve the developer experience of snapshot tests in Linebender (and beyond).
It can generate reports which summarises failed snapshot tests, and will also contain functionality for interactive blessing of new snapshots.
This reporting can be integrated into a repository as an xtask:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span&gt; xtask report
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Kompari also includes a standalone CLI, for projects which don&#x27;t use the xtask pattern or are trialling Kompari.&lt;&#x2F;p&gt;
&lt;p&gt;In December, we added initial functionality and established CI in the repository.
Ongoing work includes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;12&quot;&gt;kompari#12&lt;&#x2F;a&gt;: Refactoring the project to make it more modular&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kompari&#x2F;pull&#x2F;13&quot;&gt;kompari#13&lt;&#x2F;a&gt;: Interactive test blessing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.&lt;&#x2F;p&gt;
&lt;p&gt;Updates to Parley integration and usage for IME and text editing:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;766&quot;&gt;xilem#766&lt;&#x2F;a&gt;: Update to upstream unbatched PlainEditor&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;767&quot;&gt;xilem#767&lt;&#x2F;a&gt;: Stop IME just before shutting down&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;768&quot;&gt;xilem#768&lt;&#x2F;a&gt;: Clear compose in &lt;code&gt;TextArea::reset_text&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;785&quot;&gt;xilem#785&lt;&#x2F;a&gt;: Improve IME area reporting and set IME area in &lt;code&gt;TextArea&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The new tree arena landed and saw some performance improvements:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;752&quot;&gt;xilem#752&lt;&#x2F;a&gt;: Tree arena&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;772&quot;&gt;xilem#772&lt;&#x2F;a&gt;: Use hashmap to track tree arena node children&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;774&quot;&gt;xilem#774&lt;&#x2F;a&gt;: Use &lt;code&gt;hashbrown&lt;&#x2F;code&gt; as drop-in replacement to optimize tree access&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We updated to start using the Color crate:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;798&quot;&gt;xilem#798&lt;&#x2F;a&gt;: Update to git Parley and Vello (uses Color)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;800&quot;&gt;xilem#800&lt;&#x2F;a&gt;: Use &lt;code&gt;palette&lt;&#x2F;code&gt; and &lt;code&gt;Color&lt;&#x2F;code&gt; from top level Masonry and Xilem&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Miscellaneous:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;777&quot;&gt;xilem#777&lt;&#x2F;a&gt;: Render one frame before showing the window to avoid flashing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;795&quot;&gt;xilem#795&lt;&#x2F;a&gt;: Sized Box: Use a brush for the border&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;797&quot;&gt;xilem#797&lt;&#x2F;a&gt;: The text colour and other properties inside buttons can now be customised&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;research-and-future-directions&quot;&gt;Research and Future Directions&lt;&#x2F;h2&gt;
&lt;p&gt;Linebender has an origin story in being a very research oriented group, looking to break new ground.
While we are focused on shipping code today, we still have an eye on the future and how to be prepared for the new opportunities and technologies that are coming.&lt;&#x2F;p&gt;
&lt;p&gt;We have a couple of active and ongoing research projects:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Raph Levien on SIMD, stroke expansion, and new rendering approaches for Vello.&lt;&#x2F;li&gt;
&lt;li&gt;Joe Neeman on boolean path operations.&lt;&#x2F;li&gt;
&lt;li&gt;A potential revival of the Piet project, &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-gpu&#x2F;topic&#x2F;Low-level.20Piet&quot;&gt;discussed on Zulip&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in November 2024: color!</title>
        <published>2024-12-18T00:00:00+00:00</published>
        <updated>2024-12-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            Bruce Mitchener
          </name>
        </author>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-11/"/>
        <id>https://linebender.org/blog/tmil-11/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-11/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This month&#x27;s update contains some surprises, even to us!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;color&quot;&gt;Color&lt;&#x2F;h2&gt;
&lt;p&gt;When we published the update for &lt;a href=&quot;&#x2F;blog&#x2F;tmix-10&#x2F;&quot;&gt;October, 2024&lt;&#x2F;a&gt;, we had already been discussing starting a new color-focused crate, but hadn&#x27;t yet created a repository.&lt;&#x2F;p&gt;
&lt;p&gt;We may have a dedicated blog post about the &lt;code&gt;color&lt;&#x2F;code&gt; crate in the future and laying out some of the motivations, but we&#x27;ll go over it a bit here.&lt;&#x2F;p&gt;
&lt;p&gt;Linebender, among other things, believes in helping build solid foundations for people building user interfaces and working in graphics, in the Rust programming language (and on GPUs).
Upon seeing a problem, we prefer to produce a focused crate that solves that problem and that can be used by others within the Rust ecosystem.
Color is one such area.
It is much harder than it may appear at first, with many complicating factors like what should be done by a basic color struct, what color spaces to support, and whether or not to support color formats used in print (like CMYK).&lt;&#x2F;p&gt;
&lt;p&gt;We looked around at a wide variety of crates in various stages of maintenance and development, their feature sets, the &quot;weight&quot; of those crates, and how closely they fit in with what we would need in Vello, Tiny Skia, Resvg, SVG Types, Masonry, and Xilem.
We decided to do a crate based on the &lt;a href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;css-color-4&#x2F;&quot;&gt;CSS Color Module Level 4&lt;&#x2F;a&gt; draft specification, with support for a limited number of additional color spaces.&lt;&#x2F;p&gt;
&lt;p&gt;We released an alpha of this new crate as &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;color&#x2F;0.1.0&#x2F;color&#x2F;&quot;&gt;Color 0.1.0&lt;&#x2F;a&gt; on November 21, 2024.
The documentation lays out more of the scope, goals, and main types provided by the crate.&lt;&#x2F;p&gt;
&lt;style&gt;
div.gradient-demo { height: 50px }
#browser { background: linear-gradient(to right in oklab, lime, blue) }
#ours { background: linear-gradient(to right, color(srgb 0 1 0) 0%, color(srgb -0.22411254 0.92055106 0.4044056) 12.5%, color(srgb -0.28811926 0.8390731 0.5539247) 25%, color(srgb -0.31709152 0.66550463 0.7479822) 50%, color(srgb -0.26123333 0.45950305 0.88687235) 75%, color(srgb -0.19183734 0.3212008 0.94574267) 87.5%, color(srgb 0 0 1) 100%) }
&lt;&#x2F;style&gt;
&lt;figure&gt;
&lt;div class=&#x27;gradient-demo&#x27; id=&#x27;ours&#x27;&gt;&lt;&#x2F;div&gt;
&lt;figcaption&gt;
&lt;p&gt;Color can convert gradients between color spaces.
This is a gradient from &quot;lime&quot; to &quot;blue&quot; in the Oklab color space, converted to sRGB by Color.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
&lt;div class=&#x27;gradient-demo&#x27; id=&#x27;browser&#x27;&gt;&lt;&#x2F;div&gt;
&lt;figcaption&gt;
&lt;p&gt;This is a gradient from &quot;lime&quot; to &quot;blue&quot; in Oklab, as generated by your browser.
This is the reference for the above gradient, and should appear identical.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Since then, we have begun the work of making Peniko and Vello use the Color crate and improving it to support that usage.
Early next year, we hope to use it within SVG Types, Resvg, and Tiny Skia.&lt;&#x2F;p&gt;
&lt;p&gt;We will be publishing a 0.2.0 release within the next month and encourage people to give it a try.
The 0.2.0 release will include the (non-CSS 4) color space ACEScg, as well as things that we found useful when using Color in Peniko and Vello.&lt;&#x2F;p&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;brendanzab&quot;&gt;Brendan Zabarauskas&lt;&#x2F;a&gt; for working with us to transfer his &lt;code&gt;color&lt;&#x2F;code&gt; crate name for our use.
His original crate was published as 0.0.1 on November 21, 2014, motivating us ten years later to ship our 0.1.0 on November 21, 2024.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;re very excited about the future of this crate and look forward to talking to other people within the Rust ecosystem about using it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.&lt;&#x2F;p&gt;
&lt;p&gt;The majority of changes in November were made in the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmil-11&#x2F;#masonry&quot;&gt;widget layer&lt;&#x2F;a&gt;, which has its own section.
This month only had small updates otherwise:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;742&quot;&gt;xilem#742&lt;&#x2F;a&gt;: Made all built-in &lt;code&gt;View&lt;&#x2F;code&gt; types &lt;code&gt;#[must_use]&lt;&#x2F;code&gt;, improving error reporting in cases where views could be silently ignored.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;732&quot;&gt;xilem#732&lt;&#x2F;a&gt;: Implemented &lt;code&gt;View&lt;&#x2F;code&gt; for &lt;code&gt;Rc&amp;lt;impl View&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Work on Xilem web has been continuing well:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;731&quot;&gt;xilem#731&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;734&quot;&gt;xilem#734&lt;&#x2F;a&gt;: Added an example using our SVG support for drawing, called &lt;code&gt;svgdraw&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;749&quot;&gt;xilem#749&lt;&#x2F;a&gt;: Experimentally increased support for custom view context types.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;670&quot;&gt;xilem#670&lt;&#x2F;a&gt;: Added some features needed for custom client side decorations, by Marco Melorio.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;735&quot;&gt;xilem#735&lt;&#x2F;a&gt;: Viktor Strate Kløvedal made several widget properties publicly accessible.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;736&quot;&gt;xilem#736&lt;&#x2F;a&gt;: Added a padding property to &lt;code&gt;SizedBox&lt;&#x2F;code&gt;. This PR also exposed this property to Xilem.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;754&quot;&gt;xilem#754&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;755&quot;&gt;xilem#755&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;762&quot;&gt;xilem#762&lt;&#x2F;a&gt;: Refactored Masonry&#x27;s text support to reduce internal duplication and validate previously mentioned changes in Parley.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Daniel&#x27;s talk &lt;em&gt;Masonry: An Imperative Widget toolkit in Rust&lt;&#x2F;em&gt; for GOSIM China 2024, was also published &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;99zU4bU4kP8&quot;&gt;on YouTube&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;!-- TODO: Do we want to&#x2F;could we embed the video? --&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;735&quot;&gt;vello#735&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;743&quot;&gt;vello#743&lt;&#x2F;a&gt;: Update to wgpu 23.0.1, matching what is used by Bevy 0.15.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;722&quot;&gt;vello#722&lt;&#x2F;a&gt;: Improving image sampling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;740&quot;&gt;vello#740&lt;&#x2F;a&gt;: Correcting support for PNG glyphs in fonts, important for emoji on macOS.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.
In November, the main updates were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;158&quot;&gt;parley#158&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;160&quot;&gt;parley#160&lt;&#x2F;a&gt;: Worked towards &lt;code&gt;no_std&lt;&#x2F;code&gt;. Full &lt;code&gt;no_std&lt;&#x2F;code&gt; is currently blocked (only) on the release of a dependency.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;154&quot;&gt;parley#154&lt;&#x2F;a&gt;: &lt;code&gt;PlainEditor&lt;&#x2F;code&gt; was significantly refactored to have a more ergonomic and efficient API.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;166&quot;&gt;parley#166&lt;&#x2F;a&gt;: AccessKit support was integrated directly into Parley. This was previous possible externally, but the external integration is much simpler.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;152&quot;&gt;parley#152&lt;&#x2F;a&gt;: Cursor blinking was added to the editor example by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tannal&quot;&gt;tannal&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;182&quot;&gt;parley#182&lt;&#x2F;a&gt;: Font fallback on misconfigured Linux systems was resolved by Richard Hozák.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;173&quot;&gt;parley#173&lt;&#x2F;a&gt;: Ada Böhm added snapshot testing, which will significantly improve our confidence in future changes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;170&quot;&gt;parley#170&lt;&#x2F;a&gt;: Significantly simplified the cursor model, which resolved several longstanding issues in text editing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Kaur also made several improvements to our CI, in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;156&quot;&gt;parley#156&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;171&quot;&gt;parley#171&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;184&quot;&gt;parley#184&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kurbo&quot;&gt;Kurbo&lt;&#x2F;h2&gt;
&lt;p&gt;Kurbo has seen some minor updates within the last month and we&#x27;re planning to publish them in a minor patch release within the next month.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;390&quot;&gt;kurbo#390&lt;&#x2F;a&gt; Reduce number of operations in &lt;code&gt;Triangle::circumscribed_circle&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;kurbo&#x2F;pull&#x2F;399&quot;&gt;kurbo#399&lt;&#x2F;a&gt; Implement &lt;code&gt;Sum&lt;&#x2F;code&gt; for &lt;code&gt;Vec2&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;peniko&quot;&gt;Peniko&lt;&#x2F;h2&gt;
&lt;p&gt;We&#x27;ve been working towards a big release, which will remove the old &lt;code&gt;peniko::Color&lt;&#x2F;code&gt; type and use the new &lt;code&gt;color&lt;&#x2F;code&gt; crate instead.
This release will be the start of a path towards wider color gamut support throughout the Linebender ecosystem.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;piet&quot;&gt;Piet&lt;&#x2F;h2&gt;
&lt;p&gt;While there were no code changes, we did begin a discussion about a possible major revision to Piet and what a next-generation Piet might look like.&lt;&#x2F;p&gt;
&lt;p&gt;Something great about Piet was the idea that with a single rendering API, you could target multiple back-ends, mostly ones that were platform specific, but also SVG.
With the advent of Vello, this was left behind, with a focus on making Vello work.
Also, many things that used to be part of Piet are now separate crates, like Peniko, Parley, and Color.
These new crates exceed the capabilities that were present in Piet.&lt;&#x2F;p&gt;
&lt;p&gt;Nico Burns started a discussion about this that took off in our Zulip, &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-gpu&#x2F;topic&#x2F;Low-level.20Piet&quot;&gt;Low-level Piet&lt;&#x2F;a&gt;.
We look forward to continuing to discuss this topic over the coming months.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tiny-skia-resvg-simplecss-svg-types&quot;&gt;Tiny Skia, Resvg, SimpleCSS, SVG Types&lt;&#x2F;h2&gt;
&lt;p&gt;In the last month, we have made progress on converting the SimpleCSS and SVG Types projects over to using the Linebender CI infrastructure.&lt;&#x2F;p&gt;
&lt;p&gt;The re-licensing of the code within the Resvg repository has been completed and is now under the &quot;Apache-2.0 OR MIT&quot; license pair.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, a couple of exciting improvements have landed in the Resvg repository:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;843&quot;&gt;resvg#843&lt;&#x2F;a&gt;: Add support for the &lt;code&gt;!important&lt;&#x2F;code&gt; attribute.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;850&quot;&gt;resvg#850&lt;&#x2F;a&gt;: Add support for embedded luma JPEG images.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;velato-vello-svg&quot;&gt;Velato, Vello SVG&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&#x2F;releases&#x2F;tag&#x2F;v0.4.0&quot;&gt;Velato 0.4.0&lt;&#x2F;a&gt; was released, updating it to use Vello 0.3.
Additionally, 0.3.1 was released which correctly implemented non-linear easing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello_svg&#x2F;releases&#x2F;tag&#x2F;v0.5.0&quot;&gt;Vello SVG 0.5.0&lt;&#x2F;a&gt; was released, updating it to use &lt;code&gt;usvg&lt;&#x2F;code&gt; 0.44.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;research-and-future-directions&quot;&gt;Research and Future Directions&lt;&#x2F;h2&gt;
&lt;p&gt;Linebender has an origin story in being a very research oriented group, looking to break new ground.
While we are focused on shipping code today, we still have an eye on the future and how to be prepared for the new opportunities and technologies that are coming.
This can be seen in our thinking about the future of Piet as previously discussed as well as the work that we&#x27;re doing with Color.&lt;&#x2F;p&gt;
&lt;p&gt;We have a couple of active and ongoing research projects:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Raph Levien on new rendering approaches for Vello.&lt;&#x2F;li&gt;
&lt;li&gt;Joe Neeman on boolean path operations.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;November also saw the transition of the Slang shader language from Nvidia to Khronos.
We don&#x27;t have any immediate plans to adopt Slang in Vello (we&#x27;re already pretty busy!), but we are looking at Slang and thinking about how we can best make use of it to improve the usefulness of our crates.
We&#x27;d love to &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-gpu&quot;&gt;talk&lt;&#x2F;a&gt; to people who are adopting Slang within the Rust ecosystem or interested in publishing Slang code for wider use.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved&lt;&#x2F;h2&gt;
&lt;p&gt;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.&lt;&#x2F;p&gt;
&lt;p&gt;We host an hour long office hours meeting each week where we discuss what&#x27;s going on in our projects.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;359642-office-hours&quot;&gt;#office hours in Zulip&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Linebender in October 2024: resvg stewardship</title>
        <published>2024-11-04T00:00:00+00:00</published>
        <updated>2024-11-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Bruce Mitchener
          </name>
        </author>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-10/"/>
        <id>https://linebender.org/blog/tmix-10/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-10/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This month&#x27;s update is very significant, featuring several crate releases and the adoption of resvg.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resvg-tiny-skia-and-related-projects&quot;&gt;Resvg, Tiny-Skia, and Related Projects&lt;&#x2F;h2&gt;
&lt;p&gt;We would like to thank &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;RazrFalcon&quot;&gt;Yevhenii Reizner (RazrFalcon)&lt;&#x2F;a&gt; for all his work on resvg, tiny-skia, and related projects.
Due to some changes in his personal circumstances, he has to give up working on his collection of excellent crates and he has been seeking new homes for them to help keep the lights on.
The following projects are now part of Linebender:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&quot;&gt;resvg&lt;&#x2F;a&gt; - an SVG rendering library, including &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;usvg&quot;&gt;usvg&lt;&#x2F;a&gt;;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;tiny-skia&quot;&gt;tiny-skia&lt;&#x2F;a&gt; - a skia subset ported to Rust.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These crates are widely used within the ecosystem and play an important role in many software projects, and not just in Rust!
Given that Linebender has a mission to provide high quality libraries for GUI and we have established processes for managing those libraries, we feel well positioned to step in and help out.
Several associated repositories and projects are also now part of Linebender.
These are &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;simplecss&quot;&gt;simplecss&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;svgtypes&quot;&gt;svgtypes&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg-test-suite&quot;&gt;resvg-test-suite&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We do not expect this change to significantly impact current users of &lt;code&gt;resvg&lt;&#x2F;code&gt;, &lt;code&gt;usvg&lt;&#x2F;code&gt;, or &lt;code&gt;tiny-skia&lt;&#x2F;code&gt;.
Our role is a stewardship role, to allow updates to continue as needed by the community.
If things work for you now, they will continue to work for you going forward.&lt;&#x2F;p&gt;
&lt;p&gt;Our plans for the near future are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Integrate with existing Linebender &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;5&quot;&gt;practices for CI&lt;&#x2F;a&gt;, testing, and releases.&lt;&#x2F;li&gt;
&lt;li&gt;Review and respond to incoming pull requests and issues.&lt;&#x2F;li&gt;
&lt;li&gt;Re-license the &lt;code&gt;resvg&lt;&#x2F;code&gt; repository (including both &lt;code&gt;resvg&lt;&#x2F;code&gt; and &lt;code&gt;usvg&lt;&#x2F;code&gt;) from the MPL-2.0 license to a dual Apache 2.0 &#x2F; MIT license as is common within the Rust world and the standard for Linebender projects.&lt;&#x2F;li&gt;
&lt;li&gt;Provide new releases as needed, working with the community to bring additional maintainers.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In the longer term, we will look at how the ecosystem is evolving and what’s needed or useful.
The Linebender team has deep expertise in 2D rendering, including vector graphics, color and text layout, shaping, and rendering.
We look forward to seeing how we can apply this to these projects.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;relicensing&quot;&gt;Relicensing&lt;&#x2F;h3&gt;
&lt;p&gt;We’ve already begun the process of re-licensing the &lt;code&gt;resvg&lt;&#x2F;code&gt; repository and are nearly done.
The change of license will be present in the next release, which will also be our first release under the Linebender umbrella.
This will allow us to share code between the Linebender crates more easily.&lt;&#x2F;p&gt;
&lt;p&gt;This process can be followed at &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;resvg&#x2F;pull&#x2F;838&quot;&gt;resvg#838&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;help-wanted&quot;&gt;Help Wanted&lt;&#x2F;h3&gt;
&lt;p&gt;We welcome pull requests and issues.&lt;&#x2F;p&gt;
&lt;p&gt;Also, with RazrFalcon becoming less involved, we’re losing a key source of knowledge about the code itself as well as the philosophy behind it.
We look forward to hearing from people who use the various crates to understand how you use it, what you use it for, and what you’d like to see.&lt;&#x2F;p&gt;
&lt;p&gt;For further discussion, please use the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;465085-resvg&quot;&gt;resvg channel on the Zulip&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Alongside the work on resvg, we have been continuing work on our existing projects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;681&quot;&gt;xilem#681&lt;&#x2F;a&gt;: &lt;code&gt;View::rebuild&lt;&#x2F;code&gt; was updated to reflect the ability to use reborrowing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;669&quot;&gt;xilem#669&lt;&#x2F;a&gt;: The font weight for &lt;code&gt;label&lt;&#x2F;code&gt;s was exposed, by Marco Melorio.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Work on Xilem Web continues.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;632&quot;&gt;xilem#632&lt;&#x2F;a&gt;: Starts a Masonry book, including a guide on creating a To-Do List app.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;7&quot;&gt;rfcs#7&lt;&#x2F;a&gt;: The pass specification RFC has been fully implemented, and the RFC has been merged.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;705&quot;&gt;xilem#705&lt;&#x2F;a&gt;: Moved methods for mutating widgets to free functions.
&lt;ul&gt;
&lt;li&gt;This decreases ergonomics in favour of increasing uniformity between Masonry and crates which create their own widgets.&lt;&#x2F;li&gt;
&lt;li&gt;This change is intended to improve rustdoc output, and the ergonomics should be restored once Rust has Arbitrary Self Types V2.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;615&quot;&gt;xilem#615&lt;&#x2F;a&gt;: Our accessibility for text has been greatly improved, allowing by-character and by-word movement through accessibility tools.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;660&quot;&gt;xilem#660&lt;&#x2F;a&gt;: &lt;code&gt;request_paint&lt;&#x2F;code&gt; has been removed in favour of a new &lt;code&gt;request_render&lt;&#x2F;code&gt;, so that accessibility updates are less likely to be missed.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;718&quot;&gt;xilem#718&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;720&quot;&gt;xilem#720&lt;&#x2F;a&gt;: restored the ability to embed Masonry in external projects by re-exporting required items.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;612&quot;&gt;xilem#612&lt;&#x2F;a&gt;: A built-in feature-gated integration with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wolfpld&#x2F;tracy&quot;&gt;Tracy&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Daniel also provided a talk to &lt;a href=&quot;https:&#x2F;&#x2F;china2024.gosim.org&#x2F;&quot;&gt;GOSIM China 2024&lt;&#x2F;a&gt; about Masonry.
The recording of this presentation is not yet available.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;masonry-tracy.png&quot; alt=&quot;A tracing view of a single frame in Masonry. There are high-level spans with details underneath, and GPU operations are shown.&quot; height=&quot;613&quot; width=&quot;1275&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Masonry now has built-in support for tracing using Tracy, using the &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;tracing-tracy&quot;&gt;tracing-tracy&lt;&#x2F;a&gt; crate.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;p&gt;The main update is the release of version &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;0.3.0&lt;&#x2F;a&gt;.
This release includes previously discussed support for emoji and blurred rounded rectangles.
We also now no longer consider Vello to be experimental, and so would encourage you to try Vello for your projects.
Raph has been working on Sparse Strip Path rendering; progress can be followed &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;197075-gpu&#x2F;topic&#x2F;Sparse.20strip.20path.20rendering&quot;&gt;in the Zulip thread&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We do still have several known issues, but are not aware of any issues which would block wider adoption.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;floem-todo-list.png&quot; alt=&quot;A to-do list desktop app, in a vertical layout: Use Floem, unchecked; Create more TODOs, checked; Join the Linebender Zulip, unchecked. There is a button labelled &#x27;New To-Do&#x27;.&quot; height=&quot;367&quot; width=&quot;784&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Vello is now supported as a renderer for the external &lt;a href=&quot;https:&#x2F;&#x2F;lap.dev&#x2F;floem&#x2F;&quot;&gt;Floem&lt;&#x2F;a&gt; project, developed for the Lapce editor.
Note that Lapce does not currently itself use Vello.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;releases&#x2F;tag&#x2F;v0.2.0&quot;&gt;Parley 0.2.0&lt;&#x2F;a&gt;.
This includes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;126&quot;&gt;parley#126&lt;&#x2F;a&gt;: A new abstraction for text editing operations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;129&quot;&gt;parley#129&lt;&#x2F;a&gt;: Ergonomics improvements for style properties.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;76&quot;&gt;parley#76&lt;&#x2F;a&gt;: A tree-style layout builder, useful for building up a text section (e.g. between elements).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We have also done some follow up work, including:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;143&quot;&gt;parley#143&lt;&#x2F;a&gt;: Support for shortcutting drawing work if rendering has not changed.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;152&quot;&gt;parley#152&lt;&#x2F;a&gt; (in progress): An example showing cursor blinking, by tannal.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;piet&quot;&gt;Piet&lt;&#x2F;h2&gt;
&lt;p&gt;Piet is a 2d graphics library which abstracts over platform-native graphics APIs.
Linebender is focused on &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;tmix-10&#x2F;#vello&quot;&gt;Vello&lt;&#x2F;a&gt; rather than Piet for performance reasons, but some users may find Piet useful, as it relies on more mature renderers and is more compatible with older platforms.
During October, we released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;piet&#x2F;releases&#x2F;tag&#x2F;v0.7.0&quot;&gt;Piet 0.7.0&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Some key updates from October included in this release are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;piet&#x2F;pull&#x2F;572&quot;&gt;piet#572&lt;&#x2F;a&gt;: Use of &lt;code&gt;Arc&lt;&#x2F;code&gt; over &lt;code&gt;Rc&lt;&#x2F;code&gt; for stroke dashing, by anesthetice.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;piet&#x2F;pull&#x2F;585&quot;&gt;piet#585&lt;&#x2F;a&gt;: An update to the Rust 2018 edition, from Bruce Mitchener.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;piet&#x2F;pull&#x2F;578&quot;&gt;piet#578&lt;&#x2F;a&gt;: Improved robustness of &lt;code&gt;copy_raw_pixels&lt;&#x2F;code&gt; on Direct2D by Kaur Kuut.&lt;&#x2F;li&gt;
&lt;li&gt;Many dependency updates.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;druid&quot;&gt;Druid&lt;&#x2F;h2&gt;
&lt;p&gt;Druid is a GUI library which was a predecessor to Xilem, and an ancestor of Masonry.&lt;&#x2F;p&gt;
&lt;p&gt;We are in the process of relicensing Druid from its current license of Apache 2.0 only to the Rust ecosystem standard Apache 2.0 OR MIT dual license.
If you have previously contributed to Druid, please read and respond to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;druid&#x2F;pull&#x2F;2414&quot;&gt;druid#2414&lt;&#x2F;a&gt;.
This will greatly improve cross-compatibility with the rest of the Rust ecosystem, particularly for adapting code from Druid into newer toolkits.
We plan to archive the Druid repo after one more release, as we are not actively developing it; we are working to bring Xilem to parity in capability.
We will also apply this license change to Xilem and Masonry, as well as Glazier, which is currently archived.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;others&quot;&gt;Others&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Linebender, September 2024</title>
        <published>2024-10-15T00:00:00+00:00</published>
        <updated>2024-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Olivier Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmil-09/"/>
        <id>https://linebender.org/blog/tmil-09/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmil-09/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;img style=&quot;height: auto; margin: 0 auto&quot; src=&quot;..&#x2F;..&#x2F;linebender.svg&quot; alt=&quot;Linebender logo; smoothly stroked overlapping lowercase letters, an l and a b.&quot; height=&quot;200&quot; width = &quot;200&quot;&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.
It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP cats example (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;571&quot;&gt;xilem#571&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;lens&lt;&#x2F;code&gt;, a shorthand for a common component pattern (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;587&quot;&gt;xilem#587&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;We added Views for some existing and new widgets:
&lt;ul&gt;
&lt;li&gt;Grid layout (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;570&quot;&gt;xilem#570&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Images (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;571&quot;&gt;xilem#571&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- TODO: Xilem Web seems to not have any especially relevant updates? --&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;http_cats.png&quot; alt=&quot;A list of HTTP status codes, with &#x27;Select&#x27; buttons. HTTP code 418 &#x27;I&#x27;m a teapot&#x27; is selected, with a picture of a kitten hiding in a teapot.&quot; height=&quot;962&quot; width=&quot;600&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;The HTTP cats example.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.&lt;&#x2F;p&gt;
&lt;p&gt;Our ongoing pass specification project has been largely implemented.
That work is now in a wrapping-up stage, which has allowed Olivier to work on improving the codebase&#x27;s quality in general.
Some highlights of work from September:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;515&quot;&gt;xilem#515&lt;&#x2F;a&gt;: Removes unimplemented functionality from our text handling code.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;570&quot;&gt;xilem#570&lt;&#x2F;a&gt;: An implementation of a grid layout, by Jared O&#x27;Connell.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;550&quot;&gt;xilem#550&lt;&#x2F;a&gt;: Restores scroll requests, as used by text inputs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;565&quot;&gt;xilem#565&lt;&#x2F;a&gt;: Allows widgets to implement more efficient pointer position dispatching, by new Linebender member Tom Churchman.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;580&quot;&gt;xilem#580&lt;&#x2F;a&gt;: Adds screen reader support for the textbox widget.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- No grid example, it&#x27;s not really visual. --&gt;
&lt;p&gt;Some ongoing work includes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;615&quot;&gt;xilem#615&lt;&#x2F;a&gt;: Detailed accessibility information for text input and prose widgets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;606&quot;&gt;xilem#606&lt;&#x2F;a&gt;: Custom client side decorations for Wayland, by Marco Melorio.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;605&quot;&gt;xilem#605&lt;&#x2F;a&gt;: Greater flexibility in the layout of the &lt;code&gt;Image&lt;&#x2F;code&gt; widget, by failingprovince.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;591&quot;&gt;xilem#591&lt;&#x2F;a&gt;: An SVG-like widget for absolute positioning, by Muhammad Ragib Hasin.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.&lt;&#x2F;p&gt;
&lt;p&gt;The month of september included a lot of progress towards the 0.3.0 release.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We no longer consider Vello to be experimental (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;691&quot;&gt;vello#691&lt;&#x2F;a&gt;). Please note that Vello is still an alpha, and has several known issues.&lt;&#x2F;li&gt;
&lt;li&gt;An implementation of the single pass scan described last month is being created by Thomas Smith in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;685&quot;&gt;vello#685&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
It handles text layout, mostly at the level of line breaking and resolving glyph positions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Nico Burns contributed a new way to assign layout properties in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;76&quot;&gt;parley#76&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;others&quot;&gt;Others&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, August 2024</title>
        <published>2024-09-11T00:00:00+00:00</published>
        <updated>2024-09-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-08/"/>
        <id>https://linebender.org/blog/tmix-08/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-08/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto; margin: 0 auto&quot; src=&quot;..&#x2F;..&#x2F;linebender.svg&quot; alt=&quot;Linebender logo; smoothly stroked overlapping lowercase letters, an l and a b.&quot; height=&quot;200&quot; width = &quot;200&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Linebender has a new logo, which was contributed by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;msiglreith&quot;&gt;Markus Siglreithmaier&lt;&#x2F;a&gt;.
We&#x27;re seeking feedback on Zulip in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;419691-linebender&#x2F;topic&#x2F;logo&quot;&gt;#linebender&amp;gt;logo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We integrated basic animated variable font rendering (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;507&quot;&gt;xilem#507&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Philipp Mildenberger moved us back to using &lt;code&gt;ViewMarker&lt;&#x2F;code&gt; in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;472&quot;&gt;xilem#472&lt;&#x2F;a&gt;.
This restores the ability to return &lt;code&gt;ViewSequence&lt;&#x2F;code&gt;s, by making a tradeoff to work around Rust&#x27;s faulty trait ambiguity rules.&lt;&#x2F;li&gt;
&lt;li&gt;We added Views for some existing and new widgets:
&lt;ul&gt;
&lt;li&gt;spinners, useful for showing indetermine progress (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;497&quot;&gt;xilem#497&lt;&#x2F;a&gt;);&lt;&#x2F;li&gt;
&lt;li&gt;progress bars (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;513&quot;&gt;xilem#513&lt;&#x2F;a&gt;); and&lt;&#x2F;li&gt;
&lt;li&gt;the &lt;code&gt;Portal&lt;&#x2F;code&gt; widget, which brings support for scroll areas to Xilem (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;561&quot;&gt;xilem#561&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Xilem Web is a community managed experimental DOM implementation of the Xilem pattern.
This month, the updates include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Support for returning multiple views from the main logic (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;482&quot;&gt;xilem#482&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Support for DOM templating, for efficient repeated creation of similar views (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;495&quot;&gt;xilem#495&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;stopwatch.png&quot; alt=&quot;A timer with the value &#x27;0:00:26.4&#x27; (26.4 seconds) above two buttons, reset and start. Below these are 5 laps, labelled &#x27;lap 5&#x27; to &#x27;lap 1&#x27;, each with a lap time of approximately 5 seconds and a corresponding elapsed time. This is all contained in an OS window titled &#x27;Stopwatch&#x27;.&quot; height=&quot;388&quot; width = &quot;559&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Jared O&#x27;Connell additionally contributed a stopwatch example in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;492&quot;&gt;xilem#492&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
This month has been dominated by Olivier&#x27;s implementation of pass specification (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;7&quot;&gt;rfcs#7&lt;&#x2F;a&gt;):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;512&quot;&gt;xilem#512&lt;&#x2F;a&gt;: The new compose pass, which is used to minimise redraw when scrolling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;510&quot;&gt;xilem#510&lt;&#x2F;a&gt;: Adds the mutate pass, which allows later passes to assume the tree structure is stable by limiting when tree mutation can occur.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;522&quot;&gt;xilem#522&lt;&#x2F;a&gt;: Implements paint and accessibility as passes, with follow-up by Tom Churchman in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;557&quot;&gt;xilem#557&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;488&quot;&gt;xilem#488&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;540&quot;&gt;xilem#540&lt;&#x2F;a&gt;: updated event and pointer handling, and disabled handling respectively.&lt;&#x2F;li&gt;
&lt;li&gt;In progress work includes layout in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;529&quot;&gt;xilem#529&lt;&#x2F;a&gt;, focus in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;538&quot;&gt;xilem#538&lt;&#x2F;a&gt;, animation in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;539&quot;&gt;xilem#539&lt;&#x2F;a&gt; and scroll requests in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;550&quot;&gt;xilem#550&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We also had some great community contributions, such as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Richard Dodd added a new progress Bar widget (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;513&quot;&gt;xilem#513&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Fixes for Portal scrolling, by Tom Churchman (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;563&quot;&gt;xilem#563&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;progress_bar.png&quot; alt=&quot;A horizontal progress bar which is 70% filled with blue, with white text overlaid saying 70%. Below this is a checkbox labelled &#x27;set indetermine progress&#x27;, and a button labelled &#x27;change progress&#x27;.&quot; height=&quot;129&quot; width = &quot;431&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;The progress bar widget was contributed by Richard Dodd in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;513&quot;&gt;xilem#513&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We continue to make progress on other key features.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Snapshot tests now are cross-platform and run in CI (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;233&quot;&gt;xilem#233&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Pan&#x2F;flick gestures are being developed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;562&quot;&gt;xilem#562&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Progress continues on text input for Android. This involves creating our own &lt;code&gt;Activity&lt;&#x2F;code&gt;, with support for both text input and accessibility.
This new &lt;code&gt;Activity&lt;&#x2F;code&gt; will use &lt;code&gt;SurfaceView&lt;&#x2F;code&gt; like other modern native code based activities (&lt;code&gt;GameActivity&lt;&#x2F;code&gt;, &lt;code&gt;MakepadActivity&lt;&#x2F;code&gt;, etc.), and our aim is that it won&#x27;t require a Java toolchain to build a simple application.&lt;&#x2F;li&gt;
&lt;li&gt;Progress continues on the Accessibility integration for Android. You can try this in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;575&quot;&gt;xilem#575&lt;&#x2F;a&gt;, or see it in the below video.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;IObBk40MdJs?si=GXDNRNelhVz4nTjU&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;figcaption&gt;
&lt;p&gt;The Xilem &lt;code&gt;to_do_mvc&lt;&#x2F;code&gt; example running with &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Google_TalkBack&quot;&gt;TalkBack&lt;&#x2F;a&gt; integration.
Video provided by Matt Campbell.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.
We have made some really great progress in August&lt;!-- , TODO: and are actively planning a 0.3.0 release? --&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We now support blurred rounded rectangles, contributed by Markus Siglreithmaier (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;665&quot;&gt;vello#665&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Blend stack spilling was implemented, which allows blends more than four layers deep (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;661&quot;&gt;vello#661&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Fixes for some visual artifacts in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;651&quot;&gt;vello#651&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;659&quot;&gt;vello#659&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;673&quot;&gt;vello#673&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Embedding existing wgpu textures is now supported (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;636&quot;&gt;vello#636&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;We now support bitmap glyphs (i.e. emoji), in addition to our previous COLR support (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;641&quot;&gt;vello#641&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Work has begun on sparse strips, which is tracked in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;670&quot;&gt;vello#670&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Frame pacing for Android is being investigated and developed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;674&quot;&gt;vello#674&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Thomas Smith has been doing some deep-dives into parallel scan, which is the core operation in Vello.
This work can be found in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;197075-gpu&#x2F;topic&#x2F;Progress.20for.20GPU&amp;#x27;s.20Without.20Forward.20Progress.20Guarantees&quot;&gt;#gpu&amp;gt;Progress for GPU&#x27;s Without Forward Progress Guarantees&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;rounded_rectangles.png&quot; alt=&quot;A vertically split image. On the left are three blurred shapes: a blue rectangle with rounded corners, and two black ellipses. The ellipses are partially occluded by the boundaries of the image. On the right is a web page, showing three blog post titles and summaries, each in a box with a black box shadow.&quot; height=&quot;644&quot; width = &quot;944&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Vello now supports blurred rounded rectangles, based on the maths from &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;graphics&#x2F;2020&#x2F;04&#x2F;21&#x2F;blurred-rounded-rects.html&quot;&gt;Raph&#x27;s blog&lt;&#x2F;a&gt;.
Left: Vello&#x27;s blurred rounded rectangles test scene.
Right: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DioxusLabs&#x2F;blitz&#x2F;&quot;&gt;Blitz&lt;&#x2F;a&gt;&#x27;s &lt;code&gt;servo&lt;&#x2F;code&gt; example which renders box shadows using this feature.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Primitives required for robust text editing were added in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;106&quot;&gt;parley#106&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;others&quot;&gt;Others&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Bruce Mitchener has started work on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;interpoli&#x2F;&quot;&gt;Interpoli&lt;&#x2F;a&gt;, an animation support library.&lt;&#x2F;li&gt;
&lt;li&gt;We have performed a &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024-retro&#x2F;&quot;&gt;retrospective&lt;&#x2F;a&gt; on our last roadmap.&lt;&#x2F;li&gt;
&lt;li&gt;Daniel and Olivier&#x27;s &quot;office hours&quot; appointments can still be booked by anyone for open-ended time-limited discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Retrospective on the May-July roadmap</title>
        <published>2024-08-24T00:00:00+00:00</published>
        <updated>2024-08-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/roadmap-may-2024-retro/"/>
        <id>https://linebender.org/blog/roadmap-may-2024-retro/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/roadmap-may-2024-retro/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At the start of May, we created a &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;&quot;&gt;roadmap&lt;&#x2F;a&gt; for the following three months.
We recently went through a process of analysing how well our progress was guided by the roadmap; this report summarises those results.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello-original&quot;&gt;Vello &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#vello&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;robust-dynamic-memory-original&quot;&gt;Robust dynamic memory &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#robust-dynamic-memory&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: Experimental PR (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;606&quot;&gt;vello#606&lt;&#x2F;a&gt;), but hasn’t landed.
Work required on the CPU side API, but the GPU operations are well-understood.
This PR could not be released in its current form.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;reliable-snapshot-tests-original&quot;&gt;Reliable snapshot tests &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#reliable-snapshot-tests&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was implemented in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;610&quot;&gt;vello#610&lt;&#x2F;a&gt;.
This has already been extremely useful in our review process, as it allows changes to be validated in the files changed view.
We also implemented an experiment to use &lt;a href=&quot;https:&#x2F;&#x2F;git-lfs.com&#x2F;&quot;&gt;Git LFS&lt;&#x2F;a&gt;, which has been working really well to avoid increasing repository size.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;sparse-strips-original&quot;&gt;Sparse strips &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#sparse-strips&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: We are continuing this work, but there is no code currently available.
See &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;197075-gpu&#x2F;topic&#x2F;Sparse.20strip.20path.20rendering&quot;&gt;#gpu &amp;gt; Sparse strip path rendering&lt;&#x2F;a&gt; for details.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;add-tests-original&quot;&gt;Add tests &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#add-tests&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Medium&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This item had already been completed at the time the roadmap was written.
This was also expanded upon in.
During our retrospective meeting, we did determine some potential future expansions to testing, namely:
&lt;ul&gt;
&lt;li&gt;Running individual stages in isolation, to enable property testing (TODO: Make Vello issue).&lt;&#x2F;li&gt;
&lt;li&gt;Testing for additional platforms, such as DirectX on Windows and Android (TODO: Make Vello issue).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;vello-extras&quot;&gt;Progress beyond roadmap&lt;&#x2F;h3&gt;
&lt;p&gt;We have also landed several important features which were not part of our planned roadmap.
These include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Blending which uses more than four deep layers (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;657&quot;&gt;vello#657&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Preliminary support for embedding pre-existing &lt;code&gt;wgpu&lt;&#x2F;code&gt; textures (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;636&quot;&gt;vello#636&lt;&#x2F;a&gt;).
This was driven by user needs.
Further work in this direction is tracked in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;issues&#x2F;664&quot;&gt;vello#664&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Support for Emoji (COLRv1 in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;615&quot;&gt;vello#615&lt;&#x2F;a&gt;, bitmap in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;641&quot;&gt;vello#641&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;gpu-stroke-expansion-paper&#x2F;&quot;&gt;stroke expansion paper&lt;&#x2F;a&gt; documents a key part of Vello&#x27;s pipeline.
This was presented at ACM High Performance Graphics (HPG) 2024, placing 3rd Place in the Best Paper Award.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;masonry-original&quot;&gt;Masonry &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#masonry&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;complete-text-input-original&quot;&gt;Complete text input &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#complete-text-input&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Highest&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: Not that much progress.
This work is being continued, and indeed there has been significant progress as of the time of writing.
This is tracked in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;issues&#x2F;52&quot;&gt;parley#52&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;better-tracing-for-debugging-original&quot;&gt;Better tracing for debugging &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#better-tracing-for-debugging&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;384&quot;&gt;xilem#384&lt;&#x2F;a&gt; implements most of this, the rest is deferred.
There are known issues with the size of the log files created by default in very large apps.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;fix-glaring-documentation-problems-original&quot;&gt;Fix glaring documentation problems &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#fix-glaring-documentation-problems&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: The issues mentioned in this item were addressed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;329&quot;&gt;xilem#329&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;503&quot;&gt;xilem#503&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;finish-repository-port-original&quot;&gt;Finish repository port &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#fix-glaring-documentation-problems&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was completed.
We moved all Masonry issues into the Xilem repository, and updated all references in code to use full links.
This move was coordinated in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;419691-linebender&#x2F;topic&#x2F;Moving.20Masonry.20into.20Xilem&quot;&gt;#linebender &amp;gt; Moving Masonry into Xilem&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-widgets-in-arena-rfc-original&quot;&gt;Write “widgets in arena” RFC &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#write-widgets-in-arena-rfc&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: The RFC was &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;6&quot;&gt;rfcs#6&lt;&#x2F;a&gt;, which was mostly implemented in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;396&quot;&gt;xilem#396&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-pass-order-rfc-original&quot;&gt;Write “pass order” RFC &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#write-pass-order-rfc&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;7&quot;&gt;rfcs#7&lt;&#x2F;a&gt; is in draft, and several important parts of the RFC have been completed.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;rewrite-documentation-original&quot;&gt;Rewrite documentation &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#rewrite-documentation&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Medium&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This work has been deferred until the &quot;pass order&quot; refactor is complete, as we expect Masonry&#x27;s core to be quite stable at that point.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;improve-focus-handling-original&quot;&gt;Improve focus handling &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#improve-focus-handling&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Medium&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: Not done.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;improve-pointer-status-handling-original&quot;&gt;Improve pointer status handling &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#improve-pointer-status-handling&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Medium&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: Basic translation of touch events was added in (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;313&quot;&gt;xilem#313&lt;&#x2F;a&gt;).
This unblocked using Masonry on devices where pointer input is not expected (primarily on Android).
We have split the remainder of this task into two tasks, with a priority placed on completing the parts which unblock other work (such as scrolling on Android).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;masonry-extras&quot;&gt;Progress beyond roadmap&lt;&#x2F;h3&gt;
&lt;p&gt;Masonry is in a state of flux, however is starting to see a few exploratory users.
To unblock these users, some additional important features were added outside of the roadmap, such as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Support for embedding Masonry inside a pre-existing event loop (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;commit&#x2F;cf3530097baf0fc5c458593e215a19973572b991&quot;&gt;xilem#417&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Support for a &lt;code&gt;gap&lt;&#x2F;code&gt; property in the flexbox (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;437&quot;&gt;xilem#437&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Fixes on iOS, including &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;418&quot;&gt;xilem#418&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;421&quot;&gt;xilem#421&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;233&quot;&gt;xilem#233&lt;&#x2F;a&gt; allowed our tests to be run on CI in a consistent manner.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley-original&quot;&gt;Parley &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#parley&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;create-abstractions-for-text-selection-and-editing-original&quot;&gt;Create abstractions for text selection and editing &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#write-pass-order-rfc&quot;&gt;(original)&lt;&#x2F;a&gt; ?&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Highest&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: There have been useful discussions in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;issues&#x2F;52&quot;&gt;parley#52&lt;&#x2F;a&gt;.
Work has started on this in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;106&quot;&gt;parley#106&lt;&#x2F;a&gt; in response to this retrospective.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;inline-block-layout-original&quot;&gt;Inline block layout &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#inline-block-layout&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: A first cut of this feature was added by Nico Burns in (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;67&quot;&gt;parley#67&lt;&#x2F;a&gt;).
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;76&quot;&gt;parley#76&lt;&#x2F;a&gt; expands upon this, and has been approved in principle, but is awaiting thorough review.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-adequate-documentation-original&quot;&gt;Write adequate documentation &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#write-adequate-documentation&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: Some work was done towards this in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;26&quot;&gt;parley#26&lt;&#x2F;a&gt;, which unfortunately could not be merged.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;97&quot;&gt;parley#97&lt;&#x2F;a&gt; added some documentation to Fontique.
Further documentation work from Nico is currently blocked on the tree-like styles PR &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;76&quot;&gt;parley#76&lt;&#x2F;a&gt; being merged (to avoid conflicts).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;software-renderer-original&quot;&gt;Software renderer &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#software-renderer&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Low&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was not completed in the form envisioned.
However, Nico contributed two examples, showing how to use Parley with Swash (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;54&quot;&gt;parley#54&lt;&#x2F;a&gt;) and tiny-skia (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;55&quot;&gt;parley#55&lt;&#x2F;a&gt;).
We have decided not to carry this forward into the next roadmap.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;parley-extras&quot;&gt;Progress beyond roadmap&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;56&quot;&gt;parley#56&lt;&#x2F;a&gt; added support for Emoji, which is used with the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024-retro&#x2F;#vello-extras&quot;&gt;Vello PRs&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Recently the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;harfbuzz&#x2F;harfruzz&quot;&gt;harfruzz&lt;&#x2F;a&gt; project, a fork of rustybuzz to be integrated fully with fontations, has emerged as an extremely promising direction for text shaping for the Rust ecosystem. We plan to use it as the basis for text layout.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#xilem&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;android-bringup-original&quot;&gt;Android bringup &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#android-bringup&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Highest&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: Android is supported in several of our examples, with the primary work required for support completed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;309&quot;&gt;xilem#309&lt;&#x2F;a&gt;.
No non-boilerplate code changes are required to get a Xilem application running on Android.
Some compromises were made, in particular cargo gives an un-silencable warning for each example which supports Android and cross-platform backends.
We did reach out to the Cargo team about this use case, but did not get a positive response.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;update-repository-layout-original&quot;&gt;Update repository layout &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#update-repository-layout&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was completed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;302&quot;&gt;xilem#302&lt;&#x2F;a&gt;.
Kaur applied the same change to Vello in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;590&quot;&gt;vello#590&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;rework-core&quot;&gt;Rework xilem_core to be compatible with Masonry backend &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#rework-xilem-core-to-be-compatible-with-masonry-backend&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was completed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;310&quot;&gt;xilem#310&lt;&#x2F;a&gt;.
Philipp then applied this to Xilem Web in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;403&quot;&gt;xilem#403&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-documentation-original&quot;&gt;Write documentation &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#write-documentation&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: High&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was not completed.
The work in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;310&quot;&gt;xilem#310&lt;&#x2F;a&gt; did document some of the core, but there is very little user-facing documentation of the Xilem level.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;re-implement-async-integration-original&quot;&gt;Re-implement async integration &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#re-implement-async-integration&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Medium&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: The core of this task was completed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;423&quot;&gt;xilem#423&lt;&#x2F;a&gt; was the main implementation.
Two-way communication with the async tasks is not yet implemented&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;add-unit-tests-original&quot;&gt;Add unit tests &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#add-unit-tests&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Low&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This was not prioritised.
We have raised the priority of this item in our next roadmap.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;add-basic-benchmarks-original&quot;&gt;Add basic benchmarks &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#add-basic-benchmarks&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Low&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: There has been no progress on this item.
This will be a &quot;highest&quot; priority item in the next roadmap.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;xilem-extras&quot;&gt;Progress beyond roadmap&lt;&#x2F;h3&gt;
&lt;p&gt;Xilem has also seen some very useful changes not tracked above, including many community contributions.
Some highlights of these contributions are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Philipp Mildenberger contributed heavily to Xilem&#x27;s core design, such as by restoring the ability to return &lt;code&gt;ViewSequence&lt;&#x2F;code&gt;s by returning to a previous workaround for Rust&#x27;s overly-cautious trait solver (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;394&quot;&gt;xilem#472&lt;&#x2F;a&gt;).
He also extended the Xilem API by restoring &lt;code&gt;OneOf&lt;&#x2F;code&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;394&quot;&gt;xilem#394&lt;&#x2F;a&gt;), and implementing various &lt;code&gt;Adapt&lt;&#x2F;code&gt; nodes (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;401&quot;&gt;xilem#401&lt;&#x2F;a&gt;).
Additionally, he picked up the work to expand &lt;code&gt;Flex&lt;&#x2F;code&gt; to use the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024-retro&#x2F;#rework-core&quot;&gt;new Xilem Core&lt;&#x2F;a&gt; in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;428&quot;&gt;xilem#428&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Jared O&#x27;Connell contributed two new examples, a calculator (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;467&quot;&gt;xilem#467&lt;&#x2F;a&gt;), and a stopwatch (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;492&quot;&gt;xilem#492&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There has also been lots of really good progress on Xilem Web, but we do not roadmap Xilem Web and so we do not cover that progress here.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;accesskit-original&quot;&gt;AccessKit &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#accesskit&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Matt Campbell&#x27;s work on AccessKit has begun, and a proof-of-concept Android adapter is in progress.&lt;&#x2F;p&gt;
&lt;!-- TODO: Can we point to a PR instead? --&gt;
&lt;p&gt;At the time of writing there is not a permanent link to this work, but it can be seen in the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AccessKit&#x2F;accesskit&#x2F;tree&#x2F;android-basics&quot;&gt;android-basics&lt;&#x2F;a&gt; branch.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;android-specific-work-original&quot;&gt;Android specific work &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#android-specific-work&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;subclassing&quot;&gt;Subclassing View&#x2F;Application&#x2F;Activity &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#subclassing-view-application-activity&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Highest&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This work is in progress, and unfortunately has required more research than expected.
We spent some time investigating DEX injection, which Matt has got implemented.
However, it’s now looking like a custom Activity and View is the way forward, which requires close collaboration with upstream tools.
We are continuing to prioritise this highly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;handling-ime-original&quot;&gt;Handling IME &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#handling-ime&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Highest&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: This work is ongoing.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-windowing&#x2F;winit&#x2F;pull&#x2F;3787&quot;&gt;winit#3787&lt;&#x2F;a&gt; allows opening a virtual keyboard, however this does not integrate with full IME (so for example, it is incompatible with autocorrect).
Real IME requires the Activity to support it directly and therefore involves &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024-retro&#x2F;#subclassing&quot;&gt;content view subclassing&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;gesture-recognition-original&quot;&gt;Gesture recognition &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;#gesture-recognition&quot;&gt;(original)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt;: Low&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;&#x2F;strong&gt;: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;313&quot;&gt;xilem#313&lt;&#x2F;a&gt; added emulated mouse press and move from touches.
This unblocked use of Xilem on Android, but is not the intended final state.
The priority of detecting a scrolling gesture has been increased slightly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;&#x2F;h2&gt;
&lt;p&gt;Overall, the roadmap provided a useful guide of what to work on, and we have implemented many of the most important features from it.
One clear recurring issue is documentation - even where we have chosen to roadmap this, we have made little progress.
Similar concerns are clear for testing in Xilem, although we have laid some important groundwork there.
We firmly recognise the role of documentation as an aid to onboarding, which is becoming more important as we work towards alpha releases.
I believe that we can make good progress in this area before the end of 2024.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, July 2024</title>
        <published>2024-08-08T00:00:00+00:00</published>
        <updated>2024-08-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <author>
          <name>
            Olivier Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-07/"/>
        <id>https://linebender.org/blog/tmix-07/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-07/">&lt;p&gt;Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.org&quot;&gt;the Rust programming language&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This month saw a lot of community contributions to Linebender projects.
Philipp Mildenberger especially is a major driver for progress on Xilem and especially the &lt;code&gt;xilem_web&lt;&#x2F;code&gt; crate.
Bruce Mitchener has been very active reviewing pull requests, which is an under-appreciated but essential task for any open-source project.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is our flagship GUI project, inspired by SwiftUI.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;423&quot;&gt;xilem#423&lt;&#x2F;a&gt; integrates Tokio into Xilem, showing how the Xilem model can interact with async work.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;428&quot;&gt;xilem#428&lt;&#x2F;a&gt; by Philipp adds explicit support for Flex parameters.&lt;&#x2F;li&gt;
&lt;li&gt;Philipp ported the async work to Xilem Web, and experimented with some extensions:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;440&quot;&gt;xilem#440&lt;&#x2F;a&gt; is an experiment into async event handling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;448&quot;&gt;xilem#448&lt;&#x2F;a&gt; added the &lt;code&gt;MemoizedAwait&lt;&#x2F;code&gt; view, which runs a task whenever the input data has a new value.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;467&quot;&gt;xilem#467&lt;&#x2F;a&gt; by Jared O&#x27;Connell adds a calculator example.
This example can also be run on Android (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;474&quot;&gt;xilem#474&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;calculator_example.png&quot; alt=&quot;A calculator with display section showing the calculation 9994 + 3231 = 13225. Below this section is a grid of buttons 4 wide and 5 tall, containing the digits 0-9 and some other calculator operations.&quot; height=&quot;533&quot; width = &quot;931&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;The new &lt;code&gt;calc&lt;&#x2F;code&gt; example for Xilem.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;p&gt;Masonry is the widget system used by Xilem.
The most impactful change was the implementation of the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;blob&#x2F;main&#x2F;rfcs&#x2F;0006-widgets-in-arenas.md&quot;&gt;&quot;Widgets in arenas&quot; RFC&lt;&#x2F;a&gt; in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;396&quot;&gt;xilem#396&lt;&#x2F;a&gt;.
Widgets are now stored in a global arena, which has little impact on the public APIs but make future changes a lot easier to implement.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;417&quot;&gt;xilem#417&lt;&#x2F;a&gt; exposes an unstable API for embedding Masonry and Xilem into an existing Winit application.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;418&quot;&gt;xilem#418&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;421&quot;&gt;xilem#421&lt;&#x2F;a&gt; improved our unofficial support for iOS.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;7&quot;&gt;rfcs#7&lt;&#x2F;a&gt; specifies a clearer architecture for passes, including simplifications necessary for compositor use.
Actually integrating with the compositor is still out of scope &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;ui&#x2F;graphics&#x2F;2020&#x2F;09&#x2F;13&#x2F;compositor-is-evil.html&quot;&gt;for reasons Raph has laid out before&lt;&#x2F;a&gt;, but the new pass specification gives us a starting point when we get there.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;p&gt;Vello is our GPU vector renderer.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;gpu-stroke-expansion-paper&#x2F;&quot;&gt;GPU-friendly Stroke Expansion&lt;&#x2F;a&gt; paper has been released.
Follow the link for the outline, the full paper, demos, and a talk at the HPG 2024 conference.
Note that the interactive demo is built with &lt;code&gt;xilem_web&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.2.1&quot;&gt;Vello 0.2.1&lt;&#x2F;a&gt; has been released.
This patch version resolves a longstanding crash around empty scenes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;643&quot;&gt;vello#643&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;647&quot;&gt;vello#647&lt;&#x2F;a&gt; switch to Git LFS for storing snapshot test files.
Git LFS is an open-source Git extension supported by GitHub, that lets users commit large files to a repository without permanently bloating it.
Using it has trade-offs around bandwidth usage in CI, but otherwise matches our use-case perfectly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;stroke_expansion_demo.png&quot; alt=&quot;A screenshot containing a single bezier curve, split into several differently coloured segments. The control points of the curve are visible. The expanded stroke for this curve is shown as a filled section, with the generated line segment end points visible as small circles. There are several controls for settings of the stroke expansion above the curve.&quot; height=&quot;755&quot; width = &quot;868&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;The demo for the stroke expansion paper, which was created using Xilem Web.
An interactive version can be found on the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;gpu-stroke-expansion-paper&#x2F;#beztoy-container&quot;&gt;paper&#x27;s website&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;p&gt;Parley is a text layout library.
Nico Burns contributed quite a few improvements to Parley this month:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;67&quot;&gt;parley#67&lt;&#x2F;a&gt; implements inline box layout, which lets us mix textual and non-textual content and have the non-textual content laid out in flow with the text.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;76&quot;&gt;parley#76&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;84&quot;&gt;parley#84&lt;&#x2F;a&gt; gets style types closer to CSS engines.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;others&quot;&gt;Others&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;glazier&#x2F;&quot;&gt;The Glazier repository&lt;&#x2F;a&gt; has been archived.
This is in continuity with our direction so far, as we&#x27;ve dropped support for it and committed to building our crates on top of Winit.&lt;&#x2F;li&gt;
&lt;li&gt;We are at the end of our documented &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;&quot;&gt;May-July 2024 roadmap&lt;&#x2F;a&gt;.
We expect to do a full retrospective on it soon, including the items we shipped and those that slipped.&lt;&#x2F;li&gt;
&lt;li&gt;Daniel and Olivier are now accepting &quot;office hours&quot; style appointments, for open-ended discussion of the ecosystem.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2&quot;&gt;See Daniel&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;calendar.google.com&#x2F;calendar&#x2F;u&#x2F;0&#x2F;appointments&#x2F;schedules&#x2F;AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM&quot;&gt;See Olivier&#x27;s schedule here&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, June 2024</title>
        <published>2024-07-03T00:00:00+00:00</published>
        <updated>2024-07-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-06/"/>
        <id>https://linebender.org/blog/tmix-06/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-06/">&lt;p&gt;We released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;releases&#x2F;tag&#x2F;v0.2.0&quot;&gt;Vello 0.2.0&lt;&#x2F;a&gt; at the start of the month, which included some key improvements discussed in previous months&#x27; updates.
We also merged initial handling of Emoji (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;615&quot;&gt;vello#615&lt;&#x2F;a&gt;), which supports glyphs which use the COLR specification (Apple&#x27;s system emoji font does not use this format and so currently will not render).
In-flight work includes an enhanced testing setup (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;610&quot;&gt;vello#610&lt;&#x2F;a&gt;), GPU memory allocation robustness (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;606&quot;&gt;vello#606&lt;&#x2F;a&gt;), and improved correctness for some unusual strokes (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;607&quot;&gt;vello#607&lt;&#x2F;a&gt;).
The &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;gpu-stroke-expansion-paper&quot;&gt;GPU-Friendly Stroke Expansion&lt;&#x2F;a&gt; paper has been accepted to &lt;a href=&quot;https:&#x2F;&#x2F;www.highperformancegraphics.org&#x2F;2024&#x2F;index.html&quot;&gt;High Performance Graphics 2024&lt;&#x2F;a&gt;, and will be presented in Denver on July 26.
A revised draft of the paper is published on &lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2405.00127&quot;&gt;arXiv&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img src=&quot;Xilem Emoji Picker.png&quot; style=&quot;height: auto&quot; alt=&quot;Screenshot of an app, containing a 4x4 grid of labelled Emoji, zoom in and out buttons and pagination controls. &#x27;cat face with wry smile&#x27; is selected&quot; height=&quot;1132&quot; width = &quot;863&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;A toy Emoji viewer example (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;420&quot;&gt;xilem#420&lt;&#x2F;a&gt;) running on Android.
This example uses system fonts, so has limited platform support because of the caveat mentioned above.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;310&quot;&gt;xilem#310&lt;&#x2F;a&gt; brought in some new ideas about how Xilem Core can be structured, which enables support for specialised kinds of &lt;code&gt;View&lt;&#x2F;code&gt;, such as for window properties.
&lt;code&gt;Adapt&lt;&#x2F;code&gt; views built on this were used to create an &lt;a href=&quot;https:&#x2F;&#x2F;elm-lang.org&#x2F;&quot;&gt;Elm&lt;&#x2F;a&gt;-inspired example in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;401&quot;&gt;xilem#401&lt;&#x2F;a&gt;, showing the flexibility of the Xilem architecture.
Philipp Mildenberger has been prolific in his work on Xilem, as a co-author of the new Xilem Core, and in adapting Xilem Web to use it.
He also worked to bring support for &lt;code&gt;OneOf&lt;&#x2F;code&gt; views to Xilem Core in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;394&quot;&gt;xilem#394&lt;&#x2F;a&gt; - these were previously only supported in Xilem Web.&lt;&#x2F;p&gt;
&lt;p&gt;Masonry&#x27;s observability support has also been improved, with automatic tracing to a temporary file in debug builds added in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;384&quot;&gt;xilem#384&lt;&#x2F;a&gt;.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;396&quot;&gt;xilem#396&lt;&#x2F;a&gt; implements &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;6&quot;&gt;rfcs#6&lt;&#x2F;a&gt;, changing the architecture of Masonry to make it easier to write new features and tests.&lt;&#x2F;p&gt;
&lt;p&gt;There was also some excellent community engagement with Xilem in June.
Veniamin Ilmer has created an open source &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;veniamin-ilmer&#x2F;minesweeper_xilem&#x2F;&quot;&gt;Minesweeper game&lt;&#x2F;a&gt; using Xilem.
The discussion on Zulip (in &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;354396-xilem&#x2F;topic&#x2F;Minesweeper.20converted.20from.20Iced.20to.20Xilem&quot;&gt;#xilem &amp;gt; Minesweeper converted from Iced to Xilem&lt;&#x2F;a&gt;) has been very useful in guiding areas for improvement.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img style=&quot;height: auto&quot; src=&quot;Minesweeper.png&quot; alt=&quot;A window titled Minesweeper, with text in the top-left &#x27;Mines: 82&#x27;, a top-center button with a neutral ASCII emoticon, and a board represented by a grid of buttons 30 wide and 16 tall, where some buttons are replaced with colour labels containing digits, and some buttons contain an exclamation mark.&quot; height=&quot;589&quot; width = &quot;931&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Screenshot by Veniamin Ilmer of their Minesweeper game, used under the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;veniamin-ilmer&#x2F;minesweeper_xilem&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;Apache 2.0&lt;&#x2F;a&gt; license.&lt;&#x2F;p&gt;
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Following on from May, Olivier wrote and published a &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;rustnl-2024-unconference&#x2F;&quot;&gt;report&lt;&#x2F;a&gt; on our experience of the RustNL unconference.
This led to some useful discussion online - see &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;181284-blogging&#x2F;topic&#x2F;Draft.20-.20Report.20on.20the.20RustNL.202024.20Conference&#x2F;near&#x2F;444974910&quot;&gt;the zulip thread&lt;&#x2F;a&gt; corresponding with that post for links.
We are now in the final month of the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;roadmap-may-2024&#x2F;&quot;&gt;May-July 2024 roadmap&lt;&#x2F;a&gt;.
In the intervening time much of the work has been started or completed, although there have been some changes of priorities.
I expect that we will soon be looking at prioritising items on our &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;wiki&#x2F;long-term-roadmap&#x2F;&quot;&gt;long-term roadmap&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>#![doc = include_str!()] with intra-doc links</title>
        <published>2024-06-28T00:00:00+00:00</published>
        <updated>2024-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/doc-include/"/>
        <id>https://linebender.org/blog/doc-include/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/doc-include/">&lt;p&gt;Creating crate level documentation by &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;rustdoc&#x2F;write-documentation&#x2F;the-doc-attribute.html#the-doc-attribute&quot;&gt;including&lt;&#x2F;a&gt; your README can lower maintenance burden, as you do not need to manually keep the crate level docs synchronised.
However, when writing this documentation, you will also want to link directly to some mentioned &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;items.html&quot;&gt;items&lt;&#x2F;a&gt;.
These links need to work in all the places that the README is rendered, such as on your package&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&quot;&gt;https:&#x2F;&#x2F;crates.io&lt;&#x2F;a&gt; homepage, in addition to in rustdoc output.
To achieve this, you can link to the online documentation for the items:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;md&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-md &quot;&gt;&lt;code class=&quot;language-md&quot; data-lang=&quot;md&quot;&gt;&lt;span&gt;To get started with foobar, use the &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;`frobnicate`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;][]&lt;&#x2F;span&gt;&lt;span&gt; function.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;[`frobnicate`]: https:&#x2F;&#x2F;docs.rs&#x2F;foobar&#x2F;latest&#x2F;foobar&#x2F;fn.frobnicate.html
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This would however mean that users of &lt;code&gt;cargo doc&lt;&#x2F;code&gt; will be redirected to your crate&#x27;s online docs (as opposed to their local docs) when clicking on that link.
It is however possible to make links in included markdown files behave as intra-doc links, by adding a second link reference definition in the documentation comment.
This must be placed &lt;em&gt;before&lt;&#x2F;em&gt; the &lt;code&gt;doc = include_str!()&lt;&#x2F;code&gt; line, for example:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F;! [`frobnicate`]: frobnicate
&lt;&#x2F;span&gt;&lt;span&gt;#![&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;doc &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;include_str&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;..&#x2F;README.md&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This means that the link has the expected link target on &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&quot;&gt;https:&#x2F;&#x2F;crates.io&lt;&#x2F;a&gt; &lt;em&gt;and&lt;&#x2F;em&gt; in rustdoc (including on &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&quot;&gt;https:&#x2F;&#x2F;docs.rs&lt;&#x2F;a&gt;).
This trick works because when there are duplicate markdown link reference definitions, &lt;a href=&quot;https:&#x2F;&#x2F;spec.commonmark.org&#x2F;0.31.2&#x2F;#example-204&quot;&gt;&quot;the first one takes precedence&quot;&lt;&#x2F;a&gt;.
rustdoc sees the intra-doc link before the link to the online docs, and so uses the intra-doc link.
However, when the README is rendered standalone, only the link reference definition for the online docs is present, and so that target is used.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;example&quot;&gt;Example&lt;&#x2F;h3&gt;
&lt;p&gt;For an example of both of these techniques in action, see the Android Trace crate (&lt;code&gt;android_trace&lt;&#x2F;code&gt;).
In particular, the text of interest is: &quot;the main entry point to the library is &lt;strong&gt;AndroidTrace&lt;&#x2F;strong&gt;&quot;.
You can observe that this link goes to version 0.1.1 on the docs page, but version 0.1.0 elsewhere.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;android_trace&#x2F;blob&#x2F;v0.1.1&#x2F;android_trace&#x2F;README.md&quot;&gt;GitHub rendered readme&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;android_trace&#x2F;0.1.1&quot;&gt;crates.io page&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;android_trace&#x2F;0.1.1&#x2F;android_trace&#x2F;&quot;&gt;docs.rs page&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And the corresponding source code:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;android_trace&#x2F;blob&#x2F;v0.1.1&#x2F;android_trace&#x2F;README.md?plain=1&quot;&gt;README.md&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;android_trace&#x2F;blob&#x2F;v0.1.1&#x2F;android_trace&#x2F;src&#x2F;lib.rs&quot;&gt;lib.rs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The links have since been updated to use &lt;code&gt;latest&lt;&#x2F;code&gt;, but the direct link being to version 0.1.0 shows how this pattern works.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;getting-external-documentation-links&quot;&gt;Getting external documentation links&lt;&#x2F;h3&gt;
&lt;p&gt;rust-analyzer has an &quot;Open External Docs&quot; command when you have an item selected.
This will open the online documentation for the selected item, generally on &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&quot;&gt;https:&#x2F;&#x2F;docs.rs&lt;&#x2F;a&gt;.
This works even if the item is yet to be published, in which case it will open the URL where the item would be.
You may wish to replace the resolved version number in the URL with &lt;code&gt;latest&lt;&#x2F;code&gt;, e.g. &lt;code&gt;https:&#x2F;&#x2F;docs.rs&#x2F;foobar&#x2F;latest&#x2F;foobar&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;limitations&quot;&gt;Limitations&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;#![doc = include_str!(&quot;..&#x2F;README.md&quot;)]&lt;&#x2F;code&gt; has two main relevant limitations which you may need to work around.&lt;&#x2F;p&gt;
&lt;p&gt;The first of these is in code blocks.
Normal rustdoc examples can include hidden setup lines, starting with a &lt;code&gt;#&lt;&#x2F;code&gt; character.
These will not be rendered by rustdoc.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;md&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-md &quot;&gt;&lt;code class=&quot;language-md&quot; data-lang=&quot;md&quot;&gt;&lt;span&gt;```&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;rust
&lt;&#x2F;span&gt;&lt;span&gt;# &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span&gt;foobar::frobnicate;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;frobnicate&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;```
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, other markdown renderers do not support this extension, so the example above will be rendered as something like:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;# &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span&gt;foobar::frobnicate;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;frobnicate&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Unfortunately, I am not aware of a workaround for this; my current best suggestion is to avoid using these hidden lines in your README.
Doctests in included markdown files do also have some diagnostics issues, as reported in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;issues&#x2F;81070&quot;&gt;rust-lang&#x2F;rust#81070&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The second limitation is with file links, such as a link to your license file of the form &lt;code&gt;[LICENSE-MIT](LICENSE-MIT)&lt;&#x2F;code&gt; (as recommended in &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.github.io&#x2F;api-guidelines&#x2F;necessities.html#crate-and-its-dependencies-have-a-permissive-license-c-permissive&quot;&gt;C-PERMISSIVE&lt;&#x2F;a&gt;).
This is because rustdoc does not support relative file links in Markdown.
This can be solved by using the &quot;opposite&quot; of this trick - you can use a web link in your &lt;code&gt;lib.rs&lt;&#x2F;code&gt;, and a file link in the README.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-second-trick&quot;&gt;A second trick&lt;&#x2F;h2&gt;
&lt;p&gt;READMEs contain some content which are not expected to be present in a crate&#x27;s documentation.
For example, a top-level title, which would duplicate the &lt;code&gt;crate foobar&lt;&#x2F;code&gt; header added by rustdoc.
This can be resolved by using css in your documentation to hide these items; rustdoc allows embedding CSS in your documentation.
However, this should only be included in your &lt;code&gt;lib.rs&lt;&#x2F;code&gt;, so that the header is shown in other contexts.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rs&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rs &quot;&gt;&lt;code class=&quot;language-rs&quot; data-lang=&quot;rs&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F;! &amp;lt;style&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F;! .rustdoc-hidden { display: none; }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F;! &amp;lt;&#x2F;style&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Any text in the README which should be excluded from your docs page can then be surrounded by a &lt;code&gt;div&lt;&#x2F;code&gt; with the &lt;code&gt;rustdoc-hidden&lt;&#x2F;code&gt; class, for example:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;md&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-md &quot;&gt;&lt;code class=&quot;language-md&quot; data-lang=&quot;md&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;div &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;class &lt;&#x2F;span&gt;&lt;span&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;rustdoc-hidden&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;# Foobar
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;div&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As far as I&#x27;m aware, this does not have any accessibility considerations, as browsers will not make &lt;code&gt;display: none&lt;&#x2F;code&gt; items available in their accessibility tree.&lt;&#x2F;p&gt;
&lt;p&gt;Tracing Android Trace (see &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;doc-include&#x2F;#example&quot;&gt;above&lt;&#x2F;a&gt;) also uses this trick to hide the license section from the crate docs.
The license information is already present in the crate&#x27;s info box.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Using &lt;code&gt;#![doc = include_str!(&quot;..&#x2F;README.md&quot;)]&lt;&#x2F;code&gt; can integrate nicely with intra-doc links, if you use some tricks.
I believe that this pattern reduces the quality gap between bespoke documentation in &lt;code&gt;lib.rs&lt;&#x2F;code&gt; enough that using README includes becomes the right pattern for most crates.
This avoids the maintenance burden of needing to ensure that text in the crate level docs and the README do not become out-of-sync.
I intend to evaluate this technique by applying it across Linebender crates.
It may still be better to have bespoke documentation for each location, for projects which can afford the maintenance costs of that solution.
But for other projects, this can provide an easy way to improve their crate level documentation.&lt;&#x2F;p&gt;
&lt;p&gt;These patterns can also be applied when including non-&lt;code&gt;README&lt;&#x2F;code&gt; markdown documents.
I suggest linking to this post when using these patterns, to allow future readers of your code to understand the technique being used.&lt;&#x2F;p&gt;
&lt;p&gt;Discuss on &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;181284-blogging&#x2F;topic&#x2F;.23!.5Bdoc.20.3D.20include_str!.28.29.5D.20with.20intra-doc.20links&quot;&gt;the Linebender Zulip&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>May-July roadmap for Linebender</title>
        <published>2024-06-17T00:00:00+00:00</published>
        <updated>2024-06-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            Olivier Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/roadmap-may-2024/"/>
        <id>https://linebender.org/blog/roadmap-may-2024/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/roadmap-may-2024/">&lt;p&gt;On May 7 and 8, 2024, folks from the Linebender team went to &lt;a href=&quot;https:&#x2F;&#x2F;2024.rustnl.org&#x2F;&quot;&gt;the RustNL conference&lt;&#x2F;a&gt; for two days, followed by two days of Unconference.&lt;&#x2F;p&gt;
&lt;p&gt;By that point, we all felt fairly exhausted, but &lt;del&gt;because Raph is a cruel taskmaster&lt;&#x2F;del&gt; since we wanted to use the opportunity we had, we came together in our hotel&#x27;s conference room to discuss the Linebender project, and what we wanted from it.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;d initially thought that this day would be an informal day of unstructured chatting about the ecosystem, but it fairly quickly turned into a semi-formal planning exercise, where we tried to figure out a roadmap for the next few months.&lt;&#x2F;p&gt;
&lt;p&gt;What follows is a comprehensive summary of what exactly we&#x27;re planning to do.
We&#x27;ve tried to focus on blockers, where a missing feature in one project is stalling progress on other projects, because those are the hardest barriers to coordination, and we wanted to take advantage of being in the same room together to knock them down.&lt;&#x2F;p&gt;
&lt;p&gt;This is a snapshot of the project status at the time we&#x27;re writing this.
It includes some work we already finished since RustNL, but will not be updated when further work finishes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vello&quot;&gt;Vello&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;robust-dynamic-memory&quot;&gt;Robust dynamic memory&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Daniel McNab.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Allocating dynamic memory in a robust way is essential to display large scenes without graphical artifacts. We have several possible solutions, we need to implement one.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;issues&#x2F;366&quot;&gt;vello#366&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;reliable-snapshot-tests&quot;&gt;Reliable snapshot tests&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Daniel McNab.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Snapshot tests are essential to test regressions in graphic software. Masonry&#x27;s test suite heavily depends on them. But it&#x27;s flaky right now because even when the fonts and inputs are exactly the same, renderers can have subtle differences that make the snapshots slightly different. We either need to create a fully deterministic renderer or add testing infrastructure that can tolerate small differences. &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;nv-flip&#x2F;latest&#x2F;nv_flip&#x2F;&quot;&gt;&lt;code&gt;nv-flip&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; might have what we want.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;issues&#x2F;608&quot;&gt;vello#608&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;sparse-strips&quot;&gt;Sparse strips&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Raph Levien.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Sparse strips are a new research direction that might significantly improve our rendering pipeline and our memory footprint. We want to write a prototype implementation so we can confirm the performance benefits.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zulip thread:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;197075-gpu&#x2F;topic&#x2F;Sparse.20strip.20path.20rendering&quot;&gt;Sparse strip path rendering&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;add-tests&quot;&gt;Add tests&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Medium.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Adding tests is often a &quot;we&#x27;ll do it later&quot; item, but it has short-term benefits as well. Adding tests would help Vello contributors check that their modifications don&#x27;t add regressions to the crate, and help us catch hidden bugs. As a first step, we&#x27;d want to at least add some extremely basic tests, such as checking that Vello doesn&#x27;t crash when we run a sample image through the CPU shaders.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;439&quot;&gt;vello#439&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;masonry&quot;&gt;Masonry&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;complete-text-input&quot;&gt;Complete text input&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure, Aaron Muir Hamilton.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We&#x27;d like to bring up Masonry&#x27;s textbox widget to be best-in-class among Rust frameworks. We want to support native-feeling interactions out of the box, such as cursor movement (go to next word, go to beginning of line), selection (select to end of text) and editing (IME, deleting an entire word, etc). This is something other framework developers have expressed interest in, so we want to implement it in a composable way.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;388&quot;&gt;xilem#388&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;better-tracing-for-debugging&quot;&gt;Better tracing for debugging&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Masonry currently uses the &lt;code&gt;tracing&lt;&#x2F;code&gt; crate to produce logs usable for debugging. These logs could be improved, so that a user finding a bug can quickly narrow in on information relevant to the bug, without having to restart the app with changed log levels. The bulk of the improvement would be to implement a new subscriber with multiple layers.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;250&quot;&gt;xilem#250&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;fix-glaring-documentation-problems&quot;&gt;Fix glaring documentation problems&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Masonry&#x27;s documentation hasn&#x27;t been updated since the port to Winit. While a lot of the code is still in flux, and thus hard to document, we should at least do a quick rewrite pass to remove references to Piet, Glazier, etc.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;329&quot;&gt;xilem#329&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;finish-repository-port&quot;&gt;Finish repository port&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Daniel McNab.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We&#x27;ve ported the &lt;code&gt;masonry-rs&lt;&#x2F;code&gt; repository to the &lt;code&gt;linebender&lt;&#x2F;code&gt; organization, but that repository isn&#x27;t where the crate&#x27;s code lives anymore. We should update the README to reflect that information, port the issues to &lt;code&gt;linebender&#x2F;xilem&lt;&#x2F;code&gt;, and archive &lt;code&gt;linebender&#x2F;masonry&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zulip thread:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;317477-masonry&#x2F;topic&#x2F;.E2.9C.94.20Finishing.20the.20Masonry.20repository.20transition&quot;&gt;Finishing the Masonry repository transition&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-widgets-in-arena-rfc&quot;&gt;Write &quot;Widgets in Arena&quot; RFC&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; This was something alluded to in the January blog posts. We want to move Masonry from storing widgets in WidgetPod to storing them in a slotmap-like arena. This is a large enough change to write an RFC about it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;6&quot;&gt;rfcs#6&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-pass-order-rfc&quot;&gt;Write &quot;Pass order&quot; RFC&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Right now widgets can use context methods in their different passes to request that other passes be run. What passes can run what other passes isn&#x27;t clearly documented, especially around edge cases. We should write an RFC to nail down the passes, how they can communicate, and the rationale around them.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; TBD.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;rewrite-documentation&quot;&gt;Rewrite documentation&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Medium.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Masonry&#x27;s documentation hasn&#x27;t been updated since the port to Winit. Once other major changes are implemented, the documentation should be brought up to date. We should avoid procrastinating on documentation too much just because the architecture is still in progress.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;389&quot;&gt;xilem#389&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;improve-focus-handling&quot;&gt;Improve focus handling&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Medium.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We should improve tab focus in Masonry. Right now tab focus has some bugs, doesn&#x27;t cover buttons, isn&#x27;t updated by clicks, and uses architecture inherited from Druid that could be strongly simplified once other architectural changes are completed.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;390&quot;&gt;xilem#390&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;improve-pointer-status-handling&quot;&gt;Improve pointer status handling&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Medium.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We should centralize and improve how Masonry handles pointers. In particular, we should add an explicit &quot;pointer capture&quot; API that makes other widgets not get events from that pointer until the pointer is released or lost.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;312&quot;&gt;xilem#312&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;parley&quot;&gt;Parley&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;create-abstractions-for-text-selection-and-editing&quot;&gt;Create abstractions for text selection and editing&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Chad Brokaw, Aaron Muir Hamilton.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We want Parley to implement types and methods that Masonry and other editors will be able to use to create a text-editing widget, or to handle selection in non-editable text. The initial implementation may be located in Masonry.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;issues&#x2F;52&quot;&gt;parley#52&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;inline-block-layout&quot;&gt;Inline block layout&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Chad Brokaw.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Parley should support laying out inline content the way web browsers do, where blocks are spliced into your text and will be laid out according to available inline space the same way words are.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;issues&#x2F;25&quot;&gt;parley#25&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PRs:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;67&quot;&gt;parley#67&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;76&quot;&gt;parley#76&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-adequate-documentation&quot;&gt;Write adequate documentation&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Nico Burns.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Parley currently has virtually no documentation. If we want it to become a foundational crate, we need to tell people how to use it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;26&quot;&gt;parley#26&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;software-renderer&quot;&gt;Software renderer&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Low.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Chad Brokaw.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Create a software renderer for the glyphs created by Parley, so that users can easily import Parley in their library without depending on a graphics API like Vello. The software renderer should be black-and-white for simplicity. We&#x27;ll call for volunteers to implement COLRv1 and other advanced features.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PRs:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;54&quot;&gt;parley#54&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;55&quot;&gt;parley#55&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;xilem&quot;&gt;Xilem&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;android-bringup&quot;&gt;Android bringup&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Daniel McNab.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We want Xilem to reliably work on Android. Running your Xilem app should require a small number of steps. Ideally, it should be as simple as running &lt;code&gt;cargo some-command&lt;&#x2F;code&gt; in your project.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;309&quot;&gt;xilem#309&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;update-repository-layout&quot;&gt;Update repository layout.&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We&#x27;ve agreed on a layout for Linebender repositories. We should move projects in the Xilem repo to match that layout.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PRs:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;302&quot;&gt;xilem#302&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;590&quot;&gt;vello#590&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;rework-xilem-core-to-be-compatible-with-masonry-backend&quot;&gt;Rework xilem_core to be compatible with Masonry backend&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Daniel McNab.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; The version of Xilem that was ported to Masonry used a different &lt;code&gt;View&lt;&#x2F;code&gt; trait that is incompatible with the current &lt;code&gt;xilem_core&lt;&#x2F;code&gt; crate. We need to rework &lt;code&gt;xilem_core&lt;&#x2F;code&gt; to get traits that can be used by both Masonry and &lt;code&gt;xilem_web&lt;&#x2F;code&gt;. Doing so while keeping readable code is non-trivial.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PR:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;235&quot;&gt;xilem#235&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;310&quot;&gt;xilem#310&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;write-documentation&quot;&gt;Write Documentation&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; High.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Xilem&#x27;s lack of documentation is one of the problems new users complain about the most often. We need to avoid staying in that state for too long.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;392&quot;&gt;xilem#392&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;re-implement-async-integration&quot;&gt;Re-implement async integration&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Medium.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Daniel McNab.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; One of Xilem&#x27;s selling points is the ability to handle virtual lists and async sources of data. That ability was temporarily removed for the Masonry port, but we&#x27;d like to add it back. We don&#x27;t want Masonry to be aware of async stuff, but the AppDriver trait should at least provide a method which lets Xilem access Masonry internals on its own.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;340&quot;&gt;xilem#340&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;add-unit-tests&quot;&gt;Add unit tests&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Low.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We need to figure out an architecture for doing unit tests in Xilem. Tests can then be added by volunteer contributors. At some point we should hopefully switch to a &quot;new test for every new feature&quot; workflow.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;393&quot;&gt;xilem#393&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;add-basic-benchmarks&quot;&gt;Add basic benchmarks&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Low.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Olivier Faure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; Right now we&#x27;re mostly working off vibes to know whether or not any of our work improved performance or introduced regressions.
We should write at least &lt;em&gt;one&lt;&#x2F;em&gt; benchmark that would test a basic Xilem use-case, so we get a general idea of how our performance is progressing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Issue:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;362&quot;&gt;xilem#362&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;accesskit&quot;&gt;AccessKit&lt;&#x2F;h2&gt;
&lt;p&gt;Matt Campbell&#x27;s contract with Google hasn&#x27;t started yet.
When it does, the top priority will likely be the Android backend.&lt;&#x2F;p&gt;
&lt;p&gt;The plan is to study existing Android accessibility implementations for non-Java toolkits, including Flutter, Chromium, and Gio, to get a better understanding of what&#x27;s required to implement Android accessibility from scratch.&lt;&#x2F;p&gt;
&lt;p&gt;Beyond Android support, we&#x27;ve only had cursory discussions of what work Matt will do for the rest of the year.
Possible themes include scrollable containers, virtualized lists, richer text support (e.g. exposing font and style attributes) across platforms, and better integration into Xilem&#x2F;Masonry.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;android-specific-work&quot;&gt;Android-specific work&lt;&#x2F;h2&gt;
&lt;p&gt;Getting the Android port right involves a lot of small changes and making things feel non-broken.&lt;&#x2F;p&gt;
&lt;p&gt;Some notable sub-goals:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;subclassing-view-application-activity&quot;&gt;Subclassing View&#x2F;Application&#x2F;Activity&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Aaron Muir Hamilton, Raph Levien.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; The Java classes of an Android application are where the rubber meets the road. We&#x27;re investigating what we want our boilerplate to look like.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;handling-ime&quot;&gt;Handling IME&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Highest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Aaron Muir Hamilton, Raph Levien.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; We need to extend Winit to be compatible with Android IME interfaces. An Android application without support for the virtual keyboard and other input methods is a non-starter. Our design choices here will have some influence on accessibility as well.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;gesture-recognition&quot;&gt;Gesture recognition&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;&#x2F;strong&gt; Low.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assigned:&lt;&#x2F;strong&gt; Aaron Muir Hamilton.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;&#x2F;strong&gt; When the user swipes on the screen, we want to send some kind of scrolling event instead of a normal pointer event. Ideally there should be first-class support for that event to handle momentum scrolling, but a dumber solution would just emulate mouse wheel ticks.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Whew! We have our work cut out for us there.&lt;&#x2F;p&gt;
&lt;p&gt;Overall, I&#x27;m feeling very optimistic about the coming months.
In the weeks since we first drafted this roadmap, we&#x27;ve already made a lot of progress on our respective tasks (for instance Daniel is now running on what async experts call a &quot;work-stealing&quot; algorithm), so it does look like we&#x27;ll meet our deadlines.&lt;&#x2F;p&gt;
&lt;p&gt;What comes after that is a bit hazier.
Our three areas of focus are likely to be Android support, accessibility, and developer experience.&lt;&#x2F;p&gt;
&lt;p&gt;As we fill out gaps in our feature set, Xilem is moving towards its faraway goal: becoming a stable, mature framework for GUI applications.
We&#x27;re not GUI yet, but we certainly hope to be one day.&lt;&#x2F;p&gt;
&lt;p&gt;In the meantime, stay tuned!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Report on the RustNL 2024 Unconference</title>
        <published>2024-06-15T00:00:00+00:00</published>
        <updated>2024-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Olivier Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/rustnl-2024-unconference/"/>
        <id>https://linebender.org/blog/rustnl-2024-unconference/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/rustnl-2024-unconference/">&lt;p&gt;On May 7 and 8, 2024, folks from the Linebender team went to &lt;a href=&quot;https:&#x2F;&#x2F;2024.rustnl.org&#x2F;&quot;&gt;the RustNL conference&lt;&#x2F;a&gt; in Delft.
We listened to &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PL8Q1w7Ff68DBZZbJt3ie5MUoJV5v2HeA7&quot;&gt;some Rust-related talks&lt;&#x2F;a&gt;, Raph &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=OvfNipIcRiQ&amp;amp;list=PL8Q1w7Ff68DBZZbJt3ie5MUoJV5v2HeA7&amp;amp;index=15&quot;&gt;gave one on Xilem&lt;&#x2F;a&gt;, Rik Arends did the &quot;hot-reload my entire editor live&quot; thing that makes every other Rust GUI developer jealous, it was an all-around great time.&lt;&#x2F;p&gt;
&lt;p&gt;After RustNL, though, another less-documented event called &lt;a href=&quot;https:&#x2F;&#x2F;2024.rustnl.org&#x2F;unconf&#x2F;&quot;&gt;The Unconference&lt;&#x2F;a&gt;.
It was from roughly the same organizers and took place in the same city, but the format was fairly different.&lt;&#x2F;p&gt;
&lt;p&gt;The Unconference wasn&#x27;t livestreamed, and I haven&#x27;t found any public discussion of it, so I thought I&#x27;d take the time to describe a bit of what was going on.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-format&quot;&gt;The format&lt;&#x2F;h2&gt;
&lt;p&gt;The &quot;Unconference&quot; was two days of loosely structured chats between members of various Rust project teams where people talked about ecosystem collaboration, complained to lang team members that their favorite feature wasn&#x27;t implemented yet, &lt;a href=&quot;https:&#x2F;&#x2F;poignardazur.github.io&#x2F;2024&#x2F;05&#x2F;25&#x2F;report-on-rustnl-variadics&#x2F;&quot;&gt;went to pester everyone else about variadic generics&lt;&#x2F;a&gt;, and other good fun.&lt;&#x2F;p&gt;
&lt;p&gt;Attendees were split into three teams:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The Rust project.&lt;&#x2F;li&gt;
&lt;li&gt;GUI and Applications.&lt;&#x2F;li&gt;
&lt;li&gt;Embedded development.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Discussions inside these teams were mostly self-organized, with cross-team discussions mostly taking place during lunch and recess.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;on-the-tyranny-of-structurelessness&quot;&gt;On the tyranny of structurelessness&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;em&gt;Note: This section is very much my personal opinion and doesn&#x27;t represent the Linebender project as a whole.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m not sure the self-organized format worked well.&lt;&#x2F;p&gt;
&lt;p&gt;From what I saw, the Embedded team took well to it, and the Rust team was kept productive thanks to Alice Cecile&#x27;s efforts in marshaling everyone.&lt;&#x2F;p&gt;
&lt;p&gt;In the case of the GUI team, people were spread in a very large room, which should have been conducive to small side discussions and people splitting up to talk about the problems that interested them.
Instead, there was an unspoken accord to progress through agenda items one by one, with a few people dominating the discussions on these items.&lt;&#x2F;p&gt;
&lt;p&gt;Because those people we spread around a large room, they had to talk loudly to address each other, which left little room for side-discussions.
Because the people talking were naturally the most confident and extroverted, more introverted people ended up taking a passive role in the discussion.&lt;&#x2F;p&gt;
&lt;p&gt;To me, this feels like a strategic mistake.
It was a setup that encouraged bikeshedding and long back-and-forths and discouraged plurality of opinions.
It&#x27;s no coincidence that the most interesting conversations of the Unconference happened at lunch: lunch was the point of the Unconference where people were most mixed, had the most spontaneous conversations, and were least constrained by having to follow what someone else was saying.&lt;&#x2F;p&gt;
&lt;p&gt;Our discussions were still productive, I just feel like the format could have been improved.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-gui-team&quot;&gt;The GUI team&lt;&#x2F;h2&gt;
&lt;p&gt;As a member of the Linebender project, I was mostly exposed to the GUI team&#x27;s proceedings.&lt;&#x2F;p&gt;
&lt;p&gt;The main topics of interest were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Build tooling (especially for Android and other non-desktop platforms).&lt;&#x2F;li&gt;
&lt;li&gt;Text layout and editing.&lt;&#x2F;li&gt;
&lt;li&gt;Winit adoption.&lt;&#x2F;li&gt;
&lt;li&gt;Accessibility.&lt;&#x2F;li&gt;
&lt;li&gt;Potential for further collaboration.&lt;&#x2F;li&gt;
&lt;li&gt;Requests for new Rust features.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Note that I&#x27;m skipping a lot of topics from the agenda and other side discussions.
The topics above were the most prominent during those two days.&lt;&#x2F;p&gt;
&lt;p&gt;There was also a fair amount of informal chatter around LogLog Games&#x27; strongly critical &lt;a href=&quot;https:&#x2F;&#x2F;loglog.games&#x2F;blog&#x2F;leaving-rust-gamedev&#x2F;&quot;&gt;Leaving Rust gamedev after 3 years&lt;&#x2F;a&gt; article.
I think those discussions mostly reflected the Bevy community&#x27;s consensus, that the article had some flaws but overall pointed at very clear weaknesses in the Rust GUI &#x2F; game engine ecosystem.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;build-tooling&quot;&gt;Build tooling&lt;&#x2F;h3&gt;
&lt;p&gt;Everyone agreed that a better solution was needed to ship non-TUI Rust apps.&lt;&#x2F;p&gt;
&lt;p&gt;There was discussion about various platforms and build systems, and the difficulty of having to e.g. write Java code for an Android port, and whether anyone wanted to take responsibility for maintaining that glue layer for the rest of the ecosystem.&lt;&#x2F;p&gt;
&lt;p&gt;No actionable decisions were made, but the consensus seems to be that although integrated build tools are desirable, external build tooling for complex platforms (primarily Apple and Android) is likely to remain necessary.
Nobody seems to have stepped up to work on multi-target builds in Cargo, and since external build tools are required as it is, most people are okay with building everything several times when they release a multi-target package.
Most users are comfortable invoking platform-specific tools for bundling, signing, and manifest generation, so there is not much urgency for integrated tooling for these.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;text-layout-and-editing&quot;&gt;Text layout and editing&lt;&#x2F;h3&gt;
&lt;p&gt;There was some widespread interest in the Linebender ecosystem&#x27;s text-handling crates.
From what I remember, Rik Arends and others had concerns about whether e.g. Parley and Swash depend on our Vello renderer (they don&#x27;t).&lt;&#x2F;p&gt;
&lt;p&gt;Some people also wanted Parley to be decoupled from Swash.&lt;&#x2F;p&gt;
&lt;p&gt;People were especially interested in the idea of having access to a common text-editing widget, or at least infrastructure for creating one.
That widget would handle IME, text selection, accessibility actions, etc, in a way that would feel native to different platforms with their own text-editing quirks (mobile, macOS, Linux with vim mode, etc).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;winit&quot;&gt;Winit&lt;&#x2F;h3&gt;
&lt;p&gt;By now all of the Rust ecosystem has firmly converged on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-windowing&#x2F;winit&quot;&gt;&lt;code&gt;winit&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as the windowing platform-abstraction solution of choice.&lt;&#x2F;p&gt;
&lt;p&gt;(Well, not all! &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;makepad&#x2F;makepad&quot;&gt;One small project&lt;&#x2F;a&gt; with indomitable maintainers still holds out against the invaders.)&lt;&#x2F;p&gt;
&lt;p&gt;The consensus during this discussion seemed to be that Winit was there to stay.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tauri-apps&#x2F;tao&quot;&gt;TAO&lt;&#x2F;a&gt; users present were generally interested in being able to use upstream Winit in the future, if its API adopts or supersedes the improvements made in TAO.
Most were happy to see Winit becoming more trait-oriented, and to see the &lt;code&gt;dpi&lt;&#x2F;code&gt; crate spun off from Winit.&lt;&#x2F;p&gt;
&lt;p&gt;Glazier is still shelved and we&#x27;re planning to port its features to Winit until it reaches feature parity.&lt;&#x2F;p&gt;
&lt;p&gt;A discussion that came up was the idea of splitting more &quot;vocabulary types&quot; from Winit into standalone crates.
Vocabulary crates, e.g. crates that only define types and very little code, have a very low cost in memory and build times, while allowing projects to interop with e.g. Winit without actually adding a dependency on Winit.&lt;&#x2F;p&gt;
&lt;p&gt;This was connected with the discussions about text editing: having a vocabulary crate that would list Winit&#x27;s events and also Parley&#x27;s cursor movements would allow for a very low-dependency text editing widget.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;accessibility&quot;&gt;Accessibility&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;em&gt;Note: This section is also my personal opinion and doesn&#x27;t represent the Linebender project either.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The subject of Accessibility came up informally, but I&#x27;ll claim it was underexplored.&lt;&#x2F;p&gt;
&lt;p&gt;While the subject was on the agenda, by the time we reached it the Unconference had been running long enough that everyone was tired and ready to leave or get to the catering.
This is an unfortunate pattern that I think is worth pointing out: if projects don&#x27;t make a deliberate effort to prioritize discussions of accessibility, the subject will be left out.&lt;&#x2F;p&gt;
&lt;p&gt;Matt Campbell, the maintainer of AccessKit, could not attend the Unconference.
I&#x27;m concerned that, in his absence, other maintainers might have felt a dilution of responsibility: since the accessibility guy wasn&#x27;t there, nobody felt empowered to bring up accessibility.&lt;&#x2F;p&gt;
&lt;p&gt;(This might sound like it contradicts my section about structurelessness above.
It doesn&#x27;t.
I&#x27;m not saying organizers should have pushed harder for accessibility - they did try - I&#x27;m saying that we should strive for a culture where framework developers think about accessibility without waiting for someone to tell them to.)&lt;&#x2F;p&gt;
&lt;p&gt;One point did come up during the discussion which I&#x27;d like to hammer in: the Rust ecosystem should adopt a holistic view of accessibility.
Accessibility isn&#x27;t just about screen readers, and making a framework accessible doesn&#x27;t stop at adding AccessKit as a dependency, though doing so is a great first step.&lt;&#x2F;p&gt;
&lt;p&gt;Rik asked if there was a minimal set of ARIA attributes that people could start using in their UI, as the set of available attributes is gigantic.
The AccessKit framework is rich, and it&#x27;s not obvious at first glance how much is needed versus nice-to-have.
The current reference in the Rust ecosystem is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emilk&#x2F;egui&#x2F;pull&#x2F;2294&quot;&gt;the AccessKit implementation in egui&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;requests-for-rust-features&quot;&gt;Requests for Rust features&lt;&#x2F;h3&gt;
&lt;p&gt;Jon Kelley, the creator of Dioxus, had &lt;a href=&quot;https:&#x2F;&#x2F;dioxus.notion.site&#x2F;Dioxus-Labs-High-level-Rust-5fe1f1c9c8334815ad488410d948f05e&quot;&gt;a laundry list of features&lt;&#x2F;a&gt; he wanted from the Rust language.
That list was later &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust-project-goals&#x2F;pull&#x2F;10&quot;&gt;filed in the Project Goals repository&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The requests were well-documented, with motivating examples in existing Dioxus code that would clearly be improved by the features.
Most of them felt both self-contained and like they would tremendously both beginners and veteran Rust developers; though Jon made the point that the papercuts he wanted to remove were especially punishing for new developers trying to become familiar with Rust.&lt;&#x2F;p&gt;
&lt;p&gt;Overall people were very enthusiastic about them, and the lang team members in the room seemed pretty optimistic that those features could be added.&lt;&#x2F;p&gt;
&lt;p&gt;My favorite proposals were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Capture&lt;&#x2F;code&gt; trait for auto-cloning reference-counted types in closures.&lt;&#x2F;li&gt;
&lt;li&gt;Automatic partial borrows.&lt;&#x2F;li&gt;
&lt;li&gt;Optional struct attributes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Jon also wanted support for a remote cache of pre-built crates, so that users wouldn&#x27;t suffer from having to rebuild dozens of crates every time you download your crate&#x27;s dependencies.
The consensus from Rust maintainers was that such a cache would be essentially impossible with Rust&#x27;s current architecture.&lt;&#x2F;p&gt;
&lt;p&gt;Niko Matsakis recently released &lt;a href=&quot;https:&#x2F;&#x2F;smallcultfollowing.com&#x2F;babysteps&#x2F;blog&#x2F;2024&#x2F;06&#x2F;02&#x2F;the-borrow-checker-within&#x2F;&quot;&gt;The borrow checker within&lt;&#x2F;a&gt;, which feels like a follow-up to some of these discussions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;collaboration-in-the-rust-gui-ecosystem&quot;&gt;Collaboration in the Rust GUI ecosystem&lt;&#x2F;h2&gt;
&lt;p&gt;Over the last two years I&#x27;ve joked a few times that everybody in the Rust GUI ecosystem wants the ecosystem to standardize on common crates, as long as it&#x27;s &lt;em&gt;their&lt;&#x2F;em&gt; crates.&lt;&#x2F;p&gt;
&lt;p&gt;After RustNL, I&#x27;m pleased to report this joke isn&#x27;t accurate anymore.&lt;&#x2F;p&gt;
&lt;p&gt;A vibe that permeated all discussions was people wanting work to be pooled.
It felt like people didn&#x27;t strongly care whose crate we adopted, as long as we all agreed the crate made sense:
we&#x27;re slowly crawling out of the &lt;a href=&quot;https:&#x2F;&#x2F;xkcd.com&#x2F;927&#x2F;&quot;&gt;xkcd 927&lt;&#x2F;a&gt; dilemma.&lt;&#x2F;p&gt;
&lt;p&gt;The main ecosystem crates that people are enthusiastic about sharing are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-windowing&#x2F;winit&quot;&gt;winit&lt;&#x2F;a&gt; for creating windows.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AccessKit&#x2F;accesskit&#x2F;&quot;&gt;AccessKit&lt;&#x2F;a&gt; for plugging into accessibility APIs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gfx-rs&#x2F;wgpu&#x2F;&quot;&gt;wgpu&lt;&#x2F;a&gt; for using modern GPU features.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Jon Kelley also said he would be interested in using Masonry as the native backend for Dioxus, though we haven&#x27;t hashed out details yet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;corporate-funding&quot;&gt;Corporate funding&lt;&#x2F;h3&gt;
&lt;p&gt;For open-source projects, &quot;Who funds this&quot; is a difficult question: in any healthy project, there is a large scale of contributions, with individual non-corporate contributors at one end, and companies paying cash to the project&#x27;s treasury at the other.
In-between are self-employed people like me contracted to work on an open-source project, and corporate employees who contribute to the project as part of their 9-to-5 job.&lt;&#x2F;p&gt;
&lt;p&gt;Some monetary contributions can also come from individual non-corporate donors: Servo has about fifty of them, for instance.&lt;&#x2F;p&gt;
&lt;p&gt;With that in mind, some notable sponsors for projects represented at the Unconference were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Fonts:&lt;&#x2F;strong&gt; Linebender projects.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Futurewei:&lt;&#x2F;strong&gt; Dioxus, Makepad, Robius and Servo.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Embark:&lt;&#x2F;strong&gt; Bevy, winit and rust-gpu.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Foresight Spatial Labs:&lt;&#x2F;strong&gt; Bevy.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rerun.io:&lt;&#x2F;strong&gt; egui.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Not present at RustNL but relevant to the ecosystem are &lt;strong&gt;System76&lt;&#x2F;strong&gt; (funding COSMIC-Text and contributing to iced), &lt;strong&gt;Kraken&lt;&#x2F;strong&gt; (funding iced), and &lt;strong&gt;Slint&lt;&#x2F;strong&gt; who are self-funding as a startup targeting embedded UIs and couldn&#x27;t attend due to time constraints.&lt;&#x2F;p&gt;
&lt;p&gt;Overall the number of different backers feels like a symptom of a healthy ecosystem: while some large corporate sponsors bring much more resources than others (Google and Futurewei especially), the ecosystem isn&#x27;t in a state where any specific backer pulling out would completely collapse progress.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Before anything else, I&#x27;d like to express a big thanks to the volunteers who helped organize RustNL.&lt;&#x2F;p&gt;
&lt;p&gt;Most of the attendees were absolutely exhausted after two days of talks and two more days of Unconference, but these folks had to &lt;em&gt;run&lt;&#x2F;em&gt; the darn thing.
I think everyone who attended was impressed with them.&lt;&#x2F;p&gt;
&lt;p&gt;Overall RustNL and the Unconference felt like getting a year of coordination done in a week.
It was a thoroughly productive time, and I couldn&#x27;t be happier I attended.
Everyone I asked about it shared the same opinion.&lt;&#x2F;p&gt;
&lt;p&gt;And the discussions we had during the event showed there was a great appetite to push the ecosystem towards more cooperation, both between GUI projects and with Rust maintainers!&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m feeling more hopeful about the future of Rust GUI than ever.&lt;&#x2F;p&gt;
&lt;p&gt;Now it&#x27;s time to get back to work.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, May 2024</title>
        <published>2024-06-12T00:00:00+00:00</published>
        <updated>2024-06-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-05/"/>
        <id>https://linebender.org/blog/tmix-05/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-05/">&lt;p&gt;Several members of Linebender attended &lt;a href=&quot;https:&#x2F;&#x2F;2024.rustnl.org&#x2F;&quot;&gt;RustNL&lt;&#x2F;a&gt; at the start of May.
Raph gave a talk titled &lt;em&gt;Xilem: Let&#x27;s Build High Performance Rust UI&lt;&#x2F;em&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;OvfNipIcRiQ&quot;&gt;YouTube&lt;&#x2F;a&gt;).
The conference also provided a great opportunity to meet with developers from other Rust user interface projects;
Olivier has produced a report on the unconference, which will be published here shortly.
In addition, those in attendance met after the conference and worked on a roadmap for Linebender, which we are also planning to share here.&lt;&#x2F;p&gt;
&lt;p&gt;We have taken several important steps on Xilem.
At the start of the month, we released &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;releases&#x2F;tag&#x2F;v0.1.0&quot;&gt;Xilem 0.1.0&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;releases&#x2F;tag&#x2F;masonry%2Fv0.2.0&quot;&gt;Masonry 0.2.0&lt;&#x2F;a&gt;.
This is the first published release of Xilem, and includes text input (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;241&quot;&gt;xilem#241&lt;&#x2F;a&gt;), AccessKit integration (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;244&quot;&gt;xilem#244&lt;&#x2F;a&gt;) and a TodoMVC inspired example (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;257&quot;&gt;xilem#257&lt;&#x2F;a&gt;).
Work through the rest of the month included explorations of a generic &lt;code&gt;View&lt;&#x2F;code&gt; trait (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;310&quot;&gt;xilem#310&lt;&#x2F;a&gt;), and an Android port (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;309&quot;&gt;xilem#309&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;313&quot;&gt;xilem#313&lt;&#x2F;a&gt;).
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;6&quot;&gt;rfcs#6&lt;&#x2F;a&gt; is designed to reduce boilerplate when using Masonry, which should help those creating custom Masonry widgets.&lt;&#x2F;p&gt;
&lt;p&gt;Other Linebender projects have seen steady improvements.
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;575&quot;&gt;vello#575&lt;&#x2F;a&gt; significantly reduced shader compilation time at startup for projects using Vello, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;516&quot;&gt;vello#516&lt;&#x2F;a&gt; enabled clearer error handling.
Nico Burns has started an exciting project for inline box layout (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;parley&#x2F;pull&#x2F;67&quot;&gt;parley#67&lt;&#x2F;a&gt;), which will enable Parley to be used in projects which must implement Web layout.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, April 2024</title>
        <published>2024-05-01T00:00:00+00:00</published>
        <updated>2024-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-04/"/>
        <id>https://linebender.org/blog/tmix-04/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-04/">&lt;p&gt;Again, last month saw a substantial amount of infrastructure work in the development of Xilem.
The biggest change is landing Masonry as a crate within the Xilem repo (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;203&quot;&gt;xilem#203&lt;&#x2F;a&gt;) and adding a new xilem_masonry front-end.
The existing xilem widget tree remains in the tree during a transitional period, but the focus of development is now on Masonry.&lt;&#x2F;p&gt;
&lt;p&gt;Masonry is a principled abstraction layer within the stack.
While it is designed to work well with the Xilem reactive architecture, it is not dependent on it.
We&#x27;d love to see experimentation with alternative reactive frameworks, and also language bindings.
A lot more detail about the motivation and design of Masonry is in Olivier&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;xilem-backend-roadmap&#x2F;&quot;&gt;roadmap blog&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Two major infrastructural crates have been published.
&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;parley&quot;&gt;Parley&lt;&#x2F;a&gt; is our text layout crate, supporting variable fonts and other advanced features.
Supporting Parley is &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;fontique&quot;&gt;fontique&lt;&#x2F;a&gt;, a crate for enumerating the system fonts and making them available for itemization (choosing the right font to support a particular script).&lt;&#x2F;p&gt;
&lt;p&gt;In GPU rendering land, we have written a paper on GPU stroke expansion (&lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2405.00127&quot;&gt;arXiv&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;gpu-stroke-expansion-paper&quot;&gt;repo&lt;&#x2F;a&gt;) and submitted it to a conference.
This paper explains quite a bit of the math behind Vello&#x27;s path rendering, and explains how we adapted it for high performance on the GPU.
It&#x27;s also a good time to note the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;crate&#x2F;wgpu&#x2F;0.20.0&quot;&gt;wgpu 0.20&lt;&#x2F;a&gt; release, which contains some work to improve on suboptimal zero initialization that will dramatically improve startup time on many platforms, including Android (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gfx-rs&#x2F;wgpu&#x2F;pull&#x2F;5508&quot;&gt;wgpu#5508&lt;&#x2F;a&gt;).
It also has support for subgroups, which will unblock further performance improvements in Vello.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;re very much looking forward to participating in RustNL 2024, where Raph will present a talk on Xilem.
It looks like it will be a great opportunity to meet with other Rust UI ecosystem projects to find common ground and possibilities to collaborate.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, March 2024</title>
        <published>2024-04-04T00:00:00+00:00</published>
        <updated>2024-04-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Daniel McNab
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-03/"/>
        <id>https://linebender.org/blog/tmix-03/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-03/">&lt;p&gt;Since the last update, there have been three newly released projects from Linebender:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;velato&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;crates&#x2F;v&#x2F;velato.svg&quot; alt=&quot;Velato crates.io badge.&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;velato&quot;&gt;Velato&lt;&#x2F;a&gt;: A parser and driver for Lottie animation files in applications using Vello&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;vello_svg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;crates&#x2F;v&#x2F;vello_svg.svg&quot; alt=&quot;Vello SVG crates.io badge.&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello_svg&quot;&gt;Vello SVG&lt;&#x2F;a&gt;: Allows displaying (some) SVG documents in Vello applications&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;tracing_android_trace&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;crates&#x2F;v&#x2F;tracing_android_trace.svg&quot; alt=&quot;Tracing Android Trace crates.io badge.&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;android_trace&quot;&gt;Android Trace&lt;&#x2F;a&gt;: Resilient bindings to &lt;a href=&quot;https:&#x2F;&#x2F;developer.android.com&#x2F;ndk&#x2F;reference&#x2F;group&#x2F;tracing&quot;&gt;NDK Tracing&lt;&#x2F;a&gt; and an integration with &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;tracing&quot;&gt;tracing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you have a WebGPU capable browser you can check out the &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;velato&#x2F;&quot;&gt;web demo of Velato&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Implementation work for &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;blob&#x2F;main&#x2F;rfcs&#x2F;0001-masonry-backend.md&quot;&gt;rfcs#1&lt;&#x2F;a&gt; has started. Masonry is being ported to Vello in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;PoignardAzur&#x2F;masonry-rs&#x2F;pull&#x2F;56&quot;&gt;masonry#56&lt;&#x2F;a&gt;, with the next step being a move to Winit.
This work can be followed in the &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;#narrow&#x2F;stream&#x2F;317477-masonry&quot;&gt;#masonry&lt;&#x2F;a&gt; stream on Zulip.&lt;&#x2F;p&gt;
&lt;p&gt;We have landed some important improvements to Vello.
Euler spiral based stroke expansion (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;496&quot;&gt;vello#496&lt;&#x2F;a&gt;) enables GPU stroking by default, significantly improving performance in scenes which make heavy use of strokes.
Additionally, we now support scenes with more than 64k draw objects (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;526&quot;&gt;vello#526&lt;&#x2F;a&gt;).
We have also been making progress on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;issues&#x2F;366&quot;&gt;vello#366&lt;&#x2F;a&gt;, by evaluating different strategies for memory allocation.
The first part of this has landed in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;537&quot;&gt;vello#537&lt;&#x2F;a&gt;, which avoids undefined behaviour in more out-of-memory cases.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, we have been able to continue taking advantage of improvements in the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;googlefonts&#x2F;fontations&quot;&gt;foundational font crates&lt;&#x2F;a&gt; from Google Fonts.
This has enabled support for font fallback in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;196&quot;&gt;xilem#196&lt;&#x2F;a&gt;.
Hinting has been unblocked by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;544&quot;&gt;vello#544&lt;&#x2F;a&gt;, although the implementation has not yet landed in Xilem.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;blob&#x2F;main&#x2F;rfcs&#x2F;0005-version-matrix.md&quot;&gt;rfcs#5&lt;&#x2F;a&gt; has been approved, which will improve the robustness of our continuous integration.
Kaur Kuut, the author of the RFC, has also landed these changes in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;523&quot;&gt;vello#523&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A focus for the next month is preparing for the &lt;a href=&quot;https:&#x2F;&#x2F;2024.rustnl.org&#x2F;&quot;&gt;RustNL conference&lt;&#x2F;a&gt; at the beginning of May.
We are hoping to present a compelling demo there.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, February 2024</title>
        <published>2024-03-04T07:34:42+00:00</published>
        <updated>2024-03-04T07:34:42+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-02/"/>
        <id>https://linebender.org/blog/tmix-02/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-02/">&lt;p&gt;Early this year, we made a decision to use the winit crate for window creation, as opposed to rolling our own.
That work has now landed in main (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;176&quot;&gt;xilem#176&lt;&#x2F;a&gt; was the main PR, with a number of followups).
A major motivation was to enable more platforms, with Android being a major goal.
That work is in progress; a major subtask is enumerating the system fonts.
As expected, this move has uncovered rough edges in winit and some regressions in behavior.
We plan to address those, with the improvements hopefully benefiting the entire Rust UI ecosystem.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;vello&quot;&gt;Vello crate&lt;&#x2F;a&gt; has been published as version 0.1, with significant documentation improvements and a friendly example.
We consider this an alpha-quality release, as there are known issues.
Even so, we want to get a release out to facilitate integrations and shake out problems.&lt;&#x2F;p&gt;
&lt;p&gt;Another major area of work on Vello is investigation of startup time, which can take multiple seconds when the platform&#x27;s GPU drivers are slow at compiling the compute shaders.
A number of techniques mitigate that.
One is to compile shaders in parallel, using multiple cores, and that has landed (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;455&quot;&gt;vello#455&lt;&#x2F;a&gt;).
An even bigger improvement will be caching compiled shaders.
Daniel McNab has made an encouraging prototype (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;459&quot;&gt;vello#459&lt;&#x2F;a&gt;), and the ultimate goal is to land that in wgpu so projects across the ecosystem can benefit from it (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gfx-rs&#x2F;wgpu&#x2F;pull&#x2F;5292&quot;&gt;wgpu#5292&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;The work to compute strokes on the GPU using Euler spirals continues, but has not yet landed.
The current state is a draft PR that implements the logic in Rust code, which now needs to be translated to WGSL for GPU evaluation (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;496&quot;&gt;vello#496&lt;&#x2F;a&gt;, draft PR).&lt;&#x2F;p&gt;
&lt;p&gt;There has been progress at higher levels of Xilem.
Among other things, Nico Burns landed a scroll view implementation (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;155&quot;&gt;xilem#155&lt;&#x2F;a&gt;), and Philipp Mildenberger has been steadily refining xilem_core and xilem_web, including fine grained tree structure tracking and minimal&#x2F;efficient DOM-tree-updates (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;pull&#x2F;160&quot;&gt;xilem#160&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>This Month in Xilem, January 2024</title>
        <published>2024-02-06T07:28:42+00:00</published>
        <updated>2024-02-06T07:28:42+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/tmix-01/"/>
        <id>https://linebender.org/blog/tmix-01/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/tmix-01/">&lt;p&gt;Welcome to the first in the “this month in Xilem” series, bringing updates on the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&quot;&gt;Xilem&lt;&#x2F;a&gt; UI toolkit.&lt;&#x2F;p&gt;
&lt;p&gt;There were two blog posts on the new &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&quot;&gt;Linebender blog&lt;&#x2F;a&gt;.
The first, &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;xilem-2024&#x2F;&quot;&gt;Xilem 2024 plans&lt;&#x2F;a&gt;, sets out the goals for the project for the year.
The second, &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;xilem-backend-roadmap&#x2F;&quot;&gt;Roadmap for the Xilem backend in 2024&lt;&#x2F;a&gt;, by Olivier Faure, presents a roadmap for the Xilem native widget set.
A major feature of the roadmap is a clean boundary between the Xilem reactive framework and the lower level widget set.
We hope that enables experimentation with other reactive frameworks and possibly integration with other projects, rather than requiring everybody to buy into the Xilem stack.&lt;&#x2F;p&gt;
&lt;p&gt;On the planning front, a major decision was whether to continue work on our own window creation library, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;glazier&quot;&gt;Glazier&lt;&#x2F;a&gt;, or whether to join forces with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-windowing&#x2F;winit&quot;&gt;winit&lt;&#x2F;a&gt;.
Among other things, since Android is a primary target for our work, and winit already has a working Android back-end, it offers an appealing path to getting that up quickly.
We have decided to try joining forces with winit, and look forward to future collaboration.
Over the next few weeks, that will entail porting Xilem over to winit (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;issues&#x2F;163&quot;&gt;xilem#163&lt;&#x2F;a&gt;) and also trying to land working Android IME (soft keyboard) support in winit (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-windowing&#x2F;winit&#x2F;pull&#x2F;2993&quot;&gt;winit#2993&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;In Vello, a major advance was porting the low level font handling code from the experimental swash crate to the production-quality &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;googlefonts&#x2F;fontations&quot;&gt;skrifa&lt;&#x2F;a&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&#x2F;pull&#x2F;423&quot;&gt;vello#423&lt;&#x2F;a&gt;).
Skrifa is being developed by Google Fonts as a memory safe library for loading font files, and is integrated into Chromium builds.
Over the coming weeks, a goal is to release Vello (and supporting crates) on crates.io.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Roadmap for the Xilem backend in 2024</title>
        <published>2024-01-19T13:00:00+00:00</published>
        <updated>2024-01-19T13:00:00+00:00</updated>
        
        <author>
          <name>
            Olivier Faure
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/xilem-backend-roadmap/"/>
        <id>https://linebender.org/blog/xilem-backend-roadmap/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/xilem-backend-roadmap/">&lt;p&gt;As you may have heard by now, Google Fonts is funding me this year to work on Xilem.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m not alone in that: Aaron Muir Hamilton, Daniel McNab and Matt Campbell were funded as well to work on various parts of the ecosystem. I believe this is Matt&#x27;s third year getting funding from Google Fonts.&lt;&#x2F;p&gt;
&lt;p&gt;Now, &lt;em&gt;what&lt;&#x2F;em&gt; I was hired to do might be unclear to you. The scope we agreed on was fairly broad and was stated as &quot;contributing to Xilem&#x27;s view tree and developer experience&quot;, but that could mean a lot of things.&lt;&#x2F;p&gt;
&lt;p&gt;The first thing I want to do is communicate a clearer picture. I have a a lot of plans for Xilem, and they involve major changes from the current architectures, changes that might be worrying to the community at large or even to Raph Levien. I certainly don&#x27;t want to give the impression that I&#x27;m wresting the project away from the Linebender community for Google&#x27;s interest, and that means being transparent early and often about the things I want to rework.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-want-for-xilem&quot;&gt;What I want for Xilem&lt;&#x2F;h2&gt;
&lt;p&gt;Xilem is a research-and-development project, the latest in a series (Xi-Core, Druid, Crochet, Lasagna, Idiopath), that aims to explore how UI development can be made compatible with Rust.&lt;&#x2F;p&gt;
&lt;p&gt;This might feel a little banal now, because Rust GUI frameworks are popping up everywhere and starting to settle on similar patterns, but those patterns weren&#x27;t obvious in 2019! Xilem is very different from Druid, and getting to its current architecture has been a process.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem has been perma-experimental since May 2022. Once it got started, the main Druid maintainers stopped contributing almost entirely with the expectation that Xilem would replace Druid once it was ready. Unfortunately, it still hasn&#x27;t made enough progress to be on parity with Druid, yet Druid still lies abandoned, which isn&#x27;t great when people had started relying on it.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s debatable how much this could have been avoided. As I&#x27;ve pointed out before, the Rust GUI ecosystem is subject to massive &lt;a href=&quot;https:&#x2F;&#x2F;seths.blog&#x2F;2005&#x2F;03&#x2F;dont_shave_that&#x2F;&quot;&gt;yak-shaving&lt;&#x2F;a&gt;: many of us came here because we wanted to build a text editor, and now we&#x27;re all learning about &lt;a href=&quot;https:&#x2F;&#x2F;faultlore.com&#x2F;blah&#x2F;text-hates-you&#x2F;&quot;&gt;text rendering&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;lord.io&#x2F;text-editing-hates-you-too&#x2F;&quot;&gt;text editing&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;ui&#x2F;graphics&#x2F;2020&#x2F;09&#x2F;13&#x2F;compositor-is-evil.html&quot;&gt;compositing&lt;&#x2F;a&gt;&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;accesskit.dev&#x2F;accesskit-integration-makes-bevy-the-first-general-purpose-game-engine-with-built-in-accessibility-support&#x2F;&quot;&gt;accessibility trees&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;gpu&#x2F;2021&#x2F;05&#x2F;13&#x2F;stack-monoid-revisited.html&quot;&gt;using monoids to implement stuff on the GPU&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.leafwing-studios.com&#x2F;blog&#x2F;ecs-gui-framework&#x2F;&quot;&gt;ECS&lt;&#x2F;a&gt;, and some concepts that I&#x27;m absolutely certain Raph made up like &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;curves&#x2F;2023&#x2F;04&#x2F;18&#x2F;bezpath-simplify.html&quot;&gt;Bézier paths&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;rust&#x2F;2023&#x2F;04&#x2F;01&#x2F;rust-to-cpp.html&quot;&gt;C++&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And to a certain extent, yak-shaving is good! &quot;I&#x27;m going to do better than X without learning how X works&quot; is a child&#x27;s attitude. It&#x27;s the attitude we all start with, and it fills us with courage, but that courage is naive. True improvement comes from keeping that courage after spending years learning how immense the problem space is, and keeping faith that it&#x27;s possible to do better. The Rust community is one that values not just doing things from scratch, but also learning from the past to get them right.&lt;&#x2F;p&gt;
&lt;p&gt;This is good, but the &quot;get them right&quot; part takes a lot of time, and in the meantime, I&#x27;d argue that we&#x27;ve neglected end users a bit. We&#x27;ve abandoned Druid before Xilem was ready as an alternative, and then we worked on foundational and experimental projects that would make Xilem stronger and sounder in the long term, but left the project in an awkward state in the meantime (except for the web backend, which made a lot of progress).&lt;&#x2F;p&gt;
&lt;p&gt;In the &lt;a href=&quot;https:&#x2F;&#x2F;www.leafwing-studios.com&#x2F;blog&#x2F;ecs-gui-framework&#x2F;&quot;&gt;ECS-backed GUI framework&lt;&#x2F;a&gt; article I linked, Bevy maintainers have this to say:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Not to be too harsh, but a lot of the existing Rust GUI solutions... just aren&#x27;t very good. There&#x27;s a lot of passable options, but they all have non-trivial drawbacks. No one has really risen to the top as a clear winner. [...] Deep down, we all know that we can do better, and we should.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;My ambition is to makes this paragraph obsolete before the end of the year. I want Xilem to get back to being suggested to newbies in the same breath as Iced and SlintUI. In the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.&lt;&#x2F;p&gt;
&lt;p&gt;To give one specific example: my personal goal is to implement seamless hot reloading for Xilem before the end of 2024. I believe it&#x27;s feasible, and I believe doing it will radically change the way people think about Rust GUI, along with &lt;a href=&quot;https:&#x2F;&#x2F;poignardazur.github.io&#x2F;2023&#x2F;02&#x2F;02&#x2F;masonry-01-and-my-vision-for-rust-ui&#x2F;&quot;&gt;other improvements I hope to unlock over time&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In the shorter term, my plan is to focus on basic features, widgets and styling options so people can experiment with Xilem, building on Raph&#x27;s work on Vello over the past year. &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;giannissc&#x2F;172c6c591997ee14f6120134a7990697&quot;&gt;John Skottis&#x27;s Xilem UX Notes&lt;&#x2F;a&gt; give a good picture of the kinds of things I&#x27;ll be working on.&lt;&#x2F;p&gt;
&lt;p&gt;The other big short-term priority is going to be documentation. We&#x27;ve seen a lot of people complain that the Linebender project were poorly documented and hard to get into; it was the most popular reaction to our &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;xilem-2024&#x2F;&quot;&gt;2024 announcement&lt;&#x2F;a&gt;, but it echoed sentiments we&#x27;d seen before. We&#x27;re aware of the problem, and we intend to work on it.&lt;&#x2F;p&gt;
&lt;p&gt;In the medium term, I also plan to work on the performance aspect of Xilem. People from Google Fonts have expressed interest in seeing how much performance we can get from Rust UI. While my mission isn&#x27;t &lt;em&gt;limited&lt;&#x2F;em&gt; to performance work, it will be an ongoing focus, especially since it&#x27;s an area where the Rust language brings unique opportunities. I&#x27;ll go into more details on Rust performance and power efficiency in a later article.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;major-changes-i-want-to-implement-soon&quot;&gt;Major changes I want to implement soon&lt;&#x2F;h2&gt;
&lt;p&gt;These are the big changes I want to work on soon. Realistically, &quot;soon&quot; is going to be relative, because some of these changes are going to be controversial, and part of the work is going to be convincing people of their value.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;switching-to-masonry-as-a-backend&quot;&gt;Switching to Masonry as a backend&lt;&#x2F;h3&gt;
&lt;p&gt;Okay, this one makes me blush a little.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m the only maintainer of Masonry, a GUI crate with barely over 300 stars on GitHub and little outside interest. Can I really justify taking the money Google pays me to improve Xilem and spending my time on Masonry instead?&lt;&#x2F;p&gt;
&lt;p&gt;That choice isn&#x27;t random, mind you: Masonry was forked from Druid, Xilem&#x27;s ancestor, and in fact Xilem and Masonry share a lot of code right now.&lt;&#x2F;p&gt;
&lt;p&gt;In fact, I&#x27;d argue that Masonry&#x27;s codebase is of better quality than Xilem&#x27;s current native backend. This isn&#x27;t meant to be a put-down of the work of Xilem maintainers; rather, it&#x27;s the outcome of a difference in priorities. Nobody was very interested in Xilem&#x27;s native backend (though Raph was aware of its importance, hence me getting paid to write this), and lots of people were very interested in the frontend and the web backends, therefore the frontend and web backends saw the most work.&lt;&#x2F;p&gt;
&lt;p&gt;From our &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;pull&#x2F;1&quot;&gt;RFC#0001&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a result, Xilem&#x27;s native backend is in a poor state:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;There is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;blob&#x2F;ea45b9f8c14e3708f0fcbe0a0e1c760f59146323&#x2F;src&#x2F;widget&#x2F;widget.rs#L113-L120&quot;&gt;code commented out&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;There are &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;blob&#x2F;ea45b9f8c14e3708f0fcbe0a0e1c760f59146323&#x2F;src&#x2F;widget&#x2F;mod.rs#L19-L20&quot;&gt;&lt;em&gt;entire modules&lt;&#x2F;em&gt; commented out&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;There is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;blob&#x2F;ea45b9f8c14e3708f0fcbe0a0e1c760f59146323&#x2F;src&#x2F;widget&#x2F;widget.rs#L51-L71&quot;&gt;documentation referring to items from Druid that no longer exist&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;There are &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;xilem&#x2F;blob&#x2F;ea45b9f8c14e3708f0fcbe0a0e1c760f59146323&#x2F;src&#x2F;widget&#x2F;core.rs#L569C5-L569C66&quot;&gt;TODOs without an associated issue&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Masonry&#x27;s backend codebase is a healthier starting point.  Masonry also comes with some built-in perks, like powerful unit tests and a structured widget graph.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s not clear whether we want to import the Masonry codebase, the crate, or the entire repository, and it&#x27;s not clear what the ultimate branding should be. The RFC lays out the different possibilities, and discussion is still ongoing, so the community can reach a consensus before doing more work (including possibly not using Masonry at all).&lt;&#x2F;p&gt;
&lt;p&gt;If we do move forward with this, then Masonry will need some porting work:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Using Vello and Parley instead of Piet.&lt;&#x2F;li&gt;
&lt;li&gt;Using Glazier instead of druid-shell.&lt;&#x2F;li&gt;
&lt;li&gt;Integrating AccessKit.&lt;&#x2F;li&gt;
&lt;li&gt;Removing the dependency on GTK.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;AccessKit support in particular is table stakes, by now. The Rust ecosystem is converging on the idea that accessibility (or at least, screen reader support) should be integrated early on in the design of GUI frameworks, not tacked on at the end.&lt;&#x2F;p&gt;
&lt;p&gt;There are other things Xilem added over Druid (notably virtual lists and async support), but I believe Masonry doesn&#x27;t need to implement them right away for parity. Both will be very important for eventual performance work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;avoiding-custom-widgets&quot;&gt;Avoiding custom Widgets&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m told by Raph this is a &quot;molotov cocktail&quot; which, uh, fair.&lt;&#x2F;p&gt;
&lt;p&gt;We should write Xilem&#x27;s backend under the assumption that end users of the library (including the Xilem frontend) will very rarely create their own widgets. Instead, they will usually compose the primitives given to them the same way they compose DOM elements in the browser. There will be escape hatches, from a fixed-size canvas surface where end-users can use arbitrary paint primitives to full-on custom widget code, but we should design the framework under the assumption people will almost never &lt;em&gt;need&lt;&#x2F;em&gt; those hatches.&lt;&#x2F;p&gt;
&lt;p&gt;Clearly, this is a radical move. &lt;strong&gt;There will be a prototyping phase before we choose whether we commit to it&lt;&#x2F;strong&gt;, and RFCs to lay out the details. I&#x27;m confident it will pay off.&lt;&#x2F;p&gt;
&lt;p&gt;Developers of hobby GUI frameworks tend to provide a severely anemic set of primitives, under the assumption that if anyone wants other features in their widgets, they can implement them themselves. Both Druid and Xilem suffer from this.&lt;&#x2F;p&gt;
&lt;p&gt;On the other end of the spectrum, the web has shown that you can implement complex custom UIs given a rigid but rich set of primitives.&lt;&#x2F;p&gt;
&lt;p&gt;More importantly, the web is moving towards a powerful paradigm: declarative UI. As time goes on, people are realizing you can get better performance and composition by describing what things should look like and composing them than by imperatively making them do things.&lt;&#x2F;p&gt;
&lt;p&gt;Part of this is that native code is more performant than JS, but part of it just that declarative code is easier to work around than imperative code: its bounds are better defined, it lets you &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;CSS&#x2F;contain&quot;&gt;commit to limitations&lt;&#x2F;a&gt; that make the engine&#x27;s job easier, and it&#x27;s easier to analyze.&lt;&#x2F;p&gt;
&lt;p&gt;A set of proposals called &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;Houdini&quot;&gt;CSS Houdini&lt;&#x2F;a&gt; came out that went in the exact opposite direction: pushing the layout engine towards more customization and JavaScript code. The proposal hasn&#x27;t seen much movement since 2021, and I don&#x27;t think it&#x27;s a coincidence that the part that would have given the most power to imperative code, the Layout API, hasn&#x27;t been stabilized in any browser.&lt;&#x2F;p&gt;
&lt;p&gt;The bottom line is that, while implementing custom widgets &lt;em&gt;will always be possible&lt;&#x2F;em&gt;, I want to encourage developers to go as far as they can composing declarative elements instead, and see how far it&#x27;s possible to go using those building blocks.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;more-opinionated-layout&quot;&gt;More opinionated layout&lt;&#x2F;h4&gt;
&lt;p&gt;One major customization point I want to restrict in Xilem is layout.&lt;&#x2F;p&gt;
&lt;p&gt;Today all Rust GUI frameworks ship their own layout algorithm, but none of them are &lt;em&gt;competing&lt;&#x2F;em&gt; on their layout algorithm. Often the layout algorithm is just a means to an end; developers that do want to work on a state-of-the-art layout engine will provide it in a modular crate like &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vizia&#x2F;morphorm&quot;&gt;Morphorm&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DioxusLabs&#x2F;taffy&quot;&gt;Taffy&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And here&#x27;s the thing: realistically, most layout engines aren&#x27;t that creative. Every Rust framework and every major GUI framework I&#x27;m aware of uses layout that boils down to &quot;FlexBox with small variations&quot;. The number of meaningfully different ways to do GUI layout can be counted on, generously, two hands.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;d argue we only need CSS Flow, FlexBox, CSS Grid, and maybe Morphorm to cover most people&#x27;s needs. Conveniently, this is what Taffy aims to provide. There&#x27;s already an experimental Taffy integration in Xilem, and I want to make it deeper.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, there won&#x27;t be a hard-coded set of layout algorithms. Rather, layout will rely on a web-inspired protocol between widgets (in other words, trait methods), and that protocol will be strongly opinionated to make implementation of these layout algorithms easier.&lt;&#x2F;p&gt;
&lt;p&gt;More on this in a latter blog post.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;no-boxing&quot;&gt;No boxing&lt;&#x2F;h4&gt;
&lt;p&gt;Having a semi-fixed set of widgets means you can avoid using &lt;code&gt;Box&amp;lt;dyn Widget&amp;gt;&lt;&#x2F;code&gt;, which has some interesting performance implications.&lt;&#x2F;p&gt;
&lt;p&gt;It means you can add a lot of methods to the Widget trait without worrying about bloating the vtable. And you can write methods under the assumption that they&#x27;ll be inlined, which opens up interesting DX improvements.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;using-ecs-maybe-sort-of&quot;&gt;Using ECS, maybe, sort of&lt;&#x2F;h3&gt;
&lt;p&gt;In current Xilem code, if you want your FlexWidget to have children, it must have a &lt;code&gt;Vec&amp;lt;Pod&amp;lt;ChildWidget&amp;gt;&amp;gt;&lt;&#x2F;code&gt; member. Each Pod directly owns a Widget.&lt;&#x2F;p&gt;
&lt;p&gt;I think this is an interesting quirk of Rust GUI, tying directly to Rust&#x27;s ownership semantics. Non-Rust frameworks often use pointers to child widgets, true, but they&#x27;re often shared with the framework, with an understanding that the framework is charged with keeping track of how many widgets there are and which is a child of which. In Qt, for instance, it&#x27;s preferred (but not mandatory) for parents to call &lt;code&gt;delete_later()&lt;&#x2F;code&gt; on their children instead of &lt;code&gt;delete&lt;&#x2F;code&gt;, because it plays better with event handling.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem&#x27;s approach of &quot;you own your children&quot; is a little bespoke. It means the framework has a hard time iterating over the entire widget tree (say, as part of a DOM inspector) unless each Widget specifically implements the iterating method. And it means if you want to target an event at a specific widget (say, the one with keyboard focus), you need to go through the entire ownership chain, using some heuristics to avoid visiting too many widgets.&lt;&#x2F;p&gt;
&lt;p&gt;I believe Widgets should be owned by the library. If your container has children, then the only thing the container will actually own is keys into a structure (probably a slotmap) where the widget is stored. This makes a lot of things easier, like serialization and debugging, but it has an impact on the entire backend. It&#x27;s an infrastructure investment.&lt;&#x2F;p&gt;
&lt;p&gt;Lately, I&#x27;ve seen more and more discussion of implementing GUI through an ECS. A lot of that discussion comes from Bevy, which is natural, since the bevy community &lt;del&gt;is made up of ruthless cultists striving to feed ever more sacrifices to the ECS god until it consumes the Earth&lt;&#x2F;del&gt; is intimately familiar with the ECS pattern and has reached a phase where UI work is getting a lot of attention&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. But I&#x27;ve seen discussions about it in the Linebender community too.&lt;&#x2F;p&gt;
&lt;p&gt;Whether we actually want to use ECS is something we still need to research.&lt;&#x2F;p&gt;
&lt;p&gt;The way I understand it, the big draw of ECS is the &quot;S&quot; part, the Systems: it&#x27;s about handling lots of similar data at once in arbitrary order. Which is why eg archetypes in bevy are useful: you&#x27;re grouping together entities with the same components, so that you can say &quot;execute this code for all entities with component X and component Y&quot; and have this code be executed on arrays of values with minimal indirection or branching. And the &quot;arbitrary order&quot; part makes them work really well with slotmaps: since you can just read from the beginning of the slotmap, you don&#x27;t pay the double-indirection penalty.&lt;&#x2F;p&gt;
&lt;p&gt;In other words, the ideal use case for ECS is code of the type &lt;code&gt;for (entity in entities) entity.position += entity.speed&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;GUI is pretty far from that ideal use-case: updates are sparse and should only run on a small number of changed widgets. Order often matters. And I&#x27;m not sure archetypes would work in a framework with a large variety of widgets and different attributes.&lt;&#x2F;p&gt;
&lt;p&gt;I think there are two things you really want from a Rust ECS library for GUI: slotmaps, and efficient ways to add and remove components from an entity.&lt;&#x2F;p&gt;
&lt;p&gt;Implementing those is going to be a major undertaking, which we&#x27;ll have to divide into small experiments, but one I expect to pay many times over.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;community-involvement-and-more-to-come&quot;&gt;Community involvement and more to come&lt;&#x2F;h2&gt;
&lt;p&gt;I want to really put emphasis on something: none of the above is set in stone.&lt;&#x2F;p&gt;
&lt;p&gt;Part of what Raph wants to achieve this year is to make Xilem more of a community project, and that means running more decisions by the community.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve created &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&#x2F;&quot;&gt;an RFC repository&lt;&#x2F;a&gt; for this, and each of the sections above will get its own RFC, where I&#x27;ll expand on my rationale in more detail.&lt;&#x2F;p&gt;
&lt;p&gt;This isn&#x27;t a rubber-stamping process either: I want to implement those ideas, but if the community&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; decides that they are bad, then we&#x27;ll go another direction.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s other ideas I haven&#x27;t discussed yet that I want to come back to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Declarative styling:&lt;&#x2F;strong&gt; Giving Widgets attributes similar to CSS properties, with modifiers for animations, pseudo-classes, media queries and container queries. While inspired by CSS, it wouldn&#x27;t involve any CSS parsing, selector resolution, specificity resolution, etc.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Compositing:&lt;&#x2F;strong&gt; Xilem is heading towards a &quot;do everything in the GPU&quot; approach. This is good for performance, but Firefox engineers who have gone down this road before us have warned us of the many perils they faced, especially regarding battery life. In general, after layout and painting, you really want a &lt;code&gt;composite()&lt;&#x2F;code&gt; phase to deal with scrolling and some simple animations without touching the GPU at all if possible. &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;ui&#x2F;graphics&#x2F;2020&#x2F;09&#x2F;13&#x2F;compositor-is-evil.html&quot;&gt;This is a complex subject&lt;&#x2F;a&gt;, and it would be nice if we could hide most of that complexity from app developers while still giving them good performance.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Resource loading:&lt;&#x2F;strong&gt; This is another area where we might want to crib from game engines. At the very least, we want to be able to ask &quot;Load me this texture&#x2F;shader&#x2F;font&#x2F;etc&quot; without having to write disk I&#x2F;O in user code. Then we can start thinking about progressive loading, fallbacks, sharing, etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These ideas are likely to be the subject of further articles and&#x2F;or RFCs in the near future.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;relations-with-other-projects&quot;&gt;Relations with other projects&lt;&#x2F;h3&gt;
&lt;p&gt;Presenting the current state of the Rust GUI ecosystem would probably take its own article.&lt;&#x2F;p&gt;
&lt;p&gt;Things are moving quickly, and anything I write now might not be up to date in two weeks. The projects we&#x27;re most interested in right now are Winit and Bevy, and there&#x27;s some potential for cooperation with Servo. The COSMIC ecosystem looks pretty cool, but so far it looks like we have less to share with them.&lt;&#x2F;p&gt;
&lt;p&gt;People from parallel projects are communicating and exchanging much, &lt;em&gt;much&lt;&#x2F;em&gt; more than they were in 2022. Between Vello, Parley, wgpu, Taffy, COSMIC-Text and others, projects are converging and maintainers are making more effort to reach out and integrate other people&#x27;s code.&lt;&#x2F;p&gt;
&lt;p&gt;Stay tuned for more!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hey-this-is-really-cool&quot;&gt;Hey, this is really cool!&lt;&#x2F;h2&gt;
&lt;p&gt;Something that came up in discussions I&#x27;ve had with Raph is that it&#x27;s easy to miss the forest for the trees. In the middle of all the paperwork, blog-writing, RFC-writing, we can end up focusing on the process so much that we forget how excited we are.&lt;&#x2F;p&gt;
&lt;p&gt;So, I&#x27;m taking the moment to remind myself: this is really freaking exciting!&lt;&#x2F;p&gt;
&lt;p&gt;For all my criticisms and caveats and realistic assessments of the problems we need to overcome, I&#x27;m still feeling absolutely great about this!&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m super thankful to Raph for getting us this far, to Google Fonts for sponsoring us, and to everyone else who contributed to the Linebender ecosystem. I think we can do something amazing and I&#x27;m honestly a little startled to be in this position at all.&lt;&#x2F;p&gt;
&lt;p&gt;To reiterate what I said: in the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.&lt;&#x2F;p&gt;
&lt;p&gt;I legitimately think Rust has the potential to get best-in-class GUI frameworks, and now the time has come to prove it.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;By the way, I love this style of writing where we start humanizing a software process and complaining about how much it wants to kill us. The articles I cited are very high-quality too.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;I&#x27;m told the Bevy community found that joke funny, but I was too afraid for my sanity to check on their Discord server.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;&#x2F;sup&gt;
&lt;p&gt;&quot;The community&quot; is a nebulous concept here. For obvious reason, we&#x27;ll give more weight to the opinions of people who have already put work into the Linebender ecosystem, but the general hope is to get a consensus from everyone involved. And you&#x27;re welcome to weigh in even if you haven&#x27;t contributed before.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Xilem 2024 plans</title>
        <published>2024-01-10T07:34:42+00:00</published>
        <updated>2024-01-10T07:34:42+00:00</updated>
        
        <author>
          <name>
            Raph Levien
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://linebender.org/blog/xilem-2024/"/>
        <id>https://linebender.org/blog/xilem-2024/</id>
        
        <content type="html" xml:base="https://linebender.org/blog/xilem-2024/">&lt;p&gt;2024 promises to be an exciting year for Xilem. The big news is that Google Fonts is funding the work of four open source contributors to the project: Aaron Muir Hamilton, Daniel McNab, Matt Campbell, and Olivier Faure.&lt;&#x2F;p&gt;
&lt;p&gt;Aaron will be working on text layout, building on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dfrg&#x2F;parley&quot;&gt;parley&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;lord.io&#x2F;text-editing-hates-you-too&#x2F;&quot;&gt;text input&lt;&#x2F;a&gt; including IME, and Android platform integration. Daniel will be working on GPU infrastructure and performance, with much of the work upstreamed to &lt;a href=&quot;https:&#x2F;&#x2F;wgpu.rs&#x2F;&quot;&gt;wgpu&lt;&#x2F;a&gt;. Matt will be working on accessibility, and Olivier will be building the core widget tree, with a focus on developer experience.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem is an ambitious project to explore the limits of UI performance, as described in my &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;zVUTZlNCb8U&quot;&gt;High Performance Rust UI&lt;&#x2F;a&gt; talk. The goals include gathering knowledge about the viability of Rust for UI, and what patterns work well. While there is a research focus, we plan to gather this information by building a real toolkit, solving many of the hard problems. The current state of the project is a fairly rough, though promising, prototype, so there is much work to be done. It’s exciting to have the bandwidth and experience of these people working toward that goal, but perhaps the most exciting prospect is bringing together more of the community, people passionate about building high quality UI. Our goal as an open source community is to facilitate that, and to coordinate the work efficiently. What we have now is not a production-ready product, but we wish to move in that direction, including quality documentation - some of the consistent feedback we’re getting about the current state.&lt;&#x2F;p&gt;
&lt;p&gt;Another goal is to bake in accessibility from the start. Too often, it’s an afterthought, tacked on at the end. We’re excited to have Matt, primary author of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AccessKit&#x2F;accesskit&quot;&gt;AccessKit&lt;&#x2F;a&gt;, on board.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem is designed in layers, with a reactivity layer on top, a widget tree adapted from &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;druid&quot;&gt;Druid&lt;&#x2F;a&gt;, and with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;vello&quot;&gt;Vello&lt;&#x2F;a&gt; as the 2D rendering engine. These layers are designed to work well together, but the individual pieces may be useful in other contexts. The funded work will focus on Android as a target, but is intended to work well on desktop platforms as well; this is one of the core strengths of the Rust ecosystem. We don’t have iOS as an immediate priority, but attention from the open source community could change that, and the foundations should support it.&lt;&#x2F;p&gt;
&lt;p&gt;The status of the web backend for the Xilem widget set is more complex. Simply put, it is not a priority for us right now. We have done some explorations into generating DOM nodes from Xilem, but doing it well would increase scope and complexity beyond what we’re comfortable with. For applications deployed &lt;em&gt;primarily&lt;&#x2F;em&gt; on the web, xilem_web (which generates DOM nodes) should be a viable choice, with the possibility of Tauri or Electron for desktop deployment. To enable online demos of native applications, it is most likely that we will implement a version which draws to a canvas element. This has limitations in accessibility and native look and feel - for example, text input and scrolling may behave contrary to user expectations. Until more work is done refining the web backend, we would not recommend this approach for production applications using Xilem.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2023-retrospective&quot;&gt;2023 retrospective&lt;&#x2F;h2&gt;
&lt;p&gt;Looking back at 2023, there was a great deal of foundational work. Much of the effort was on Vello, the 2D rendering engine that serves as the graphical foundation of the project. A particular strength is high performance path rendering on GPU, which enables fully dynamic text effects including animation of variable font parameters. Though we had a reasonably good implementation of path rendering in place, much of the second half of the year was taken up by “stroke rework” which computes all stroke styles on the GPU, and also improves the performance and accuracy of antialiasing for all paths. To this end, we invented new computational geometry algorithms for computing parallel curves, the newest based on &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;curves&#x2F;2021&#x2F;02&#x2F;19&#x2F;parallel-curves.html&quot;&gt;Euler spirals&lt;&#x2F;a&gt;, with some elegant math tuned for GPU evaluation. A writeup explaining the details is in the pipeline.&lt;&#x2F;p&gt;
&lt;p&gt;There was slow and steady work on the higher levels of the stack as well, including factoring out the reactive layer into a generic xilem_core module, and validating that with generation of DOM nodes for browser deployment. The widget tree saw some development as well, including integration with the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DioxusLabs&#x2F;taffy&quot;&gt;Taffy&lt;&#x2F;a&gt; layout engine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;governance-and-community&quot;&gt;Governance and community&lt;&#x2F;h2&gt;
&lt;p&gt;Though we now are funded to work on the project, the open source nature of the projects continues unchanged. We’ve been building up infrastructure for open source community, including a &lt;a href=&quot;https:&#x2F;&#x2F;xi.zulipchat.com&#x2F;&quot;&gt;Zulip instance&lt;&#x2F;a&gt;, weekly office hours, &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;wiki&#x2F;&quot;&gt;wiki&lt;&#x2F;a&gt;, and, as of this post, a shared &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;blog&#x2F;&quot;&gt;blog&lt;&#x2F;a&gt;. Our &lt;a href=&quot;https:&#x2F;&#x2F;linebender.org&#x2F;contributor-guidelines&#x2F;&quot;&gt;contributor guidelines&lt;&#x2F;a&gt; explain a bit about our processes. Almost all decision making is by consensus. Only very rarely do I need to step in and tie-break. As we scale up, we’re going to be more systematic, starting to use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;rfcs&quot;&gt;RFC documents&lt;&#x2F;a&gt; for major changes.&lt;&#x2F;p&gt;
&lt;p&gt;We’re intentionally designing our community to foster learning and collaboration. For example, discussions are on Zulip rather than Discord because it’s searchable, meaning that the same questions are less likely to come up over and over. Its grouping into topics lets participants quickly skim activity as opposed to getting drowned in chatter. It’s working well for us. We also invite others in the Rust UI ecosystem to use our Zulip and wiki. As the Kurzgesagt video &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=fuFlMtZmvY0&quot;&gt;The Internet is Worse Than Ever – Now What?&lt;&#x2F;a&gt; observes, large social spaces are degrading, and the video recommends seeking out smaller, more focused communities. I hope ours is one such.&lt;&#x2F;p&gt;
&lt;p&gt;In any case, we are happy to share bits of infrastructure with other Rust UI efforts, and are always eager to learn from them. I see many of us working toward common goals rather than competing, even if there are different approaches and priorities.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts-on-the-rust-ui-ecosystem&quot;&gt;Thoughts on the Rust UI ecosystem&lt;&#x2F;h2&gt;
&lt;p&gt;I’ve been thinking about doing UI in Rust for about 8 years now, and have explored many, many approaches. I’m not alone in this, there have been well over two dozen projects started.&lt;&#x2F;p&gt;
&lt;p&gt;As mentioned in a &lt;a href=&quot;https:&#x2F;&#x2F;raphlinus.github.io&#x2F;rust&#x2F;gui&#x2F;2022&#x2F;07&#x2F;15&#x2F;next-dozen-guis.html&quot;&gt;previous blog&lt;&#x2F;a&gt;, any given application will have a set of requirements. Is Web one of the main deployment targets? Will there be embedded video? Is there a need to integrate with some other subsystems, such as a game engine? Each of these has profound implications. Some problem spaces (compilers are an example) are “smooth,” in that continual refinement will lead to fairly similar outcomes no matter the starting point, but over time I’ve come to the conclusion that UI is especially lumpy. I believe this contributes to the continuing pattern of new UI toolkits coming out every couple months or so; the author surveys what’s available, finds none that match the specific set of requirements, and creates a new one.&lt;&#x2F;p&gt;
&lt;p&gt;In some ways, Xilem is in the same pattern, but there are &lt;em&gt;some&lt;&#x2F;em&gt; things we’re doing differently. For one, it’s explicitly a research project, with knowledge about how to build UI in Rust an outcome possibly as important as the codebase. We’re trying to be systematic about finding the best ways to do things, which ideally will make some solutions more general. And, increasingly, we’re designing things as modular layers that can be swapped out. With luck, even if people don’t end up adopting the entire stack, there will be some useful components for the ecosystem.&lt;&#x2F;p&gt;
&lt;p&gt;A good overview of the opportunities and challenges in Rust UI, particularly for making mobile apps, is &lt;a href=&quot;https:&#x2F;&#x2F;wingolog.org&#x2F;archives&#x2F;2023&#x2F;06&#x2F;15&#x2F;parallel-futures-in-mobile-application-development&quot;&gt;parallel futures in mobile application development&lt;&#x2F;a&gt; by Andy Wingo. The linked blog posts in that series also go into considerable detail about JavaScript and TypeScript based approaches, which have important lessons as well.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;declarative-ui-patterns&quot;&gt;Declarative UI patterns&lt;&#x2F;h3&gt;
&lt;p&gt;The trend in UI programming has been overwhelmingly away from a soup of mutable objects with interlinked references and toward various declarative or reactive patterns. That’s a good thing for Rust UI, because the former is very un-ergonomic in Rust.&lt;&#x2F;p&gt;
&lt;p&gt;In the JavaScript world, there is a Cambrian explosion of reactive techniques. React is by far the most popular, but there is a strong sentiment it’s possible to be better, particularly on performance, but also robustness, as the logic for deciding &lt;a href=&quot;https:&#x2F;&#x2F;www.joshwcomeau.com&#x2F;react&#x2F;why-react-re-renders&#x2F;&quot;&gt;when to re-render&lt;&#x2F;a&gt; is fickle, and can &lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2310.04368&quot;&gt;miss re-renders&lt;&#x2F;a&gt;. Elm deserves special mention, as its avoidance of global shared mutability makes it particularly easy to adapt to Rust, so it serves as the reactive core of the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;iced-rs&#x2F;iced&quot;&gt;iced&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;antoyo&#x2F;relm&quot;&gt;relm&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vizia&#x2F;vizia&quot;&gt;vizia&lt;&#x2F;a&gt; UI toolkits, as well as &lt;a href=&quot;https:&#x2F;&#x2F;yew.rs&#x2F;&quot;&gt;yew&lt;&#x2F;a&gt; on the WASM side. But there is also &lt;a href=&quot;https:&#x2F;&#x2F;emberjs.com&#x2F;editions&#x2F;octane&#x2F;&quot;&gt;Ember Octane&lt;&#x2F;a&gt; (based on Adapton), a number of fine-grained reactivity approaches such as &lt;a href=&quot;https:&#x2F;&#x2F;www.solidjs.com&#x2F;&quot;&gt;SolidJS&lt;&#x2F;a&gt;, and many, many more (not to mention the incredible diversity of solutions for state management).&lt;&#x2F;p&gt;
&lt;p&gt;We’re seeing much of that diversity mirrored into the Rust world. On the WASM side, we see &lt;a href=&quot;https:&#x2F;&#x2F;dioxuslabs.com&#x2F;&quot;&gt;Dioxus&lt;&#x2F;a&gt; as a fairly faithful adaptation of React, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;leptos-rs&#x2F;leptos&quot;&gt;leptos&lt;&#x2F;a&gt; (also &lt;a href=&quot;https:&#x2F;&#x2F;sycamore-rs.netlify.app&#x2F;&quot;&gt;sycamore&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gbj&#x2F;tachys&quot;&gt;tachys&lt;&#x2F;a&gt;) adhering fairly closely to SolidJS, yew as an adaption of elm, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;flosse&#x2F;rust-web-framework-comparison&quot;&gt;more&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A reactive layer such as Dioxus or leptos can be compiled to WASM and run in a browser to generate DOM nodes. More recently, we’re seeing that it can be decoupled from that environment, and a reactive core can drive a widget tree. Examples include &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;marc2332&#x2F;freya&quot;&gt;Freya&lt;&#x2F;a&gt; which uses Dioxus, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lapce&#x2F;floem&quot;&gt;floem&lt;&#x2F;a&gt; which implements fine-grained reactivity inspired by leptos.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem doesn’t directly correspond to any JavaScript framework; it relies on static typing and is actually closer to SwiftUI than anything web based.&lt;&#x2F;p&gt;
&lt;p&gt;One of the central questions in Rust UI going forward is: which approach to declarative UI is best? It’s possible a clear winner will emerge, or perhaps there will be a different answer depending on the use case, or it might just come down to a matter of personal style, with a number of viable contenders (arguably that’s where JavaScript is). We’re taking a two pronged approach. First, we’re moving forward with Xilem. There’s a specific reason - Xilem is designed to support multithreaded rendering easily, while many of the other frameworks rely on thread local storage for access to a store of observables, an approach with high impedance mismatch to multithreading. Since performance is a goal, we didn’t want to give that up by adopting another framework. I also think Xilem is pretty good, but that remains to be seen.&lt;&#x2F;p&gt;
&lt;p&gt;Another way to gather more evidence on the Xilem declarative layer is to use it to generate DOM nodes in a browser, in other words decouple it from the widget set. As described in the &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=XjbVnwBtVEk&quot;&gt;Xilem Vector Graphics&lt;&#x2F;a&gt; talk, we have been experimenting with that a bit, and a major development in the last year was to factor out the core declarative logic into xilem_core, and also develop a xilem_web layer for creation of DOM nodes. Early indications suggest that this may be a viable alternative to frameworks such as Dioxus and leptos, and we&#x27;re eager to learn more from those explorations.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem is untested, though promising, and it may be that some other approach is better. If so, we’re prepared to pivot. We’ll be designing the widget set so that it doesn’t have a hard-coded dependency on the Xilem declarative layer, and could, at least in theory, be driven from other frameworks. Olivier is author of the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;PoignardAzur&#x2F;masonry-rs&quot;&gt;masonry&lt;&#x2F;a&gt; crate, where being agnostic to the declarative layer was an explicit goal. He’ll be adapting many of the ideas from that.&lt;&#x2F;p&gt;
&lt;p&gt;Making a widget set agnostic has other potential benefits. While writing app logic in Rust is very promising, there are still compelling reasons to use other languages. A widget tree implemented in Rust with fast graphics and smooth interactivity, scripted in some other language, is compelling. I made a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linebender&#x2F;druid&#x2F;pull&#x2F;2185&quot;&gt;prototype&lt;&#x2F;a&gt; in Python, which, though rough, shows promise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;infrastructure&quot;&gt;Infrastructure&lt;&#x2F;h2&gt;
&lt;p&gt;A UI toolkit depends on a great deal of infrastructure. We’re making careful choices around that, and also looking for opportunities to collaborate with the rest of the ecosystem. One choice I’m particularly excited about is investing in &lt;a href=&quot;https:&#x2F;&#x2F;wgpu.rs&#x2F;&quot;&gt;wgpu&lt;&#x2F;a&gt;. I think WebGPU will move modern GPU usage forward considerably, especially compute shaders, which are heavily used in Vello. This technology will make truly portable applications requiring high compute throughput possible for the first time, and we’re shooting for smooth UI integration with the GPU usage in these applications.&lt;&#x2F;p&gt;
&lt;p&gt;Whether to use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-windowing&#x2F;winit&quot;&gt;winit&lt;&#x2F;a&gt; or build our own platform integration has long been a subject of discussion. We’re reopening that discussion with the winit maintainers as of this writing, but it’s still too early to say whether we’ll join forces, or decide that the goals of the project support having a separate codebase.&lt;&#x2F;p&gt;
&lt;p&gt;A huge part of any UI effort is text, and that’s also a long-standing interest of mine. I’m impressed with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pop-os&#x2F;cosmic-text&quot;&gt;cosmic-text&lt;&#x2F;a&gt; but ultimately we decided to move forward with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dfrg&#x2F;parley&quot;&gt;parley&lt;&#x2F;a&gt;, in part so we can test out ideas with variable fonts. The lower levels of the text stack will be rebased on the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;googlefonts&#x2F;fontations&quot;&gt;fontations&lt;&#x2F;a&gt; work of the Google Fonts team, which is rapidly becoming a production-quality implementation.&lt;&#x2F;p&gt;
&lt;p&gt;Building common infrastructure for accessibility also benefits the entire ecosystem, and we&#x27;re thrilled to see the increasing adoption of AccessKit. Indeed, on all these topics, we’re happy to share what we’re doing with other projects, as most of the infrastructure described above is general in application, rather than specific to our projects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The potential for Rust UI is huge. The Rust language enables top-notch performance and reliability and is also expressive for high-level application logic. We plan to prove that out, based on encouraging existing research and explorations, as well as new research to discover the patterns for Rust UI that work best at scale. This involves work at all levels of the stack, including infrastructure we are happy to share with other Rust UI efforts.&lt;&#x2F;p&gt;
&lt;p&gt;Xilem is still an early prototype. For those who desire a “batteries included” toolkit for building UI, we ask your patience. For those who are interested, you are invited to come build this future with us.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
