188 |
|
br->hdr->hRes = rdint32(br); /* horizontal resolution */ |
189 |
|
br->hdr->vRes = rdint32(br); /* vertical resolution */ |
190 |
|
br->hdr->nColors = rdint32(br); /* # colors used */ |
191 |
+ |
if (!br->hdr->nColors && br->hdr->bpp <= 8) |
192 |
+ |
br->hdr->nColors = 1<<br->hdr->bpp; |
193 |
|
br->hdr->impColors = rdint32(br); /* # important colors */ |
194 |
|
if (br->hdr->impColors < 0) |
195 |
|
goto err; /* catch premature EOF */ |
259 |
|
return -1; |
260 |
|
if (hdr->bpp > 8) /* assume they had a reason for it */ |
261 |
|
return 0; |
262 |
< |
for (rgbp = hdr->palette, n = hdr->nColors; n-- > 0; rgbp++) |
263 |
< |
if (((rgbp->r != rgbp->g) | (rgbp->g != rgbp->b))) |
262 |
> |
for (rgbp = hdr->palette, n = hdr->impColors; n-- > 0; rgbp++) |
263 |
> |
if ((rgbp->r != rgbp->g) | (rgbp->g != rgbp->b)) |
264 |
|
return 0; |
265 |
|
return 1; /* all colors neutral in map */ |
266 |
|
} |
300 |
|
* is it specified what we should assume for missing pixels. This |
301 |
|
* is undoubtedly the most brain-dead format I've ever encountered. |
302 |
|
*/ |
303 |
< |
sp = br->scanline; |
303 |
> |
sp = (int8 *)br->scanline; |
304 |
|
n = br->hdr->width; |
305 |
|
if (br->hdr->compr == BI_RLE4) |
306 |
|
n = (n + 1) >> 1; |
453 |
|
case 8: |
454 |
|
return br->hdr->palette[br->scanline[i]]; |
455 |
|
case 1: |
456 |
< |
return br->hdr->palette[br->scanline[i>>3]>>((7-i)&7) & 1]; |
456 |
> |
return br->hdr->palette[br->scanline[i>>3]>>(7-(i&7)) & 1]; |
457 |
|
case 4: |
458 |
|
return br->hdr->palette[br->scanline[i>>1]>>(i&1?4:0) & 0xf]; |
459 |
|
case 16: |
549 |
|
else |
550 |
|
return NULL; |
551 |
|
hdr = (BMPHeader *)malloc(sizeof(BMPHeader) + |
552 |
< |
sizeof(RGBquad)*(1<<n) - |
552 |
> |
sizeof(RGBquad)*((size_t)1<<n) - |
553 |
|
sizeof(hdr->palette) + |
554 |
|
infolen); |
555 |
|
if (hdr == NULL) |
563 |
|
hdr->nColors = ncolors; |
564 |
|
hdr->impColors = 0; /* says all colors important */ |
565 |
|
hdr->infoSiz = infolen; |
566 |
< |
memset((void *)hdr->palette, 0, sizeof(RGBquad)*(1<<n) + infolen); |
566 |
> |
memset((void *)hdr->palette, 0, sizeof(RGBquad)*((size_t)1<<n) + infolen); |
567 |
|
for (n = ncolors; n--; ) |
568 |
|
hdr->palette[n].r = hdr->palette[n].g = |
569 |
|
hdr->palette[n].b = n*255/(ncolors-1); |
736 |
|
* (0x0000) except for the last, which ends in a bitmap break |
737 |
|
* (0x0001). We don't support RLE4 at all; it's too awkward. |
738 |
|
*/ |
739 |
< |
sp = bw->scanline; |
739 |
> |
sp = (const int8 *)bw->scanline; |
740 |
|
n = bw->hdr->width; |
741 |
|
while (n > 0) { |
742 |
|
int cnt, val; |
753 |
|
} |
754 |
|
if (n <= 0) /* was that it? */ |
755 |
|
break; |
756 |
< |
val = *sp; /* output run */ |
757 |
< |
for (cnt = 1; --n && cnt < 255; cnt++) |
758 |
< |
if (*++sp != val) |
756 |
> |
val = *sp++; /* output run */ |
757 |
> |
for (cnt = 1; --n && cnt < 255; cnt++, sp++) |
758 |
> |
if (*sp != val) |
759 |
|
break; |
760 |
|
wrbyte(cnt, bw); |
761 |
|
wrbyte(val, bw); |