Blame view

tools/bmp_logo.c 4.56 KB
375660907   Mike Frysinger   compiler.h: unify...
1
  #include "compiler.h"
0bbe2005e   wdenk   Initial revision
2

c270730f5   Che-Liang Chiou   tools: logo: spli...
3
4
5
6
  enum {
  	MODE_GEN_INFO,
  	MODE_GEN_DATA
  };
0bbe2005e   wdenk   Initial revision
7
8
9
10
11
12
13
14
  typedef struct bitmap_s {		/* bitmap description */
  	uint16_t width;
  	uint16_t height;
  	uint8_t	palette[256*3];
  	uint8_t	*data;
  } bitmap_t;
  
  #define DEFAULT_CMAP_SIZE	16	/* size of default color map	*/
c270730f5   Che-Liang Chiou   tools: logo: spli...
15
16
17
18
19
  void usage(const char *prog)
  {
  	fprintf(stderr, "Usage: %s [--gen-info|--gen-data] file
  ", prog);
  }
0bbe2005e   wdenk   Initial revision
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  /*
   * Neutralize little endians.
   */
  uint16_t le_short(uint16_t x)
  {
      uint16_t val;
      uint8_t *p = (uint8_t *)(&x);
  
      val =  (*p++ & 0xff) << 0;
      val |= (*p & 0xff) << 8;
  
      return val;
  }
  
  void skip_bytes (FILE *fp, int n)
  {
  	while (n-- > 0)
  		fgetc (fp);
  }
65351a879   Peter Tyser   bmp_logo: Check r...
39
40
41
42
43
44
45
46
47
48
  __attribute__ ((__noreturn__))
  int error (char * msg, FILE *fp)
  {
  	fprintf (stderr, "ERROR: %s
  ", msg);
  
  	fclose (fp);
  
  	exit (EXIT_FAILURE);
  }
c270730f5   Che-Liang Chiou   tools: logo: spli...
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  void gen_info(bitmap_t *b, uint16_t n_colors)
  {
  	printf("/*
  "
  		" * Automatically generated by \"tools/bmp_logo\"
  "
  		" *
  "
  		" * DO NOT EDIT
  "
  		" *
  "
  		" */
  
  
  "
  		"#ifndef __BMP_LOGO_H__
  "
  		"#define __BMP_LOGO_H__
  
  "
  		"#define BMP_LOGO_WIDTH\t\t%d
  "
  		"#define BMP_LOGO_HEIGHT\t\t%d
  "
  		"#define BMP_LOGO_COLORS\t\t%d
  "
  		"#define BMP_LOGO_OFFSET\t\t%d
  
  "
  		"extern unsigned short bmp_logo_palette[];
  "
  		"extern unsigned char bmp_logo_bitmap[];
  
  "
  		"#endif /* __BMP_LOGO_H__ */
  ",
  		b->width, b->height, n_colors,
  		DEFAULT_CMAP_SIZE);
  }
0bbe2005e   wdenk   Initial revision
89
90
  int main (int argc, char *argv[])
  {
c270730f5   Che-Liang Chiou   tools: logo: spli...
91
  	int	mode, i, x;
0bbe2005e   wdenk   Initial revision
92
93
94
  	FILE	*fp;
  	bitmap_t bmp;
  	bitmap_t *b = &bmp;
06d326d3a   Jon Smith   tools: bmp_logo: ...
95
  	uint16_t data_offset, n_colors, hdr_size;
0bbe2005e   wdenk   Initial revision
96

c270730f5   Che-Liang Chiou   tools: logo: spli...
97
98
  	if (argc < 3) {
  		usage(argv[0]);
0bbe2005e   wdenk   Initial revision
99
100
  		exit (EXIT_FAILURE);
  	}
c270730f5   Che-Liang Chiou   tools: logo: spli...
101
102
103
104
105
106
107
108
109
110
111
112
  	if (!strcmp(argv[1], "--gen-info"))
  		mode = MODE_GEN_INFO;
  	else if (!strcmp(argv[1], "--gen-data"))
  		mode = MODE_GEN_DATA;
  	else {
  		usage(argv[0]);
  		exit(EXIT_FAILURE);
  	}
  
  	fp = fopen(argv[2], "rb");
  	if (!fp) {
  		perror(argv[2]);
0bbe2005e   wdenk   Initial revision
113
114
  		exit (EXIT_FAILURE);
  	}
65351a879   Peter Tyser   bmp_logo: Check r...
115
116
  	if (fgetc (fp) != 'B' || fgetc (fp) != 'M')
  		error ("Input file is not a bitmap", fp);
0bbe2005e   wdenk   Initial revision
117

8bde7f776   wdenk   * Code cleanup:
118
119
  	/*
  	 * read width and height of the image, and the number of colors used;
0bbe2005e   wdenk   Initial revision
120
121
  	 * ignore the rest
  	 */
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
122
  	skip_bytes (fp, 8);
65351a879   Peter Tyser   bmp_logo: Check r...
123
124
  	if (fread (&data_offset, sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap data offset", fp);
06d326d3a   Jon Smith   tools: bmp_logo: ...
125
126
127
128
129
130
  	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);
65351a879   Peter Tyser   bmp_logo: Check r...
131
132
  	if (fread (&b->width,   sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap width", fp);
0bbe2005e   wdenk   Initial revision
133
  	skip_bytes (fp, 2);
65351a879   Peter Tyser   bmp_logo: Check r...
134
135
  	if (fread (&b->height,  sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap height", fp);
0bbe2005e   wdenk   Initial revision
136
  	skip_bytes (fp, 22);
65351a879   Peter Tyser   bmp_logo: Check r...
137
138
  	if (fread (&n_colors, sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap colors", fp);
06d326d3a   Jon Smith   tools: bmp_logo: ...
139
  	skip_bytes(fp, hdr_size - 34);
0bbe2005e   wdenk   Initial revision
140
141
142
143
  
  	/*
  	 * Repair endianess.
  	 */
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
144
  	data_offset = le_short(data_offset);
0bbe2005e   wdenk   Initial revision
145
146
147
148
149
150
151
152
153
  	b->width = le_short(b->width);
  	b->height = le_short(b->height);
  	n_colors = le_short(n_colors);
  
  	/* assume we are working with an 8-bit file */
  	if ((n_colors == 0) || (n_colors > 256 - DEFAULT_CMAP_SIZE)) {
  		/* reserve DEFAULT_CMAP_SIZE color map entries for default map */
  		n_colors = 256 - DEFAULT_CMAP_SIZE;
  	}
c270730f5   Che-Liang Chiou   tools: logo: spli...
154
155
156
157
158
159
160
  	if (mode == MODE_GEN_INFO) {
  		gen_info(b, n_colors);
  		goto out;
  	}
  
  	printf("/*
  "
0bbe2005e   wdenk   Initial revision
161
162
163
164
165
166
167
168
169
170
171
172
  		" * Automatically generated by \"tools/bmp_logo\"
  "
  		" *
  "
  		" * DO NOT EDIT
  "
  		" *
  "
  		" */
  
  
  "
c270730f5   Che-Liang Chiou   tools: logo: spli...
173
174
175
176
177
  		"#ifndef __BMP_LOGO_DATA_H__
  "
  		"#define __BMP_LOGO_DATA_H__
  
  ");
0bbe2005e   wdenk   Initial revision
178
179
  
  	/* allocate memory */
65351a879   Peter Tyser   bmp_logo: Check r...
180
181
  	if ((b->data = (uint8_t *)malloc(b->width * b->height)) == NULL)
  		error ("Error allocating memory for file", fp);
0bbe2005e   wdenk   Initial revision
182
183
  
  	/* read and print the palette information */
c270730f5   Che-Liang Chiou   tools: logo: spli...
184
185
  	printf("unsigned short bmp_logo_palette[] = {
  ");
0bbe2005e   wdenk   Initial revision
186
187
188
189
190
191
  
  	for (i=0; i<n_colors; ++i) {
  		b->palette[(int)(i*3+2)] = fgetc(fp);
  		b->palette[(int)(i*3+1)] = fgetc(fp);
  		b->palette[(int)(i*3+0)] = fgetc(fp);
  		x=fgetc(fp);
8655b6f86   wdenk   * Clean up tools/...
192
193
  		printf ("%s0x0%X%X%X,%s",
  			((i%8) == 0) ? "\t" : "  ",
0bbe2005e   wdenk   Initial revision
194
195
196
  			(b->palette[(int)(i*3+0)] >> 4) & 0x0F,
  			(b->palette[(int)(i*3+1)] >> 4) & 0x0F,
  			(b->palette[(int)(i*3+2)] >> 4) & 0x0F,
8655b6f86   wdenk   * Clean up tools/...
197
198
  			((i%8) == 7) ? "
  " : ""
0bbe2005e   wdenk   Initial revision
199
  		);
0bbe2005e   wdenk   Initial revision
200
  	}
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
201
202
  	/* seek to offset indicated by file header */
  	fseek(fp, (long)data_offset, SEEK_SET);
0bbe2005e   wdenk   Initial revision
203
204
205
206
207
208
209
  	/* read the bitmap; leave room for default color map */
  	printf ("
  ");
  	printf ("};
  ");
  	printf ("
  ");
c270730f5   Che-Liang Chiou   tools: logo: spli...
210
211
  	printf("unsigned char bmp_logo_bitmap[] = {
  ");
0bbe2005e   wdenk   Initial revision
212
213
  	for (i=(b->height-1)*b->width; i>=0; i-=b->width) {
  		for (x = 0; x < b->width; x++) {
3d192be9a   Heiko Schocher   tools, bmp_logo: ...
214
  			b->data[i + x] = (uint8_t) fgetc(fp)
0bbe2005e   wdenk   Initial revision
215
216
217
  						+ DEFAULT_CMAP_SIZE;
  		}
  	}
0bbe2005e   wdenk   Initial revision
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
  
  	for (i=0; i<(b->height*b->width); ++i) {
  		if ((i%8) == 0)
  			putchar ('\t');
  		printf ("0x%02X,%c",
  			b->data[i],
  			((i%8) == 7) ? '
  ' : ' '
  		);
  	}
  	printf ("
  "
  		"};
  
  "
c270730f5   Che-Liang Chiou   tools: logo: spli...
233
234
  		"#endif /* __BMP_LOGO_DATA_H__ */
  "
0bbe2005e   wdenk   Initial revision
235
  	);
c270730f5   Che-Liang Chiou   tools: logo: spli...
236
237
238
  out:
  	fclose(fp);
  	return 0;
0bbe2005e   wdenk   Initial revision
239
  }