diff --git a/src/GifDecoder.h b/src/GifDecoder.h index ca84528..324b64c 100644 --- a/src/GifDecoder.h +++ b/src/GifDecoder.h @@ -23,26 +23,31 @@ #define ERROR_GIF_DECODE_ERROR -10 #define ERROR_MISSING_CALLBACK_FUNCTION -11 -typedef void (*callback)(void); + +typedef struct rgb_24 { + uint8_t red; + uint8_t green; + uint8_t blue; +} rgb_24; + +typedef void (*gd_callback)(void); typedef void (*pixel_callback)(int16_t x, int16_t y, uint8_t red, uint8_t green, uint8_t blue); typedef void (*line_callback)(int16_t x, int16_t y, uint8_t *buf, int16_t wid, uint16_t *palette565, int16_t skip); typedef void *(*get_buffer_callback)(void); +typedef void (*palette_callback)(rgb_24 *palette888, bool isGlobalPalette); + typedef bool (*file_seek_callback)(unsigned long position); typedef unsigned long (*file_position_callback)(void); typedef int (*file_read_callback)(void); typedef int (*file_read_block_callback)(void *buffer, int numberOfBytes); typedef int (*file_size_callback)(void); -typedef struct rgb_24 { - uint8_t red; - uint8_t green; - uint8_t blue; -} rgb_24; -template class GifDecoder { +template +class GifDecoder { public: GifDecoder(void); int startDecoding(void); @@ -58,11 +63,13 @@ template getCanvasHeight(); } - void setScreenClearCallback(callback f); - void setUpdateScreenCallback(callback f); + void setScreenClearCallback(gd_callback f); + void setUpdateScreenCallback(gd_callback f); void setDrawPixelCallback(pixel_callback f); void setDrawLineCallback(line_callback f); // note this callback is not currently used, but may be used in the future - void setStartDrawingCallback(callback f); // note this callback is not currently used + void setStartDrawingCallback(gd_callback f); // note this callback is not currently used + + void setPaletteCallback(palette_callback); void setFileSeekCallback(file_seek_callback f); void setFilePositionCallback(file_position_callback f); @@ -88,16 +95,17 @@ template - +#undef abs #include "GifDecoder.h" + template -callback GifDecoder::screenClearCallback; +gd_callback GifDecoder::screenClearCallback; template -callback GifDecoder::updateScreenCallback; +gd_callback GifDecoder::updateScreenCallback; template pixel_callback GifDecoder::drawPixelCallback; template line_callback GifDecoder::drawLineCallback; template -callback GifDecoder::startDrawingCallback; +gd_callback GifDecoder::startDrawingCallback; template file_seek_callback GifDecoder::fileSeekCallback; template @@ -53,6 +54,8 @@ template file_read_block_callback GifDecoder::fileReadBlockCallback; template file_size_callback GifDecoder::fileSizeCallback; +template +palette_callback GifDecoder::paletteCallback; template @@ -65,13 +68,13 @@ GifDecoder::GifDecoder(void) { template void GifDecoder::setStartDrawingCallback( - callback f) { + gd_callback f) { startDrawingCallback = f; } template void GifDecoder::setUpdateScreenCallback( - callback f) { + gd_callback f) { updateScreenCallback = f; } @@ -89,7 +92,7 @@ void GifDecoder::setDrawLineCa template void GifDecoder::setScreenClearCallback( - callback f) { + gd_callback f) { screenClearCallback = f; } @@ -122,6 +125,12 @@ void GifDecoder::setFileReadBl fileReadBlockCallback = f; } +template +void GifDecoder::setPaletteCallback(palette_callback f) { + paletteCallback = f; +} + + template void GifDecoder::DrawPixelRow(int startX, int y, int numPixels, rgb_24 * data) { for(int i=0; i::GIFDraw(GIFDR iWidth = DISPLAY_WIDTH; usPalette = (rgb_24*)pDraw->pPalette; + if(paletteCallback) + paletteCallback(usPalette,pDraw->ucIsGlobalPalette==1); + y = pDraw->iY + pDraw->y; // current line s = pDraw->pPixels; @@ -212,8 +224,11 @@ void GifDecoder::GIFDraw(GIFDR s = pDraw->pPixels; // Translate the 8-bit pixels through the RGB565 palette (already byte reversed) for (x=0; xiX+x_offset, y+y_offset, iWidth, (rgb_24 *)usTemp); + } + + DrawPixelRow(pDraw->iX+x_offset, y+y_offset, iWidth, (rgb_24 *)usTemp); } }