Fix compiler errors and warnings on image handling with multiple image formats turned on.
This commit is contained in:
parent
205160aec0
commit
fb7e7c6ea7
@ -66,7 +66,7 @@ typedef struct gdispImage {
|
||||
uint32_t maxmemused; /* @< How much RAM has been allocated (maximum) */
|
||||
#endif
|
||||
const struct gdispImageHandlers * fns; /* @< Don't mess with this! */
|
||||
struct gdispImagePrivate * priv; /* @< Don't mess with this! */
|
||||
void * priv; /* @< Don't mess with this! */
|
||||
} gdispImage;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -53,14 +53,17 @@ typedef struct gdispImagePrivate_BMP {
|
||||
} gdispImagePrivate_BMP;
|
||||
|
||||
void gdispImageClose_BMP(gdispImage *img) {
|
||||
if (img->priv) {
|
||||
gdispImagePrivate_BMP *priv;
|
||||
|
||||
priv = (gdispImagePrivate_BMP *)img->priv;
|
||||
if (priv) {
|
||||
#if GDISP_NEED_IMAGE_BMP_1 || GDISP_NEED_IMAGE_BMP_4 || GDISP_NEED_IMAGE_BMP_4_RLE || GDISP_NEED_IMAGE_BMP_8 || GDISP_NEED_IMAGE_BMP_8_RLE
|
||||
if (img->priv->palette)
|
||||
gdispImageFree(img, (void *)img->priv->palette, img->priv->palsize*sizeof(color_t));
|
||||
if (priv->palette)
|
||||
gdispImageFree(img, (void *)priv->palette, priv->palsize*sizeof(color_t));
|
||||
#endif
|
||||
if (img->priv->frame0cache)
|
||||
gdispImageFree(img, (void *)img->priv->frame0cache, img->width*img->height*sizeof(pixel_t));
|
||||
gdispImageFree(img, (void *)img->priv, sizeof(gdispImagePrivate_BMP));
|
||||
if (priv->frame0cache)
|
||||
gdispImageFree(img, (void *)priv->frame0cache, img->width*img->height*sizeof(pixel_t));
|
||||
gdispImageFree(img, (void *)priv, sizeof(gdispImagePrivate_BMP));
|
||||
img->priv = 0;
|
||||
}
|
||||
}
|
||||
@ -89,11 +92,11 @@ gdispImageError gdispImageOpen_BMP(gdispImage *img) {
|
||||
img->flags = 0;
|
||||
|
||||
/* Allocate our private area */
|
||||
if (!(img->priv = (gdispImagePrivate_BMP *)gdispImageAlloc(img, sizeof(gdispImagePrivate_BMP))))
|
||||
if (!(img->priv = gdispImageAlloc(img, sizeof(gdispImagePrivate_BMP))))
|
||||
return GDISP_IMAGE_ERR_NOMEMORY;
|
||||
|
||||
/* Initialise the essential bits in the private area */
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_BMP *)img->priv;
|
||||
priv->frame0cache = 0;
|
||||
priv->bmpflags = 0;
|
||||
#if GDISP_NEED_IMAGE_BMP_1 || GDISP_NEED_IMAGE_BMP_4 || GDISP_NEED_IMAGE_BMP_4_RLE || GDISP_NEED_IMAGE_BMP_8 || GDISP_NEED_IMAGE_BMP_8_RLE
|
||||
@ -119,7 +122,7 @@ gdispImageError gdispImageOpen_BMP(gdispImage *img) {
|
||||
|
||||
// Detect our bitmap version
|
||||
if (offsetColorTable == 12+14) {
|
||||
img->priv->bmpflags |= BMP_V2;
|
||||
priv->bmpflags |= BMP_V2;
|
||||
|
||||
// Read the header
|
||||
if (gfileRead(img->f, priv->buf, 12-4) != 12-4)
|
||||
@ -129,7 +132,7 @@ gdispImageError gdispImageOpen_BMP(gdispImage *img) {
|
||||
// Get the height
|
||||
img->height = gdispImageGetAlignedLE16(priv->buf, 2);
|
||||
if (img->height < 0) {
|
||||
img->priv->bmpflags |= BMP_TOP_TO_BOTTOM;
|
||||
priv->bmpflags |= BMP_TOP_TO_BOTTOM;
|
||||
img->height = -img->height;
|
||||
}
|
||||
// Get the planes
|
||||
@ -361,7 +364,7 @@ static coord_t getPixels(gdispImage *img, coord_t x) {
|
||||
color_t * pc;
|
||||
coord_t len;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_BMP *)img->priv;
|
||||
pc = priv->buf;
|
||||
len = 0;
|
||||
|
||||
@ -372,7 +375,7 @@ static coord_t getPixels(gdispImage *img, coord_t x) {
|
||||
uint8_t b[4];
|
||||
uint8_t m;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_BMP *)img->priv;
|
||||
pc = priv->buf;
|
||||
len = 0;
|
||||
|
||||
@ -703,7 +706,7 @@ gdispImageError gdispImageCache_BMP(gdispImage *img) {
|
||||
size_t len;
|
||||
|
||||
/* If we are already cached - just return OK */
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_BMP *)img->priv;
|
||||
if (priv->frame0cache)
|
||||
return GDISP_IMAGE_ERR_OK;
|
||||
|
||||
@ -720,6 +723,8 @@ gdispImageError gdispImageCache_BMP(gdispImage *img) {
|
||||
priv->rlecode = 0;
|
||||
#endif
|
||||
|
||||
pcs = priv->buf; // This line is just to prevent a compiler warning.
|
||||
|
||||
if (priv->bmpflags & BMP_TOP_TO_BOTTOM) {
|
||||
for(y = 0, pcd = priv->frame0cache; y < img->height; y++) {
|
||||
x = 0; pos = 0;
|
||||
@ -756,7 +761,7 @@ gdispImageError gdispGImageDraw_BMP(GDisplay *g, gdispImage *img, coord_t x, coo
|
||||
coord_t mx, my;
|
||||
coord_t pos, len, st;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_BMP *)img->priv;
|
||||
|
||||
/* Check some reasonableness */
|
||||
if (sx >= img->width || sy >= img->height) return GDISP_IMAGE_ERR_OK;
|
||||
|
@ -117,7 +117,7 @@ static gdispImageError startDecodeGif(gdispImage *img) {
|
||||
gifimgdecode * decode;
|
||||
uint16_t cnt;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
|
||||
// We need the decode ram, and possibly a palette
|
||||
if (!(decode = (gifimgdecode *)gdispImageAlloc(img, sizeof(gifimgdecode)+priv->frame.palsize*sizeof(color_t))))
|
||||
@ -179,7 +179,7 @@ baddatacleanup:
|
||||
static void stopDecodeGif(gdispImage *img) {
|
||||
gdispImagePrivate_GIF * priv;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
|
||||
// Free the decode data
|
||||
if (priv->decode) {
|
||||
@ -214,7 +214,7 @@ static uint16_t getBytesGif(gdispImage *img) {
|
||||
uint16_t code, prefix;
|
||||
uint8_t bdata;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
decode = priv->decode;
|
||||
cnt = 0;
|
||||
|
||||
@ -346,7 +346,7 @@ static gdispImageError initFrameGif(gdispImage *img) {
|
||||
uint8_t blocktype;
|
||||
uint8_t blocksz;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
|
||||
// Save the dispose info from the existing frame
|
||||
priv->dispose.flags = priv->frame.flags;
|
||||
@ -504,7 +504,7 @@ void gdispImageClose_GIF(gdispImage *img) {
|
||||
gifimgcache * cache;
|
||||
gifimgcache * ncache;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
if (priv) {
|
||||
// Free any stored frames
|
||||
cache = priv->cache;
|
||||
@ -515,7 +515,7 @@ void gdispImageClose_GIF(gdispImage *img) {
|
||||
}
|
||||
if (priv->palette)
|
||||
gdispImageFree(img, (void *)priv->palette, priv->palsize*sizeof(color_t));
|
||||
gdispImageFree(img, (void *)img->priv, sizeof(gdispImagePrivate_GIF));
|
||||
gdispImageFree(img, (void *)priv, sizeof(gdispImagePrivate_GIF));
|
||||
img->priv = 0;
|
||||
}
|
||||
}
|
||||
@ -539,11 +539,11 @@ gdispImageError gdispImageOpen_GIF(gdispImage *img) {
|
||||
img->flags = 0;
|
||||
|
||||
/* Allocate our private area */
|
||||
if (!(img->priv = (gdispImagePrivate_GIF *)gdispImageAlloc(img, sizeof(gdispImagePrivate_GIF))))
|
||||
if (!(img->priv = gdispImageAlloc(img, sizeof(gdispImagePrivate_GIF))))
|
||||
return GDISP_IMAGE_ERR_NOMEMORY;
|
||||
|
||||
/* Initialise the essential bits in the private area */
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
priv->flags = 0;
|
||||
priv->palsize = 0;
|
||||
priv->palette = 0;
|
||||
@ -610,7 +610,7 @@ gdispImageError gdispImageCache_GIF(gdispImage *img) {
|
||||
uint16_t cnt;
|
||||
|
||||
/* If we are already cached - just return OK */
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
if (priv->curcache)
|
||||
return GDISP_IMAGE_ERR_OK;
|
||||
|
||||
@ -779,7 +779,7 @@ gdispImageError gdispGImageDraw_GIF(GDisplay *g, gdispImage *img, coord_t x, coo
|
||||
uint16_t cnt, gcnt;
|
||||
uint8_t col;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
|
||||
/* Handle previous frame disposing */
|
||||
if (priv->dispose.flags & (GIFL_DISPOSECLEAR|GIFL_DISPOSEREST)) {
|
||||
@ -1116,7 +1116,7 @@ delaytime_t gdispImageNext_GIF(gdispImage *img) {
|
||||
delaytime_t delay;
|
||||
uint8_t blocksz;
|
||||
|
||||
priv = img->priv;
|
||||
priv = (gdispImagePrivate_GIF *)img->priv;
|
||||
|
||||
// Save the delay and convert to millisecs
|
||||
delay = (delaytime_t)priv->frame.delay * 10;
|
||||
|
@ -26,16 +26,19 @@
|
||||
void *gdispImageAlloc(gdispImage *img, size_t sz);
|
||||
void gdispImageFree(gdispImage *img, void *ptr, size_t sz);
|
||||
|
||||
typedef struct gdispImagePrivate {
|
||||
typedef struct gdispImagePrivate_NATIVE {
|
||||
pixel_t *frame0cache;
|
||||
pixel_t buf[BLIT_BUFFER_SIZE_NATIVE];
|
||||
} gdispImagePrivate;
|
||||
} gdispImagePrivate_NATIVE;
|
||||
|
||||
void gdispImageClose_NATIVE(gdispImage *img) {
|
||||
if (img->priv) {
|
||||
if (img->priv->frame0cache)
|
||||
gdispImageFree(img, (void *)img->priv->frame0cache, img->width * img->height * sizeof(pixel_t));
|
||||
gdispImageFree(img, (void *)img->priv, sizeof(gdispImagePrivate));
|
||||
gdispImagePrivate_NATIVE * priv;
|
||||
|
||||
priv = (gdispImagePrivate_NATIVE *)img->priv;
|
||||
if (priv) {
|
||||
if (priv->frame0cache)
|
||||
gdispImageFree(img, (void *)priv->frame0cache, img->width * img->height * sizeof(pixel_t));
|
||||
gdispImageFree(img, (void *)priv, sizeof(gdispImagePrivate_NATIVE));
|
||||
img->priv = 0;
|
||||
}
|
||||
}
|
||||
@ -59,9 +62,9 @@ gdispImageError gdispImageOpen_NATIVE(gdispImage *img) {
|
||||
img->height = (((uint16_t)hdr[4])<<8) | (hdr[5]);
|
||||
if (img->width < 1 || img->height < 1)
|
||||
return GDISP_IMAGE_ERR_BADDATA;
|
||||
if (!(img->priv = (gdispImagePrivate *)gdispImageAlloc(img, sizeof(gdispImagePrivate))))
|
||||
if (!(img->priv = gdispImageAlloc(img, sizeof(gdispImagePrivate_NATIVE))))
|
||||
return GDISP_IMAGE_ERR_NOMEMORY;
|
||||
img->priv->frame0cache = 0;
|
||||
((gdispImagePrivate_NATIVE *)(img->priv))->frame0cache = 0;
|
||||
|
||||
img->type = GDISP_IMAGE_TYPE_NATIVE;
|
||||
return GDISP_IMAGE_ERR_OK;
|
||||
@ -69,20 +72,22 @@ gdispImageError gdispImageOpen_NATIVE(gdispImage *img) {
|
||||
|
||||
gdispImageError gdispImageCache_NATIVE(gdispImage *img) {
|
||||
size_t len;
|
||||
gdispImagePrivate_NATIVE * priv;
|
||||
|
||||
/* If we are already cached - just return OK */
|
||||
if (img->priv->frame0cache)
|
||||
priv = (gdispImagePrivate_NATIVE *)img->priv;
|
||||
if (priv->frame0cache)
|
||||
return GDISP_IMAGE_ERR_OK;
|
||||
|
||||
/* We need to allocate the cache */
|
||||
len = img->width * img->height * sizeof(pixel_t);
|
||||
img->priv->frame0cache = (pixel_t *)gdispImageAlloc(img, len);
|
||||
if (!img->priv->frame0cache)
|
||||
priv->frame0cache = (pixel_t *)gdispImageAlloc(img, len);
|
||||
if (!priv->frame0cache)
|
||||
return GDISP_IMAGE_ERR_NOMEMORY;
|
||||
|
||||
/* Read the entire bitmap into cache */
|
||||
gfileSetPos(img->f, FRAME0POS_NATIVE);
|
||||
if (gfileRead(img->f, img->priv->frame0cache, len) != len)
|
||||
if (gfileRead(img->f, priv->frame0cache, len) != len)
|
||||
return GDISP_IMAGE_ERR_BADDATA;
|
||||
|
||||
return GDISP_IMAGE_ERR_OK;
|
||||
@ -91,6 +96,9 @@ gdispImageError gdispImageCache_NATIVE(gdispImage *img) {
|
||||
gdispImageError gdispGImageDraw_NATIVE(GDisplay *g, gdispImage *img, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t sx, coord_t sy) {
|
||||
coord_t mx, mcx;
|
||||
size_t pos, len;
|
||||
gdispImagePrivate_NATIVE * priv;
|
||||
|
||||
priv = (gdispImagePrivate_NATIVE *)img->priv;
|
||||
|
||||
/* Check some reasonableness */
|
||||
if (sx >= img->width || sy >= img->height) return GDISP_IMAGE_ERR_OK;
|
||||
@ -98,8 +106,8 @@ gdispImageError gdispGImageDraw_NATIVE(GDisplay *g, gdispImage *img, coord_t x,
|
||||
if (sy + cy > img->height) cy = img->height - sy;
|
||||
|
||||
/* Draw from the image cache - if it exists */
|
||||
if (img->priv->frame0cache) {
|
||||
gdispGBlitArea(g, x, y, cx, cy, sx, sy, img->width, img->priv->frame0cache);
|
||||
if (priv->frame0cache) {
|
||||
gdispGBlitArea(g, x, y, cx, cy, sx, sy, img->width, priv->frame0cache);
|
||||
return GDISP_IMAGE_ERR_OK;
|
||||
}
|
||||
|
||||
@ -115,14 +123,14 @@ gdispImageError gdispGImageDraw_NATIVE(GDisplay *g, gdispImage *img, coord_t x,
|
||||
for(mx = x, mcx = cx; mcx > 0; mcx -= len, mx += len) {
|
||||
// Read the data
|
||||
len = gfileRead(img->f,
|
||||
img->priv->buf,
|
||||
priv->buf,
|
||||
mcx > BLIT_BUFFER_SIZE_NATIVE ? (BLIT_BUFFER_SIZE_NATIVE*sizeof(pixel_t)) : (mcx * sizeof(pixel_t)))
|
||||
/ sizeof(pixel_t);
|
||||
if (!len)
|
||||
return GDISP_IMAGE_ERR_BADDATA;
|
||||
|
||||
/* Blit the chunk of data */
|
||||
gdispGBlitArea(g, mx, y, len, 1, 0, 0, len, img->priv->buf);
|
||||
gdispGBlitArea(g, mx, y, len, 1, 0, 0, len, priv->buf);
|
||||
}
|
||||
|
||||
/* Get the position for the start of the next line */
|
||||
|
Loading…
Reference in New Issue
Block a user