backgroundSamples function
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;
}