mirror of
https://github.com/claunia/libexeinfo.git
synced 2025-12-16 19:14:24 +00:00
Correct calculation of data length when icon size is not word or byte aligned.
This commit is contained in:
@@ -122,7 +122,23 @@ namespace libexeinfo.Os2
|
|||||||
// rgb[1];
|
// rgb[1];
|
||||||
remaining -= 1;
|
remaining -= 1;
|
||||||
|
|
||||||
buffer = new byte[bitmapFileHeader.X * bitmapFileHeader.Y * bitmapFileHeader.BitsPerPlane / 8];
|
// TODO (Optimize): Calculate real data length considering that every line is word-aligned (2-byte)
|
||||||
|
long dataLength = 0;
|
||||||
|
for(int y = 0; y < bitmapFileHeader.Y; y++)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
while(x < bitmapFileHeader.X)
|
||||||
|
{
|
||||||
|
for(int k = 8 - bitmapFileHeader.BitsPerPlane; k >= 0;
|
||||||
|
k -= (int)bitmapFileHeader.BitsPerPlane) x++;
|
||||||
|
|
||||||
|
dataLength++;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataLength += dataLength % 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = new byte[dataLength];
|
||||||
Array.Copy(data, bitmapFileHeader.Offset, buffer, 0, buffer.Length);
|
Array.Copy(data, bitmapFileHeader.Offset, buffer, 0, buffer.Length);
|
||||||
|
|
||||||
DecodedBitmap bitmap = DecodeBitmap(bitmapFileHeader, palette, buffer);
|
DecodedBitmap bitmap = DecodeBitmap(bitmapFileHeader, palette, buffer);
|
||||||
@@ -175,7 +191,23 @@ namespace libexeinfo.Os2
|
|||||||
// rgb[1];
|
// rgb[1];
|
||||||
remaining -= 1;
|
remaining -= 1;
|
||||||
|
|
||||||
buffer = new byte[bitmapFileHeader.X * bitmapFileHeader.Y * bitmapFileHeader.BitsPerPlane / 8];
|
// TODO (Optimize): Calculate real data length considering that every line is word-aligned (2-byte)
|
||||||
|
dataLength = 0;
|
||||||
|
for(int y = 0; y < bitmapFileHeader.Y; y++)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
while(x < bitmapFileHeader.X)
|
||||||
|
{
|
||||||
|
for(int k = 8 - bitmapFileHeader.BitsPerPlane; k >= 0;
|
||||||
|
k -= (int)bitmapFileHeader.BitsPerPlane) x++;
|
||||||
|
|
||||||
|
dataLength++;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataLength += dataLength % 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = new byte[dataLength];
|
||||||
Array.Copy(data, bitmapFileHeader.Offset, buffer, 0, buffer.Length);
|
Array.Copy(data, bitmapFileHeader.Offset, buffer, 0, buffer.Length);
|
||||||
|
|
||||||
bitmap = DecodeBitmap(bitmapFileHeader, palette, buffer);
|
bitmap = DecodeBitmap(bitmapFileHeader, palette, buffer);
|
||||||
@@ -208,6 +240,7 @@ namespace libexeinfo.Os2
|
|||||||
return bitmaps.ToArray();
|
return bitmaps.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Mask is not correctly decoded on XGA icons (20x20 and 40x40)...
|
||||||
static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList<RGB> palette, byte[] data)
|
static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList<RGB> palette, byte[] data)
|
||||||
{
|
{
|
||||||
DecodedBitmap bitmap = new DecodedBitmap
|
DecodedBitmap bitmap = new DecodedBitmap
|
||||||
@@ -257,6 +290,8 @@ namespace libexeinfo.Os2
|
|||||||
bitmap.Pixels[y * bitmap.Width + x] =
|
bitmap.Pixels[y * bitmap.Width + x] =
|
||||||
argbPalette[(data[pos] >> k) & ((1 << (int)bitmap.BitsPerPixel) - 1)];
|
argbPalette[(data[pos] >> k) & ((1 << (int)bitmap.BitsPerPixel) - 1)];
|
||||||
x++;
|
x++;
|
||||||
|
|
||||||
|
if(x == bitmap.Width) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos++;
|
pos++;
|
||||||
|
|||||||
Reference in New Issue
Block a user