public void SetFromLeveledHistogram(HistogramRgb inputHistogram, LevelOp upo)
{
if (inputHistogram == null || upo == null)
{
return;
}
Clear();
float[] before = new float[3];
float[] slopes = new float[3];
for (int c = 0; c < 3; c++)
{
long[] channelHistogramOutput = histogram[c];
long[] channelHistogramInput = inputHistogram.histogram[c];
for (int v = 0; v <= 255; v++)
{
ColorBgra after = ColorBgra.FromBgr((byte)v, (byte)v, (byte)v);
upo.UnApply(after, before, slopes);
if (after[c] > upo.ColorOutHigh[c] ||
after[c] < upo.ColorOutLow[c] ||
(int)Math.Floor(before[c]) < 0 ||
(int)Math.Ceiling(before[c]) > 255 ||
float.IsNaN(before[c]))
{
channelHistogramOutput[v] = 0;
}
else if (before[c] <= upo.ColorInLow[c])
{
channelHistogramOutput[v] = 0;
for (int i = 0; i <= upo.ColorInLow[c]; i++)
{
channelHistogramOutput[v] += channelHistogramInput[i];
}
}
else if (before[c] >= upo.ColorInHigh[c])
{
channelHistogramOutput[v] = 0;
for (int i = upo.ColorInHigh[c]; i < 256; i++)
{
channelHistogramOutput[v] += channelHistogramInput[i];
}
}
else
{
channelHistogramOutput[v] = (int)(slopes[c] * Utility.Lerp(
channelHistogramInput[(int)Math.Floor(before[c])],
channelHistogramInput[(int)Math.Ceiling(before[c])],
before[c] - Math.Floor(before[c])));
}
}
}
OnHistogramUpdated();
}