BYTE bitmask, PIXEL fgPel, INT32 cBits)
{
PIXEL xorPixel;
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+ BYTE mask = 0x01;
- if (bitmask & g_MaskBit0)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
+ if (cBits > 8)
+ return NULL;
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
+ return NULL;
- if (cBits > 0)
+ while (cBits > 0)
{
+ UINT32 data;
DESTREADPIXEL(xorPixel, pbDest - rowDelta);
- if (bitmask & g_MaskBit1)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
+ if (bitmask & mask)
+ data = xorPixel ^ fgPel;
else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
+ data = xorPixel;
+ DESTWRITEPIXEL(pbDest, data);
DESTNEXTPIXEL(pbDest);
cBits = cBits - 1;
-
- if (cBits > 0)
- {
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
-
- if (bitmask & g_MaskBit2)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
-
- if (bitmask & g_MaskBit3)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
-
- if (bitmask & g_MaskBit4)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
-
- if (bitmask & g_MaskBit5)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
-
- if (bitmask & g_MaskBit6)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- DESTREADPIXEL(xorPixel, pbDest - rowDelta);
-
- if (bitmask & g_MaskBit7)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel ^ fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, xorPixel))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- }
- }
- }
- }
- }
- }
+ mask = mask << 1;
}
return pbDest;
static INLINE BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, const BYTE* pbDestEnd, BYTE bitmask,
PIXEL fgPel, UINT32 cBits)
{
- if (bitmask & g_MaskBit0)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
+ BYTE mask = 0x01;
+
+ if (cBits > 8)
+ return NULL;
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
+ return NULL;
- if (cBits > 0)
+ while (cBits > 0)
{
- if (bitmask & g_MaskBit1)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
+ UINT32 data;
+
+ if (bitmask & mask)
+ data = fgPel;
else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
+ data = BLACK_PIXEL;
+ DESTWRITEPIXEL(pbDest, data);
DESTNEXTPIXEL(pbDest);
cBits = cBits - 1;
-
- if (cBits > 0)
- {
- if (bitmask & g_MaskBit2)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- if (bitmask & g_MaskBit3)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- if (bitmask & g_MaskBit4)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- if (bitmask & g_MaskBit5)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- if (bitmask & g_MaskBit6)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- cBits = cBits - 1;
-
- if (cBits > 0)
- {
- if (bitmask & g_MaskBit7)
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return NULL;
- }
- else
- {
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return NULL;
- }
-
- DESTNEXTPIXEL(pbDest);
- }
- }
- }
- }
- }
- }
+ mask = mask << 1;
}
return pbDest;
{
if (fInsertFgPel)
{
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
return FALSE;
+ DESTWRITEPIXEL(pbDest, fgPel);
DESTNEXTPIXEL(pbDest);
runLength = runLength - 1;
}
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
+ return FALSE;
while (runLength > 0)
{
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
}
else
{
DESTREADPIXEL(temp, pbDest - rowDelta);
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp ^ fgPel))
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
return FALSE;
+ DESTWRITEPIXEL(pbDest, temp ^ fgPel);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
- DESTREADPIXEL(temp, pbDest - rowDelta);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
+ return FALSE;
while (runLength > 0)
{
DESTREADPIXEL(temp, pbDest - rowDelta);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, temp);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
}
SRCNEXTPIXEL(pbSrc);
}
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
+ return FALSE;
+
if (fFirstLine)
{
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
-
while (runLength > 0)
{
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, fgPel))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, fgPel);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
}
else
{
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
- DESTREADPIXEL(temp, pbDest - rowDelta);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp ^ fgPel))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
-
while (runLength > 0)
{
DESTREADPIXEL(temp, pbDest - rowDelta);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp ^ fgPel))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, temp ^ fgPel);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
}
SRCREADPIXEL(pixelB, pbSrc);
SRCNEXTPIXEL(pbSrc);
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, pixelA))
- return FALSE;
- DESTNEXTPIXEL(pbDest);
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, pixelB))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
+ return FALSE;
while (runLength > 0)
{
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, pixelA))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, pixelA);
DESTNEXTPIXEL(pbDest);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, pixelB))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, pixelB);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
break;
SRCREADPIXEL(pixelA, pbSrc);
SRCNEXTPIXEL(pbSrc);
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, pixelA))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
+ return FALSE;
while (runLength > 0)
{
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, pixelA))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, pixelA);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
break;
runLength = ExtractRunLength(code, pbSrc, &advance);
pbSrc = pbSrc + advance;
- while (runLength >= UNROLL_COUNT)
- {
- UNROLL(
- SRCREADPIXEL(temp, pbSrc);
- SRCNEXTPIXEL(pbSrc);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp))
- return FALSE;
- DESTNEXTPIXEL(pbDest););
-
- runLength = runLength - UNROLL_COUNT;
- }
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
+ return FALSE;
while (runLength > 0)
{
SRCREADPIXEL(temp, pbSrc);
SRCNEXTPIXEL(pbSrc);
-
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, temp))
- return FALSE;
-
+ DESTWRITEPIXEL(pbDest, temp);
DESTNEXTPIXEL(pbDest);
- runLength = runLength - 1;
+ runLength--;
}
break;
case SPECIAL_WHITE:
pbSrc = pbSrc + 1;
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, WHITE_PIXEL))
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
return FALSE;
+ DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
DESTNEXTPIXEL(pbDest);
break;
case SPECIAL_BLACK:
pbSrc = pbSrc + 1;
- if (!DESTWRITEPIXEL(pbDest, pbDestEnd, BLACK_PIXEL))
+ if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
return FALSE;
+ DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
DESTNEXTPIXEL(pbDest);
break;
typedef UINT32 PIXEL;
-static const BYTE g_MaskBit0 = 0x01; /* Least significant bit */
-static const BYTE g_MaskBit1 = 0x02;
-static const BYTE g_MaskBit2 = 0x04;
-static const BYTE g_MaskBit3 = 0x08;
-static const BYTE g_MaskBit4 = 0x10;
-static const BYTE g_MaskBit5 = 0x20;
-static const BYTE g_MaskBit6 = 0x40;
-static const BYTE g_MaskBit7 = 0x80; /* Most significant bit */
-
static const BYTE g_MaskSpecialFgBg1 = 0x03;
static const BYTE g_MaskSpecialFgBg2 = 0x05;
return runLength;
}
-static INLINE BOOL write_pixel_8(BYTE* _buf, const BYTE* _end, BYTE _pix)
+static INLINE BOOL ensure_capacity(const BYTE* start, const BYTE* end, size_t size, size_t base)
{
- if (!_buf || !_end)
- return FALSE;
-
- if ((_end - _buf) < 1)
- return FALSE;
+ const size_t available = (uintptr_t)end - (uintptr_t)start;
+ const BOOL rc = available >= size * base;
+ return rc;
+}
+static INLINE void write_pixel_8(BYTE* _buf, BYTE _pix)
+{
*_buf = _pix;
- return TRUE;
}
-static INLINE BOOL write_pixel_24(BYTE* _buf, const BYTE* _end, UINT32 _pix)
+static INLINE void write_pixel_24(BYTE* _buf, UINT32 _pix)
{
- if (!_buf || !_end)
- return FALSE;
-
- if ((_end - _buf) < 3)
- return FALSE;
-
(_buf)[0] = (BYTE)(_pix);
(_buf)[1] = (BYTE)((_pix) >> 8);
(_buf)[2] = (BYTE)((_pix) >> 16);
- return TRUE;
}
-static INLINE BOOL write_pixel_16(BYTE* _buf, const BYTE* _end, UINT16 _pix)
+static INLINE void write_pixel_16(BYTE* _buf, UINT16 _pix)
{
- if (!_buf || !_end)
- return FALSE;
-
- if ((_end - _buf) < 2)
- return FALSE;
-
*(UINT16*)_buf = _pix;
- return TRUE;
}
-#define UNROLL_COUNT 4
-#define UNROLL(_exp) do { _exp _exp _exp _exp } while (0)
-
#undef DESTWRITEPIXEL
#undef DESTREADPIXEL
#undef SRCREADPIXEL
#undef RLEEXTRA
#undef WHITE_PIXEL
#define WHITE_PIXEL 0xFF
-#define DESTWRITEPIXEL(_buf, _end, _pix) write_pixel_8(_buf, _end, _pix)
+#define DESTWRITEPIXEL(_buf, _pix) write_pixel_8(_buf, _pix)
#define DESTREADPIXEL(_pix, _buf) _pix = (_buf)[0]
#define SRCREADPIXEL(_pix, _buf) _pix = (_buf)[0]
#define DESTNEXTPIXEL(_buf) _buf += 1
#define WRITEFIRSTLINEFGBGIMAGE WriteFirstLineFgBgImage8to8
#define RLEDECOMPRESS RleDecompress8to8
#define RLEEXTRA
+#undef ENSURE_CAPACITY
+#define ENSURE_CAPACITY(_start, _end, _size) ensure_capacity(_start, _end, _size, 1)
#include "include/bitmap.c"
#undef DESTWRITEPIXEL
#undef RLEEXTRA
#undef WHITE_PIXEL
#define WHITE_PIXEL 0xFFFF
-#define DESTWRITEPIXEL(_buf, _end, _pix) write_pixel_16(_buf, _end, _pix)
+#define DESTWRITEPIXEL(_buf, _pix) write_pixel_16(_buf, _pix)
#define DESTREADPIXEL(_pix, _buf) _pix = ((UINT16*)(_buf))[0]
#ifdef HAVE_ALIGNED_REQUIRED
#define SRCREADPIXEL(_pix, _buf) _pix = (_buf)[0] | ((_buf)[1] << 8)
#define WRITEFIRSTLINEFGBGIMAGE WriteFirstLineFgBgImage16to16
#define RLEDECOMPRESS RleDecompress16to16
#define RLEEXTRA
+#undef ENSURE_CAPACITY
+#define ENSURE_CAPACITY(_start, _end, _size) ensure_capacity(_start, _end, _size, 2)
#include "include/bitmap.c"
#undef DESTWRITEPIXEL
#undef RLEEXTRA
#undef WHITE_PIXEL
#define WHITE_PIXEL 0xFFFFFF
-#define DESTWRITEPIXEL(_buf, _end, _pix) write_pixel_24(_buf, _end, _pix)
+#define DESTWRITEPIXEL(_buf, _pix) write_pixel_24(_buf, _pix)
#define DESTREADPIXEL(_pix, _buf) _pix = (_buf)[0] | ((_buf)[1] << 8) | \
((_buf)[2] << 16)
#define SRCREADPIXEL(_pix, _buf) _pix = (_buf)[0] | ((_buf)[1] << 8) | \
#define WRITEFIRSTLINEFGBGIMAGE WriteFirstLineFgBgImage24to24
#define RLEDECOMPRESS RleDecompress24to24
#define RLEEXTRA
+#undef ENSURE_CAPACITY
+#define ENSURE_CAPACITY(_start, _end, _size) ensure_capacity(_start, _end, _size, 3)
#include "include/bitmap.c"
BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
int status;
wStream* s;
UINT32 DstFormat = 0;
- int maxSize = 64 * 64 * 4;
+ const size_t maxSize = 64 * 64 * 4;
if (nWidth % 4)
{