public void CutBlackPoint(double cut, int blur_radius, double blur_dark_level, int lines, double tailValueAtLeast, ProgressReporter callback)
{
double max_light = CalcMaxLight();
HistogramCollector sc = new HistogramCollector(max_light, lines);
sc.CollectData(this);
double min_tail = sc.LineToScale(sc.FindLowTailLightness(tailValueAtLeast));
double max_tail = sc.LineToScale(sc.FindHighTailLightness(tailValueAtLeast));
for (int j = 0; j < mHeight; j++)
{
if (j % REPORT_EVERY_NTH_LINE == 0 && callback != null)
{
if (!callback((double)j / this.mHeight * 0.3)) return;
}
for (int i = 0; i < mWidth; i++)
{
double light = Math.Sqrt(
r_chan[i, j] * r_chan[i, j] +
g_chan[i, j] * g_chan[i, j] +
b_chan[i, j] * b_chan[i, j]) / Math.Sqrt(3);
Tone curtone = new Tone(r_chan[i, j], g_chan[i, j], b_chan[i, j]);
double newlight = light - min_tail * cut;
if (newlight < 0) newlight = 0;
lock (this)
{
r_chan[i, j] = (float)(curtone.R * newlight);
g_chan[i, j] = (float)(curtone.G * newlight);
b_chan[i, j] = (float)(curtone.B * newlight);
}
}
}
}