applyBlendMode static method

Color applyBlendMode(
  1. Color base,
  2. Color overlay,
  3. TableBlendMode mode, {
  4. 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')}',
  );
}