private void DrawBitmap()
{
bitmap.Lock();
var bitmapLinePosition = bitmap.BackBuffer;
var bitmapStride = bitmap.BackBufferStride;
var bitmapWidth = bitmap.Width;
var fileLineBytes = 3L * viewSize.Width;
var filePosition = fileLineBytes * scrollPosition;
long remainLineBytes;
var bitmapFullLines = Math.Min(bitmap.Height, Math.DivRem(fileLength, fileLineBytes, out remainLineBytes) - scrollPosition);
for (var y = 0; y < bitmapFullLines; ++y)
{
var bitmapOffset = 0;
for (var x = 0; x < bitmapWidth; ++x)
{
DrawPixel(bitmapLinePosition, bitmapOffset, filePosition);
bitmapOffset += 4;
filePosition += 3;
}
bitmapLinePosition += bitmapStride;
}
if (bitmapFullLines < bitmap.Height && remainLineBytes > 0)
{
long remainBytes;
var fullPixels = Math.DivRem(remainLineBytes, 3, out remainBytes);
var bitmapOffset = 0;
for (var x = 0; x < fullPixels; ++x)
{
DrawPixel(bitmapLinePosition, bitmapOffset, filePosition);
bitmapOffset += 4;
filePosition += 3;
}
if (remainBytes == 1)
{
byte r;
fileAccessor.Read(filePosition, out r);
WriteColor(bitmapLinePosition, bitmapOffset, r, 0, 0, byte.MaxValue / 3);
}
else if (remainBytes == 2)
{
byte r, g;
fileAccessor.Read(filePosition, out r);
fileAccessor.Read(filePosition + 1, out g);
WriteColor(bitmapLinePosition, bitmapOffset, r, g, 0, byte.MaxValue / 3 * 2);
}
// Set remain pixels to zeroes.
var bitmapBytesEnd = bitmap.BackBuffer + bitmapStride * bitmap.PixelHeight;
for (var p = bitmapLinePosition + bitmapOffset + 4; p != bitmapBytesEnd; p += 4)
{
WriteColor(p, 0, 0, 0, 0, 0);
}
}
bitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
bitmap.Unlock();
}