private ColorBgra UpdateByMask(ColorBgra before, byte val)
{
ColorBgra after = before;
int average = -1, oldaverage = -1;
if (!(mask [0] || mask [1] || mask [2])) {
return before;
}
do {
float factor;
oldaverage = average;
average = MaskAvg (after);
if (average == 0) {
break;
}
factor = (float)val / average;
for (int c = 0; c < 3; c++) {
if (mask [c]) {
after [c] = (byte)Utility.ClampToByte (after [c] * factor);
}
}
} while (average != val && oldaverage != average);
while (average != val) {
average = MaskAvg (after);
int diff = val - average;
for (int c = 0; c < 3; c++) {
if (mask [c]) {
after [c] = (byte)Utility.ClampToByte(after [c] + diff);
}
}
}
after.A = 255;
return after;
}