private void UpdatePixelMapping(Dictionary<int, Utility.PixelMap[]> pixelMapping)
{
int bytesPerPixel = Bitmap.GetPixelFormatSize(PixelFormat.Format24bppRgb) / 8;
int stride = 4 * ((this.pixelWidth * bytesPerPixel + 3) / 4);
foreach (var kvp in pixelMapping)
{
int[] mapping;
if (!this.pixelMapping.TryGetValue(kvp.Key, out mapping))
{
mapping = new int[512];
for (int i = 0; i < mapping.Length; i++)
mapping[i] = -1;
this.pixelMapping.Add(kvp.Key, mapping);
}
for (int pos = 0; pos < Math.Min(kvp.Value.Length, mapping.Length); pos++)
{
var map = kvp.Value[pos];
if (map.X >= this.pixelWidth || map.Y >= this.pixelHeight)
continue;
int rgbOffset = -1;
switch (map.ColorComponent)
{
case Utility.ColorComponent.R:
rgbOffset = 2;
break;
case Utility.ColorComponent.G:
rgbOffset = 1;
break;
case Utility.ColorComponent.B:
rgbOffset = 0;
break;
}
if (rgbOffset == -1)
continue;
int bytePos = map.X * 3 + map.Y * stride + rgbOffset;
if (bytePos >= stride * this.pixelHeight)
throw new ArgumentOutOfRangeException("Invalid pixel mapping");
mapping[pos] = bytePos;
}
}
}