private Image Read1632Bit(bool is32)
{
int red_mask = FindMask(redMask);
int red_shift = FindShift(redMask);
int red_factor = red_mask + 1;
int green_mask = FindMask(greenMask);
int green_shift = FindShift(greenMask);
int green_factor = green_mask + 1;
int blue_mask = FindMask(blueMask);
int blue_shift = FindShift(blueMask);
int blue_factor = blue_mask + 1;
byte[] bdata = new byte[width * height * 3];
// Padding bytes at the end of each scanline
int padding = 0;
if (!is32) {
// width * bitsPerPixel should be divisible by 32
int bitsPerScanline = width * 16;
if ( bitsPerScanline%32 != 0) {
padding = (bitsPerScanline/32 + 1)*32 - bitsPerScanline;
padding = (int)Math.Ceiling(padding/8.0);
}
}
int imSize = (int)imageSize;
if (imSize == 0) {
imSize = (int)(bitmapFileSize - bitmapOffset);
}
int l=0;
int v;
if (isBottomUp) {
for (int i=height - 1; i >= 0; --i) {
l = width * 3 * i;
for (int j=0; j<width; j++) {
if (is32)
v = (int)ReadDWord(inputStream);
else
v = ReadWord(inputStream);
bdata[l++] = (byte)((Util.USR(v, red_shift) & red_mask) * 256 / red_factor);
bdata[l++] = (byte)((Util.USR(v, green_shift) & green_mask) * 256 / green_factor);
bdata[l++] = (byte)((Util.USR(v, blue_shift) & blue_mask) * 256 / blue_factor);
}
for (int m=0; m<padding; m++) {
inputStream.ReadByte();
}
}
} else {
for (int i=0; i<height; i++) {
for (int j=0; j<width; j++) {
if (is32)
v = (int)ReadDWord(inputStream);
else
v = ReadWord(inputStream);
bdata[l++] = (byte)((Util.USR(v, red_shift) & red_mask) * 256 / red_factor);
bdata[l++] = (byte)((Util.USR(v, green_shift) & green_mask) * 256 / green_factor);
bdata[l++] = (byte)((Util.USR(v, blue_shift) & blue_mask) * 256 / blue_factor);
}
for (int m=0; m<padding; m++) {
inputStream.ReadByte();
}
}
}
return new ImgRaw(width, height, 3, 8, bdata);
}