applyBlendMode static method
Color
applyBlendMode(
- Color base,
- Color overlay,
- TableBlendMode mode, {
- required bool hasDarkBackground,
Blends overlay onto base using mode.
Implementation
static Color applyBlendMode(
Color base,
Color overlay,
TableBlendMode mode, {
required bool hasDarkBackground,
}) {
final baseRgb = _toRgb(base, hasDarkBackground: hasDarkBackground);
final overlayRgb = _toRgb(overlay, hasDarkBackground: hasDarkBackground);
if (baseRgb == null || overlayRgb == null) return overlay;
int blendChannel(int baseChannel, int overlayChannel) => switch (mode) {
TableBlendMode.normal => overlayChannel,
TableBlendMode.multiply =>
((baseChannel * overlayChannel) / 255.0).round(),
TableBlendMode.screen =>
(255.0 - (255.0 - baseChannel) * (255.0 - overlayChannel) / 255.0)
.round(),
TableBlendMode.overlay =>
baseChannel < 128
? ((2 * baseChannel * overlayChannel) / 255.0).round()
: (255.0 -
(2 * (255 - baseChannel) * (255 - overlayChannel)) /
255.0)
.round(),
};
final rgb = cp.Rgb(
blendChannel(baseRgb.r, overlayRgb.r).clamp(0, 255),
blendChannel(baseRgb.g, overlayRgb.g).clamp(0, 255),
blendChannel(baseRgb.b, overlayRgb.b).clamp(0, 255),
);
return BasicColor(
'#${rgb.r.toRadixString(16).padLeft(2, '0')}'
'${rgb.g.toRadixString(16).padLeft(2, '0')}'
'${rgb.b.toRadixString(16).padLeft(2, '0')}',
);
}