]> git.draconx.ca Git - liblbx.git/commitdiff
Move reading of embedded palette header into lbximg_fopen().
authorNick Bowler <draconx@gmail.com>
Fri, 4 Jan 2008 21:33:42 +0000 (16:33 -0500)
committerNick Bowler <draconx@gmail.com>
Fri, 4 Jan 2008 21:33:42 +0000 (16:33 -0500)
src/image.c
src/image.h
src/lbximg.c

index 6c77ed3d3a335ac89e92462922b978165409c496..fda9dfc7b04a585839142af0c4f6ad50405e4aac 100644 (file)
@@ -40,9 +40,10 @@ struct lbx_image {
        uint16_t wtf1;
        uint16_t frames, leadin;
        uint16_t flags;
+       uint16_t palstart, palcount;
 
        FILE *f;
-       long foff;
+       long foff, paloff;
 
        int currentframe;
        int currentx, currenty;
@@ -95,6 +96,24 @@ struct lbx_image *lbximg_fopen(FILE *f)
                goto readerr;
        new->foff += sizeof *new->offsets * (new->frames+1);
 
+       if (new->flags & FLAG_PALETTE) {
+               if (fread(&new->palstart, sizeof new->palstart, 1, f) != 1)
+                       goto readerr;
+               if (fread(&new->palcount, sizeof new->palcount, 1, f) != 1)
+                       goto readerr;
+
+               new->palstart = letohs(new->palstart);
+               new->palcount = letohs(new->palcount);
+               new->foff    += sizeof new->palstart + sizeof new->palcount;
+               new->paloff   = new->foff;
+
+               if (new->palstart + new->palcount > 256) {
+                       lbx_errno = LBX_EFORMAT;
+                       free(new);
+                       return NULL;
+               }
+       }
+
        return new;
 readerr:
        if (feof(f)) {
@@ -303,38 +322,19 @@ int lbximg_loadpalette(FILE *f, struct lbx_colour palette[static 256])
 int
 lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
 {
-       size_t hdrlen = 6*(sizeof img->wtf1)+(img->frames+1)*(sizeof *img->offsets);
        unsigned int i;
        size_t rc;
 
-       uint16_t start, count;
        uint8_t  entry[4];
 
        /* Do nothing if the image doesn't have embedded palette data. */
        if (!(img->flags & FLAG_PALETTE))
                return 0;
 
-       /* Palette data is located right after the header. */
-       if (_lbx_fseek(img->f, &img->foff, hdrlen) == -1)
+       if (_lbx_fseek(img->f, &img->foff, img->paloff) == -1)
                return -1;
        
-       /* Palette header */
-       if (fread(&start, sizeof start, 1, img->f) != 1) goto readerr;
-       if (fread(&count, sizeof count, 1, img->f) != 1) goto readerr;
-       start = letohs(start); img->foff += sizeof start;
-       count = letohs(count); img->foff += sizeof count;
-
-       if (start + count > 256) {
-               lbx_errno = LBX_EFORMAT;
-               return -1;
-       }
-
-       if (hdrlen + 2*sizeof start + count*sizeof entry > img->offsets[0]) {
-               lbx_errno = LBX_EFORMAT;
-               return -1;
-       }
-
-       for (i = 0; i < count; i++) {
+       for (i = 0; i < img->palcount; i++) {
                rc = fread(entry, 1, sizeof entry, img->f);
                img->foff += rc;
 
@@ -347,7 +347,7 @@ lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
                        return -1;
                }
 
-               palette[start + i] = (struct lbx_colour){
+               palette[img->palstart + i] = (struct lbx_colour){
                        .red   = entry[1] << 2,
                        .green = entry[2] << 2,
                        .blue  = entry[3] << 2,
@@ -366,7 +366,7 @@ void lbximg_getinfo(struct lbx_image *img, struct lbx_imginfo *info)
                .width      = img->width,
                .height     = img->height,
                .nframes    = img->frames,
-               .haspalette = (_Bool)(img->flags & FLAG_PALETTE),
+               .palettesz  = (img->flags & FLAG_PALETTE) ? img->palcount : 0,
        };
 
        /* There seems to be two ways of specifying that an image loops. */
index 3ef95ab95f821430dec4d028634b2a3f947d84ae..7f70b434550cd6c589d5c6e886bf4e95de862017 100644 (file)
@@ -14,7 +14,7 @@ struct lbx_colour {
 struct lbx_imginfo {
        unsigned int width, height;
        unsigned int nframes, loopstart;
-       int haspalette;
+       int palettesz;
        int looping;
 };
 
index 730c0af69e1e4e21d9d02b129dd3b506c44f2bb0..921d42b797c6a8bd3d35f763d0d4288bbea75059 100644 (file)
@@ -224,7 +224,7 @@ static int loadoverride(FILE *f, struct lbx_colour palette[static 256])
        }
        lbximg_getinfo(overimg, &info);
 
-       if (!info.haspalette) {
+       if (!info.palettesz) {
                errmsg("override image has no palette.\n", 0);
                lbximg_close(overimg);
                return -1;
@@ -256,7 +256,7 @@ static int loadpalette(LBX_IMG *img, struct lbx_imginfo *info,
        }
 
        /* For sanity. */
-       if (!palf && !info->haspalette && !override) {
+       if (!palf && !info->palettesz && !override) {
                errmsg("no palette available.\n", 0);
                return -1;
        }
@@ -273,7 +273,7 @@ static int loadpalette(LBX_IMG *img, struct lbx_imginfo *info,
        }
 
        /* Read the embedded palette, if any. */
-       if (info->haspalette && lbximg_getpalette(img, palette) == -1) {
+       if (info->palettesz && lbximg_getpalette(img, palette) == -1) {
                errmsg("error reading embedded palette: %s\n", lbx_strerror());
                return -1;
        }
@@ -433,8 +433,8 @@ int main(int argc, char **argv)
 
                printf("%s is %ux%u LBX image, %u frame(s)%s%s\n",
                       name, info.width, info.height, info.nframes,
-                      info.haspalette ? ", embedded palette" : "",
-                      info.looping    ? ", loops" : "");
+                      info.palettesz ? ", embedded palette" : "",
+                      info.looping   ? ", loops" : "");
        }
 
        switch (mode) {