blendColor static method
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),
);
}
}