void tileutils_EncodeShadowRun(Pixel32 **inBuf, int *pos, int width, Pixel16 **outBufPtr) { Pixel16 pix16; unsigned char alpha; int runLen = 0; Pixel16 * headerPtr = *outBufPtr; (*outBufPtr)++; RGB32Info(**inBuf, &pix16, &alpha); Pixel32 pix32 = (**inBuf) & k_32_BIT_RGB_MASK; while (pix32 == k_32_BIT_SHADOW_PIXEL && (*pos < width)) { (*inBuf)++; (*pos)++; runLen++; RGB32Info(**inBuf, &pix16, &alpha); pix32 = (**inBuf) & k_32_BIT_RGB_MASK; } Pixel16 footer = static_cast<Pixel16>(k_TILE_SHADOW_RUN_ID << 8 | runLen); if (*pos >= width) footer |= k_TILE_EOLN_ID << 8; *headerPtr = footer; }
void spriteutils_EncodeShadowRun(Pixel32 **inBuf, sint32 *pos, sint32 width, Pixel16 **outBufPtr) { Pixel16 pix16; uint8 alpha; sint32 runLen = 0; Pixel16 footer=0; Pixel16 shadowPixel; if (g_is565Format) shadowPixel = k_SHADOW_PIXEL_565; else shadowPixel = k_SHADOW_PIXEL_555; RGB32Info(**inBuf, &pix16, &alpha); while (pix16 == shadowPixel && (*pos < width)) { (*inBuf)++; (*pos)++; runLen++; RGB32Info(**inBuf, &pix16, &alpha); } footer = (Pixel16)(k_SHADOW_RUN_ID << 8 | runLen); if (*pos >= width) footer |= k_EOLN_ID << 8; **outBufPtr = footer; (*outBufPtr)++; }
void spriteutils_EncodeCopyRun(Pixel32 **inBuf, sint32 *pos, sint32 width, Pixel16 **outBufPtr) { Pixel16 pix16; uint8 alpha; sint32 runLen = 0; Pixel16 footer=0; Pixel16 *headerPtr; Pixel16 shadowPixel; if (g_is565Format) { shadowPixel = k_SHADOW_PIXEL_565; } else { shadowPixel = k_SHADOW_PIXEL_555; } headerPtr = *outBufPtr; (*outBufPtr)++; RGB32Info(**inBuf, &pix16, &alpha); while (pix16 != shadowPixel && alpha == k_ALL_ALPHA && (*pos < width)) { if (pix16 == 0x0000) pix16 = 0x0001; **outBufPtr = pix16; (*outBufPtr)++; (*inBuf)++; (*pos)++; runLen++; RGB32Info(**inBuf, &pix16, &alpha); } footer = (Pixel16) (k_COPY_RUN_ID << 8 | runLen); if (*pos >= width) footer |= k_EOLN_ID << 8; *headerPtr = footer; }
char tileutils_EncodeScanline(Pixel32 *scanline, int width, Pixel16 **outBufPtr) { Pixel16 pix16; Pixel32 pix32; Pixel32 * scanPtr = scanline; unsigned char alpha; int pos = 0; char empty = FALSE; while (scanPtr < (scanline + width)) { pix32 = *scanPtr; RGB32Info(pix32, &pix16, &alpha); pix32 = pix32 & 0x00FFFFFF; switch (pix32) { case k_32_BIT_SKIP_PIXEL : empty = tileutils_EncodeSkipRun(&scanPtr, &pos, width, outBufPtr); break; case k_32_BIT_COLORIZE_PIXEL : tileutils_EncodeColorizeRun(&scanPtr, &pos, width, outBufPtr); break; case k_32_BIT_SHADOW_PIXEL : tileutils_EncodeShadowRun(&scanPtr, &pos, width, outBufPtr); break; default: tileutils_EncodeCopyRun(&scanPtr, &pos, width, outBufPtr); } } return empty; }
char spriteutils_EncodeScanlineWshadow(Pixel32 *scanline, sint32 width, Pixel16 **outBufPtr) { Pixel16 pix16; Pixel32 pix32; Pixel32 *scanPtr = scanline; uint8 alpha; sint32 pos; Pixel16 *startPtr; BOOL empty = FALSE; Pixel16 shadowPixel; if (g_is565Format) { shadowPixel = k_SHADOW_PIXEL_565; } else { shadowPixel = k_SHADOW_PIXEL_555; } pos = 0; startPtr = *outBufPtr; while (scanPtr < (scanline + width)) { pix32 = *scanPtr; empty = FALSE; RGB32Info(pix32, &pix16, &alpha); if ( (pix16 == k_CHROMAKEY_PIXEL && alpha == k_NO_ALPHA) || (pix16 == k_SHADOWBACKGD_PIXEL) ) { empty = spriteutils_EncodeChromakeyWshadowRun(&scanPtr, &pos, width, outBufPtr); } else if (pix16 == shadowPixel) { spriteutils_EncodeShadowRun(&scanPtr, &pos, width, outBufPtr); } else if (alpha != k_NO_ALPHA && alpha != k_ALL_ALPHA) { spriteutils_EncodeFeatheredRun(&scanPtr, &pos, width, outBufPtr); } else { if (alpha == k_ALL_ALPHA) spriteutils_EncodeCopyRun(&scanPtr, &pos, width, outBufPtr); else { printf("\nError in bitmap data. Pixel with no associated alpha.\n"); exit(-1); } } } return empty; }
void spriteutils_EncodeFeatheredRun(Pixel32 **inBuf, sint32 *pos, sint32 width, Pixel16 **outBufPtr) { Pixel16 pix16; Pixel16 footer=0; uint8 alpha; RGB32Info(**inBuf, &pix16, &alpha); if (pix16 == 0x0000) pix16 = 0x0001; (*inBuf)++; (*pos)++; footer = (k_FEATHERED_RUN_ID << 8) | alpha; if (*pos >= width) footer |= k_EOLN_ID << 8; **outBufPtr = footer; (*outBufPtr)++; **outBufPtr = pix16; (*outBufPtr)++; }
char spriteutils_EncodeChromakeyWshadowRun(Pixel32 **inBuf, sint32 *pos, sint32 width, Pixel16 **outBufPtr) { Pixel16 pix16; uint8 alpha; sint32 runLen = 0; Pixel16 footer=0; RGB32Info(**inBuf, &pix16, &alpha); while ( ((pix16 == k_CHROMAKEY_PIXEL && alpha == k_NO_ALPHA) || (pix16 == k_SHADOWBACKGD_PIXEL)) && (*pos < width) ) { (*inBuf)++; (*pos)++; runLen++; RGB32Info(**inBuf, &pix16, &alpha); } if (runLen < width) { footer = (Pixel16)(k_CHROMAKEY_RUN_ID << 8 | runLen); if (*pos >= width) footer |= k_EOLN_ID << 8; **outBufPtr = footer; (*outBufPtr)++; } else { return TRUE; } return FALSE; }
char tileutils_EncodeSkipRun(Pixel32 **inBuf, int *pos, int width, Pixel16 **outBufPtr) { Pixel16 pix16; unsigned char alpha; int runLen = 0; RGB32Info(**inBuf, &pix16, &alpha); Pixel32 pix32 = (**inBuf) & k_32_BIT_RGB_MASK; while (pix32 == k_32_BIT_SKIP_PIXEL && (*pos < width)) { (*inBuf)++; (*pos)++; runLen++; RGB32Info(**inBuf, &pix16, &alpha); pix32 = (**inBuf) & k_32_BIT_RGB_MASK; } if (runLen < width) { Pixel16 footer = static_cast<Pixel16>(k_TILE_SKIP_RUN_ID << 8 | runLen); if (*pos >= width) footer |= k_EOLN_ID << 8; **outBufPtr = footer; (*outBufPtr)++; return FALSE; } else { return TRUE; } }