Blend class
class Blend {
static int normal(int a, int b) => b;
static int overlay(num a, num b) {
a /= 255;
b /= 255;
var result = 0;
if (a < 0.5) result = 2 * a * b;
else result = 1 - 2 * (1 - a) * (1 - b);
return min(255, max(0, result * 255)).toInt();
}
static int hardLight(int a, int b) => Blend.overlay(b, a);
static int softLight(num a, num b) {
a /= 255;
b /= 255;
var v = ((1 - 2 * b) * a + 2 * b) * a;
return limitValue((v * 255).toInt(), 0, 255);
}
static int dodge(int a, int b) => min(256 * a ~/ (255 - b + 1), 255);
static int burn(int a, int b) => 255 - min(256 * (255 - a) ~/ (b + 1), 255);
static int multiply(int a, int b) => b * a ~/ 255;
static int divide(int a, int b) => min(256 * a ~/ (b + 1), 255);
static int screen(int a, int b) => 255 - (255 - b) * (255 - a) ~/ 255;
static int grainExtract(int a, int b) => limitValue(a - b + 128, 0, 255);
static int grainMerge(int a, int b) => limitValue(a + b - 128, 0, 255);
static int difference(int a, int b) => (a - b).abs();
static int addition(int a, int b) => min(a + b, 255);
static int substract(int a, int b) => max(a - b, 0);
static int darkenOnly(int a, int b) => min(a, b);
static int lightenOnly(int a, int b) => max(a, b);
static List<int> color(List<int> a, List<int> b) {
var aHSL = rgbListToHsl(a);
var bHSL = rgbListToHsl(b);
return hslToRgb(bHSL[0], bHSL[1], aHSL[2]);
}
static List<int> hue(List<int> a, List<int> b) {
var aHSV = rgbListToHsv(a);
var bHSV = rgbListToHsv(b);
if(bHSV[1] == 0) return hsvToRgb(aHSV[0], aHSV[1], aHSV[2]);
else return hsvToRgb(bHSV[0], aHSV[1], aHSV[2]);
}
static List<int> value(List<int> a, List<int> b) {
var aHSV = rgbListToHsv(a);
var bHSV = rgbListToHsv(b);
return hsvToRgb(aHSV[0], aHSV[1], bHSV[2]);
}
static List<int> saturation(List<int> a, List<int> b) {
var aHSV = rgbListToHsv(a);
var bHSV = rgbListToHsv(b);
return hsvToRgb(aHSV[0], bHSV[1], aHSV[2]);
}
}
Static Methods
int normal(int a, int b) #
static int normal(int a, int b) => b;
int overlay(num a, num b) #
static int overlay(num a, num b) {
a /= 255;
b /= 255;
var result = 0;
if (a < 0.5) result = 2 * a * b;
else result = 1 - 2 * (1 - a) * (1 - b);
return min(255, max(0, result * 255)).toInt();
}
int hardLight(int a, int b) #
static int hardLight(int a, int b) => Blend.overlay(b, a);
int softLight(num a, num b) #
static int softLight(num a, num b) {
a /= 255;
b /= 255;
var v = ((1 - 2 * b) * a + 2 * b) * a;
return limitValue((v * 255).toInt(), 0, 255);
}
int dodge(int a, int b) #
static int dodge(int a, int b) => min(256 * a ~/ (255 - b + 1), 255);
int burn(int a, int b) #
static int burn(int a, int b) => 255 - min(256 * (255 - a) ~/ (b + 1), 255);
int multiply(int a, int b) #
static int multiply(int a, int b) => b * a ~/ 255;
int divide(int a, int b) #
static int divide(int a, int b) => min(256 * a ~/ (b + 1), 255);
int screen(int a, int b) #
static int screen(int a, int b) => 255 - (255 - b) * (255 - a) ~/ 255;
int grainExtract(int a, int b) #
static int grainExtract(int a, int b) => limitValue(a - b + 128, 0, 255);
int grainMerge(int a, int b) #
static int grainMerge(int a, int b) => limitValue(a + b - 128, 0, 255);
int difference(int a, int b) #
static int difference(int a, int b) => (a - b).abs();
int addition(int a, int b) #
static int addition(int a, int b) => min(a + b, 255);
int substract(int a, int b) #
static int substract(int a, int b) => max(a - b, 0);
int darkenOnly(int a, int b) #
static int darkenOnly(int a, int b) => min(a, b);
int lightenOnly(int a, int b) #
static int lightenOnly(int a, int b) => max(a, b);
List<int> color(List<int> a, List<int> b) #
static List<int> color(List<int> a, List<int> b) {
var aHSL = rgbListToHsl(a);
var bHSL = rgbListToHsl(b);
return hslToRgb(bHSL[0], bHSL[1], aHSL[2]);
}
List<int> hue(List<int> a, List<int> b) #
static List<int> hue(List<int> a, List<int> b) {
var aHSV = rgbListToHsv(a);
var bHSV = rgbListToHsv(b);
if(bHSV[1] == 0) return hsvToRgb(aHSV[0], aHSV[1], aHSV[2]);
else return hsvToRgb(bHSV[0], aHSV[1], aHSV[2]);
}
List<int> value(List<int> a, List<int> b) #
static List<int> value(List<int> a, List<int> b) {
var aHSV = rgbListToHsv(a);
var bHSV = rgbListToHsv(b);
return hsvToRgb(aHSV[0], aHSV[1], bHSV[2]);
}
List<int> saturation(List<int> a, List<int> b) #
static List<int> saturation(List<int> a, List<int> b) {
var aHSV = rgbListToHsv(a);
var bHSV = rgbListToHsv(b);
return hsvToRgb(aHSV[0], bHSV[1], aHSV[2]);
}