blendColor static method

Color blendColor(
  1. Color c1,
  2. Color c2,
  3. SketchBlendMode mode
)

Implementation

static Color blendColor(Color c1, Color c2, SketchBlendMode mode) {
  // Blend mode equations taken from Wikipedia:
  // https://en.wikipedia.org/wiki/Blend_modes
  switch (mode) {
    case SketchBlendMode.blend:
      return Color.lerp(c1, c2, 0.5)!;
    case SketchBlendMode.add:
      return _colorFromPercentARGB(
        1.0,
        (c1.redPercent + c2.redPercent).clamp(0.0, 1.0),
        (c1.greenPercent + c2.greenPercent).clamp(0.0, 1.0),
        (c1.bluePercent + c2.bluePercent).clamp(0.0, 1.0),
      );
    case SketchBlendMode.subtract:
      return _colorFromPercentARGB(
        1.0,
        (c1.redPercent - c2.redPercent).clamp(0.0, 1.0),
        (c1.greenPercent - c2.greenPercent).clamp(0.0, 1.0),
        (c1.bluePercent - c2.bluePercent).clamp(0.0, 1.0),
      );
    case SketchBlendMode.darkest:
      return c1.computeLuminance() < c2.computeLuminance() ? c1 : c2;
    case SketchBlendMode.lightest:
      return c1.computeLuminance() > c2.computeLuminance() ? c1 : c2;
    case SketchBlendMode.difference:
      return _colorFromPercentARGB(
        1.0,
        (c1.redPercent - c2.redPercent).abs(),
        (c1.greenPercent - c2.greenPercent).abs(),
        (c1.bluePercent - c2.bluePercent).abs(),
      );
    case SketchBlendMode.exclusion:
      return _colorFromPercentARGB(
        1.0,
        0.5 - 2 * (c1.redPercent - 0.5) * (c2.redPercent - 0.5),
        0.5 - 2 * (c1.greenPercent - 0.5) * (c2.greenPercent - 0.5),
        0.5 - 2 * (c1.bluePercent - 0.5) * (c2.bluePercent - 0.5),
      );
    case SketchBlendMode.multiply:
      return _colorFromPercentARGB(
        1.0,
        c1.redPercent * c2.bluePercent,
        c1.greenPercent * c2.greenPercent,
        c1.bluePercent * c2.bluePercent,
      );
    case SketchBlendMode.screen:
      return _colorFromPercentARGB(
        1.0,
        1 - ((1 - c1.redPercent) * (1 - c2.redPercent)),
        1 - ((1 - c1.greenPercent) * (1 - c2.greenPercent)),
        1 - ((1 - c1.bluePercent) * (1 - c2.bluePercent)),
      );
    case SketchBlendMode.overlay:
      return _colorFromPercentARGB(
        1.0,
        c1.redPercent < 0.5 ? 2 * c1.redPercent * c2.redPercent : 1 - (2 * (1 - c1.redPercent) * (1 - c2.redPercent)),
        c1.greenPercent < 0.5
            ? 2 * c1.greenPercent * c2.greenPercent
            : 1 - (2 * (1 - c1.greenPercent) * (1 - c2.greenPercent)),
        c1.bluePercent < 0.5
            ? 2 * c1.bluePercent * c2.bluePercent
            : 1 - (2 * (1 - c1.bluePercent) * (1 - c2.bluePercent)),
      );
    case SketchBlendMode.hardLight:
      // This is the same as Overlay but with the c1 and c2's switched
      return _colorFromPercentARGB(
        1.0,
        c2.redPercent < 0.5 ? 2 * c2.redPercent * c1.redPercent : 1 - (2 * (1 - c2.redPercent) * (1 - c1.redPercent)),
        c2.greenPercent < 0.5
            ? 2 * c2.greenPercent * c1.greenPercent
            : 1 - (2 * (1 - c2.greenPercent) * (1 - c1.greenPercent)),
        c2.bluePercent < 0.5
            ? 2 * c2.bluePercent * c1.bluePercent
            : 1 - (2 * (1 - c2.bluePercent) * (1 - c1.bluePercent)),
      );
    case SketchBlendMode.softLight:
      return _colorFromPercentARGB(
        1.0,
        (1 - (2 * c2.redPercent)) * (pow(c1.redPercent, 2)) + (2 * c2.redPercent * c1.redPercent),
        (1 - (2 * c2.greenPercent)) * (pow(c1.greenPercent, 2)) + (2 * c2.greenPercent * c1.greenPercent),
        (1 - (2 * c2.bluePercent)) * (pow(c1.bluePercent, 2)) + (2 * c2.bluePercent * c1.bluePercent),
      );
    case SketchBlendMode.dodge:
      return _colorFromPercentARGB(
        1.0,
        (c1.redPercent / (1 - c2.redPercent)).clamp(0, 1),
        (c1.greenPercent / (1 - c2.greenPercent)).clamp(0, 1),
        (c1.bluePercent / (1 - c2.bluePercent)).clamp(0, 1),
      );
    case SketchBlendMode.burn:
      return _colorFromPercentARGB(
        1.0,
        (1 - ((1 - c1.redPercent) / c2.redPercent)).clamp(0, 1),
        (1 - ((1 - c1.greenPercent) / c2.greenPercent)).clamp(0, 1),
        (1 - ((1 - c1.bluePercent) / c2.bluePercent)).clamp(0, 1),
      );
  }
}