From 081292f2d0cf120a32b3b74b47ebda9d232ce8cb Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 5 Mar 2018 13:49:10 +0000 Subject: [PATCH] Correct calculation of data length when icon size is not word or byte aligned. --- libexeinfo/Os2/Bitmap.cs | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/libexeinfo/Os2/Bitmap.cs b/libexeinfo/Os2/Bitmap.cs index 8fdc0f4..1e6050a 100644 --- a/libexeinfo/Os2/Bitmap.cs +++ b/libexeinfo/Os2/Bitmap.cs @@ -122,7 +122,23 @@ namespace libexeinfo.Os2 // rgb[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); DecodedBitmap bitmap = DecodeBitmap(bitmapFileHeader, palette, buffer); @@ -175,7 +191,23 @@ namespace libexeinfo.Os2 // rgb[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); bitmap = DecodeBitmap(bitmapFileHeader, palette, buffer); @@ -208,6 +240,7 @@ namespace libexeinfo.Os2 return bitmaps.ToArray(); } + // TODO: Mask is not correctly decoded on XGA icons (20x20 and 40x40)... static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList palette, byte[] data) { DecodedBitmap bitmap = new DecodedBitmap @@ -257,6 +290,8 @@ namespace libexeinfo.Os2 bitmap.Pixels[y * bitmap.Width + x] = argbPalette[(data[pos] >> k) & ((1 << (int)bitmap.BitsPerPixel) - 1)]; x++; + + if(x == bitmap.Width) break; } pos++;