backgroundSamples function

List<int> backgroundSamples(
  1. BackgroundSpec bg
)

Opaque background samples: every gradient stop and, with a pattern, the pattern ink composited over each stop.

Implementation

List<int> backgroundSamples(BackgroundSpec bg) {
  // Family scenes sample themselves (their own files).
  final scene = switch (bg.kind) {
    BackgroundKind.claySoft => claymorphismSceneSamples(bg),
    BackgroundKind.aeroSky ||
    BackgroundKind.chromeHolo => y2kAeroSceneSamples(bg),
    BackgroundKind.paperSheet => paperInkSceneSamples(bg),
    BackgroundKind.cyberGrid => cyberpunkSceneSamples(bg),
    BackgroundKind.vaporSunset => vaporwaveSceneSamples(bg),
    BackgroundKind.bauhausComposition => bauhausSceneSamples(bg),
    _ => null,
  };
  if (scene != null) return scene;
  final stops = [for (final c in bg.colors) c | 0xFF000000];
  if (stops.isEmpty) return const [0xFF000000];
  // A mesh blends its colours in every proportion: sample its colour hull
  // (Liquid Glass; liquid_glass.dart), whose darkest and lightest points
  // can lie between the stops.
  if (bg.kind == BackgroundKind.meshGradient) return meshHullSamples(stops);
  final out = <int>[...stops];
  if (bg.pattern != BackgroundPattern.none && bg.patternOpacityPermille > 0) {
    final inkAlpha = ((bg.patternColor >>> 24) & 0xFF) == 0
        ? 255
        : (bg.patternColor >>> 24) & 0xFF;
    final alpha = (inkAlpha * bg.patternOpacityPermille + 500) ~/ 1000;
    for (final s in stops) {
      out.add(compositeOver(withAlpha(bg.patternColor, alpha), s));
    }
  }
  return out;
}