mirror of
https://xff.cz/git/u-boot/
synced 2025-09-04 02:02:08 +02:00
tools: bmp_logo: correctly interpret BMP files with larger headers
All BMP files were being treated as though they had a 40 byte header. There are several BMP header formats consisting of additional data. This was causing some of the header to be read as color information, skewing the color palette. Signed-off-by: Jon Smith <jtsmith@pdiarm.com>
This commit is contained in:
@@ -76,7 +76,7 @@ int main (int argc, char *argv[])
|
|||||||
FILE *fp;
|
FILE *fp;
|
||||||
bitmap_t bmp;
|
bitmap_t bmp;
|
||||||
bitmap_t *b = &bmp;
|
bitmap_t *b = &bmp;
|
||||||
uint16_t data_offset, n_colors;
|
uint16_t data_offset, n_colors, hdr_size;
|
||||||
|
|
||||||
if (argc < 3) {
|
if (argc < 3) {
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
@@ -108,7 +108,12 @@ int main (int argc, char *argv[])
|
|||||||
skip_bytes (fp, 8);
|
skip_bytes (fp, 8);
|
||||||
if (fread (&data_offset, sizeof (uint16_t), 1, fp) != 1)
|
if (fread (&data_offset, sizeof (uint16_t), 1, fp) != 1)
|
||||||
error ("Couldn't read bitmap data offset", fp);
|
error ("Couldn't read bitmap data offset", fp);
|
||||||
skip_bytes (fp, 6);
|
skip_bytes(fp, 2);
|
||||||
|
if (fread(&hdr_size, sizeof(uint16_t), 1, fp) != 1)
|
||||||
|
error("Couldn't read bitmap header size", fp);
|
||||||
|
if (hdr_size < 40)
|
||||||
|
error("Invalid bitmap header", fp);
|
||||||
|
skip_bytes(fp, 2);
|
||||||
if (fread (&b->width, sizeof (uint16_t), 1, fp) != 1)
|
if (fread (&b->width, sizeof (uint16_t), 1, fp) != 1)
|
||||||
error ("Couldn't read bitmap width", fp);
|
error ("Couldn't read bitmap width", fp);
|
||||||
skip_bytes (fp, 2);
|
skip_bytes (fp, 2);
|
||||||
@@ -117,7 +122,7 @@ int main (int argc, char *argv[])
|
|||||||
skip_bytes (fp, 22);
|
skip_bytes (fp, 22);
|
||||||
if (fread (&n_colors, sizeof (uint16_t), 1, fp) != 1)
|
if (fread (&n_colors, sizeof (uint16_t), 1, fp) != 1)
|
||||||
error ("Couldn't read bitmap colors", fp);
|
error ("Couldn't read bitmap colors", fp);
|
||||||
skip_bytes (fp, 6);
|
skip_bytes(fp, hdr_size - 34);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Repair endianess.
|
* Repair endianess.
|
||||||
|
Reference in New Issue
Block a user