Index: win32ss/gdi/eng/rlecomp.c =================================================================== --- win32ss/gdi/eng/rlecomp.c (revision 71143) +++ win32ss/gdi/eng/rlecomp.c (working copy) @@ -22,36 +22,52 @@ { INT x = 0; INT y = Size.cy - 1; + INT i; INT c; + INT c2; INT length; - INT width; + INT width = Size.cx; INT height = y; BYTE *begin = CompressedBits; BYTE *bits = CompressedBits; BYTE *temp; - INT shift = 0; + BOOL is4bpp = FALSE; if ((Format == BMF_4RLE) || (Format == BMF_4BPP)) - shift = 1; + is4bpp = TRUE; else if ((Format != BMF_8RLE) && (Format != BMF_8BPP)) return; - width = ((Size.cx + shift) >> shift); - _SEH2_TRY { while (y >= 0 && (bits - begin) <= cjSizeImage) { - length = (*bits++) >> shift; + length = *bits++; if (length) { c = *bits++; - while (length--) + for (i = 0; i < length; i++) { if (x >= width) break; - temp = UncompressedBits + (((height - y) * Delta) + x); + temp = UncompressedBits + (height - y) * Delta; + if (is4bpp) + { + temp += x / 2; + if (i & 1) + c2 = c & 0x0F; + else + c2 = c >> 4; + if (x & 1) + *temp |= c2; + else + *temp |= c2 << 4; + } + else + { + temp += x; + *temp = c; + } x++; - *temp = c; } } else @@ -66,19 +82,36 @@ case RLE_END: _SEH2_YIELD(return); case RLE_DELTA: - x += (*bits++) >> shift; - y -= (*bits++) >> shift; + x += *bits++; + y -= *bits++; break; default: - length = length >> shift; - while (length--) + for (i = 0; i < length; i++) { - c = *bits++; + if (!(is4bpp && i & 1)) + c = *bits++; + if (x < width) { - temp = UncompressedBits + (((height - y) * Delta) + x); + temp = UncompressedBits + (height - y) * Delta; + if (is4bpp) + { + temp += x / 2; + if (i & 1) + c2 = c & 0x0F; + else + c2 = c >> 4; + if (x & 1) + *temp |= c2; + else + *temp |= c2 << 4; + } + else + { + temp += x; + *temp = c; + } x++; - *temp = c; } } if ((bits - begin) & 1)