Class VibrancyMatrix

java.lang.Object
com.codename1.ui.plaf.VibrancyMatrix

public final class VibrancyMatrix extends Object

The colour matrix iOS uses to draw VIBRANT content over glass -- tab bar icons and labels, among others.

A vibrant glyph is not painted in its tint. Each of its pixels is a colour transform of whatever lies BEHIND it: out = clamp(M * backdrop + offset), with the glyph's coverage deciding how much of out replaces the backdrop (Graphics.colorMatrixRegion paints exactly that). The tint only chooses the matrix. That is why the selected tab of an iOS tab bar is a different blue over every backdrop, and far more vivid than the plain accent in dark mode.

MEASURED, NOT APPROXIMATED BY EYE. The matrices were read from UIKit itself: the motion probe (scripts/fidelity-app/ios-native-ref/motion-probe) sets a tab bar's tint to thousands of colours on the iOS 27 simulator and reads back the vibrantColorMatrix filter UIKit installs on the item layers. They follow closed forms exactly, with t the tint, d = 1 - t and e = 0.5 * min(t) / max(t):

  • dark: M = e * I + (0.5 - e) * 1 * t^T / |t|^2, offset = t
  • light: M = e * I + 0.3 * (0.5 - e) * (1 + t) * d^T / |d|^2, offset = alpha * (1 + t) - 1 + e * t with alpha = 1 - e - 0.3 * (0.5 - e) * sum(d) / |d|^2, which is what makes a white backdrop come out as exactly t
  • grey tints g (both appearances): M = 5/16 * I / q, offset = (19/16 * g - 1/4) / q with q = 1 + 0.05 * g * (1 - g)

Against every matrix the probe logged (7024 distinct light tints, 1354 dark, and the grey levels of both) the worst entry is off by 5e-6, the precision of the log itself. tabmotion.py vibrancy re-checks them against new captures.

  • Method Summary

    Modifier and Type
    Method
    Description
    static int
    apply(float[] m, int rgb)
    Applies a 12-float colour matrix to one 0xRRGGBB colour (clamped), the per-pixel operation of Graphics.colorMatrixRegion at full coverage.
    static float[]
    forTint(int rgb, boolean dark)
    The vibrancy matrix for content tinted rgb, as 12 floats: three rows (red, green, blue) of [r, g, b, offset], in 0..1 units, the layout Graphics.colorMatrixRegion takes.

    Methods inherited from class Object

    clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • forTint

      public static float[] forTint(int rgb, boolean dark)

      The vibrancy matrix for content tinted rgb, as 12 floats: three rows (red, green, blue) of [r, g, b, offset], in 0..1 units, the layout Graphics.colorMatrixRegion takes.

      Parameters
      • rgb: the tint, 0xRRGGBB

      • dark: true for the dark appearance

      Returns

      a new 12-element matrix

    • apply

      public static int apply(float[] m, int rgb)

      Applies a 12-float colour matrix to one 0xRRGGBB colour (clamped), the per-pixel operation of Graphics.colorMatrixRegion at full coverage.

      Parameters
      • m: the matrix, as returned by #forTint(int, boolean)

      • rgb: the colour, 0xRRGGBB

      Returns

      the transformed colour, 0xRRGGBB