Recap from the last post

paw is a non-native GUI library in progress written in Rust. It focuses on providing a declarative user-facing API. Everything is work-in-progress D:

yoga to stretch 🧶

Layouting in paw mainly follows flexbox. A layout tree will be built under the hood along the actual widget tree, which consists of one or multiple smaller flexbox node graphs. As teased in the last post, we recently switched towards stretch to avoid non-Rust dependencies and to benefit from potential performance improvements.

Overall the transition went quite smoothly and suits our targeted application quite well! To fit better within the internals of paw we adjusted the API towards NodeIds instead of Nodes. This is comparable to the common Entity-Component-System: A node will be laid out internally in a large storage container and the user only receives an index for addressing.

Why? It aligns with the architecture of paw as we now have a direct relation between WidgetId and NodeId. Due to some additional savings regarding Rc overhead, removal of dynamic allocations, etc. the overall performance improved also a bit.

There are ongoing efforts in the stretch repository which align with this but placing it on top of salsa. We looking into how we can contribute our changes upstream.

Rendering ✏️

We assessed multiple options for rendering support in the first stage and for later. For now the rendering backend will be using Direct2D + DirectWrite.

It provides support for text, paths, gradients, clipping, custom effects and much more. Everything needed to get started. In the longer terms we try to keep track of the development of libraries with similar goals like WebRender, Pathfinder or piet.