From: Nick Bowler Date: Sun, 30 Dec 2007 09:02:59 +0000 (-0500) Subject: Implement functions for loading palettes, and slightly improve the image reader. X-Git-Url: https://git.draconx.ca/gitweb/liblbx.git/commitdiff_plain/4a84fce79ab5326aae7aa9f99ccb38b5063b714a Implement functions for loading palettes, and slightly improve the image reader. --- diff --git a/src/image.c b/src/image.c index a5b8b05..9b9b1dd 100644 --- a/src/image.c +++ b/src/image.c @@ -119,14 +119,17 @@ static int _lbx_drawrow(int first, struct lbx_image *img) img->currenty += yval; img->currentx = xval; } else { - count = 0; -/* + if (fread(&yval, sizeof yval, 1, img->f) != 1) goto readerr; + yval = letohs(yval); img->foff += sizeof yval; + + /* FIXME Still have to figure out what to do here. */ + count = type; + if (count > img->width - img->currentx) { lbx_errno = LBX_EFORMAT; return -1; } -*/ } pos = &img->framedata[img->currenty][img->currentx]; @@ -215,6 +218,76 @@ unsigned char **lbximg_getframe(struct lbx_image *img, int frame) return img->framedata; } +int lbximg_loadpalette(FILE *f, struct lbx_colour palette[static 256]) +{ + uint8_t entry[4]; + int i; + + for (i = 0; i < 256; i++) { + if (fread(entry, sizeof entry, 1, f) != 1) { + lbx_errno = (feof(f)) ? LBX_EEOF : -errno; + return -1; + } + + if (entry[0] != 1) { + lbx_errno = LBX_EFORMAT; + return -1; + } + + palette[i] = (struct lbx_colour){ + .red = entry[1] << 2, + .green = entry[2] << 2, + .blue = entry[3] << 2, + }; + } + + return 0; +} + +int +lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256]) +{ + int index = 0; + size_t rc; + size_t hdrlen = 6*(sizeof img->width) + + (img->offs)*(sizeof *img->offsets); + + uint8_t entry[4]; + + /* Palette data is located right after the header. */ + if (_lbx_fseek(img->f, &img->foff, hdrlen) == -1) + return -1; + + while (img->foff + sizeof entry <= img->offsets[0]) { + rc = fread(entry, 1, sizeof entry, img->f); + img->foff += rc; + + if (rc < sizeof entry) { + goto readerr; + } + + if (entry[0] == 0) { + index++; + } else { + index = entry[0]; + } + + palette[index] = (struct lbx_colour){ + .red = entry[1] << 2, + .green = entry[2] << 2, + .blue = entry[3] << 2, + }; + } + + return 0; +readerr: + if (feof(img->f)) + lbx_errno = LBX_EEOF; + else + lbx_errno = -errno; + return -1; +} + void lbximg_close(struct lbx_image *img) { if (!img) return; diff --git a/src/image.h b/src/image.h index e9de2bd..83f03de 100644 --- a/src/image.h +++ b/src/image.h @@ -5,8 +5,17 @@ typedef struct lbx_image LBXIMG; +struct lbx_colour { + unsigned char red; + unsigned char green; + unsigned char blue; +}; + LBXIMG *lbximg_fopen(FILE *f); void lbximg_close(LBXIMG *img); unsigned char **lbximg_getframe(LBXIMG *img, int frame); +int lbximg_loadpalette(FILE *f, struct lbx_colour palette[static 256]); +int lbximg_getpalette(LBXIMG *img, struct lbx_colour palette[static 256]); + #endif