This week in SixtyFPS

20th of September to 26th of September 2021

Posted on September 27, 2021

SixtyFPS is a toolkit to efficiently develop fluid graphical user interfaces for any display: embedded devices and desktop applications. We support multiple programming languages, such as Rust, C++, and JavaScript. Find more information at or go straight to github at

SixtyFPS UI Library

  • Font handling

    As a follow-up to last week's improvements to the font handling in the GL backend, this week we did some cleanups and bug fixes.

    • GL backend: minor speed up for font fallback handling ( 1214e4 )

      Avoid the dance of using font-kit to re-discover the same .ttf file and read it all into memory every time we need to render text where the primary font provides insufficient coverage.

    • GL backend: minor speed up in text rendering ( b5de61 )

      Only query fallback fonts from the system if we really need to.

    • Simplify font resolution in the GL backend ( ac0cc8 )

      The font resolution function querying fontdb is fast now, so we can always call it when rendering text. That way we don't need all the indirection in the text_size(), etc. functions, we don't need an entry in the item graphics cache for the font and we can avoid a lot of property dependencies.

    • GL backend: Speed up glyph coverage checking ( 2f1db3 )

      Instead of always mapping the face (from disk), first fan out existing cached coverage information. Any unchecked scripts are then checked in the slow code path with with_face_data later.

    • GL backend: Fix missing glyphs in the slide puzzle demo ( 8fea1b )

      The checkmark and reload have always been missing in some circumstances. The recent fixes with glyph coverage check helped, but they do not account for the fact that characters like the check mark map to the same script (Common). So for these scripts we need to perform an exact glyph coverage check.

  • Build Configuration
  • Making SixtyFPS adapt to the needs of a wide range of projects is important to us.

    • Make it possible to disable x11 support ( 043c19 )

      The GL backend defaults to enabling X11. The default crate depends on the GL backend but it doesn't specify default-features = false, therefore x11 is basically always enabled.

      In line with commit 1fd8c7, this change makes sure that the defaults are defined in the tree entry points: The Rust API crate, the interpreter crate and the CMake project define the defaults. The latter already enabled X11 by default, but the first two did not.

    • Make it possible to use the C++ build with Qt 6 ( 45aa93 )

      Since we require Qt 5.15, we can use the version-less CMake targets and also find Qt 6 first.

  • Bug Fixes
    • Hide the cursor of the disabled TextEdit ( 3f13c6 )

      Fixes #513

    • Fix panic in LSP when declaring animation on layout controlled property ( 5ee005 )

      When an animate foo {} declaration ends up creating an synthetic, invalid BindingExpression, we still need to give it a span, to ensure that the diagnostics produced later have *some* location set.

      Fixes #515

    • Interpreter: add type checking for declared properties ( 730cbf )

      Fixes #512

    • Fix background color of window when viewing non-window elements ( fa8975 )

      The synthetic window we "inject" in the ensure_window() pass did not have the window-background from the style applied. This is visible for example when viewing something like

      Rectangle { background: blue; border-radius: height / 2 }


  • Viewer: add ability to load and save property values from/to json ( 321d98 )

    Fixes #238



17 patches were committed by 2 authors.