Blame view

tools/bmp_logo.c 4.95 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
  enum {
  	MODE_GEN_INFO,
245b1029e   Heiko Schocher   bmp_logo: support...
5
6
  	MODE_GEN_DATA,
  	MODE_GEN_BMP
c270730f5   Che-Liang Chiou   tools: logo: spli...
7
  };
0bbe2005e   wdenk   Initial revision
8
9
10
11
12
13
14
15
  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...
16
17
  void usage(const char *prog)
  {
245b1029e   Heiko Schocher   bmp_logo: support...
18
19
20
  	fprintf(stderr, "Usage: %s [--gen-info|--gen-data|--gen-bmp] file
  ",
  		prog);
c270730f5   Che-Liang Chiou   tools: logo: spli...
21
  }
0bbe2005e   wdenk   Initial revision
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  /*
   * 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...
41
42
43
44
45
46
47
48
49
50
  __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...
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
89
90
  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
91
92
  int main (int argc, char *argv[])
  {
c270730f5   Che-Liang Chiou   tools: logo: spli...
93
  	int	mode, i, x;
245b1029e   Heiko Schocher   bmp_logo: support...
94
  	int	size;
0bbe2005e   wdenk   Initial revision
95
96
97
  	FILE	*fp;
  	bitmap_t bmp;
  	bitmap_t *b = &bmp;
06d326d3a   Jon Smith   tools: bmp_logo: ...
98
  	uint16_t data_offset, n_colors, hdr_size;
0bbe2005e   wdenk   Initial revision
99

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

8bde7f776   wdenk   * Code cleanup:
123
124
  	/*
  	 * read width and height of the image, and the number of colors used;
0bbe2005e   wdenk   Initial revision
125
126
  	 * ignore the rest
  	 */
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
127
  	skip_bytes (fp, 8);
65351a879   Peter Tyser   bmp_logo: Check r...
128
129
  	if (fread (&data_offset, sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap data offset", fp);
06d326d3a   Jon Smith   tools: bmp_logo: ...
130
131
132
133
134
135
  	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...
136
137
  	if (fread (&b->width,   sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap width", fp);
0bbe2005e   wdenk   Initial revision
138
  	skip_bytes (fp, 2);
65351a879   Peter Tyser   bmp_logo: Check r...
139
140
  	if (fread (&b->height,  sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap height", fp);
0bbe2005e   wdenk   Initial revision
141
  	skip_bytes (fp, 22);
65351a879   Peter Tyser   bmp_logo: Check r...
142
143
  	if (fread (&n_colors, sizeof (uint16_t), 1, fp) != 1)
  		error ("Couldn't read bitmap colors", fp);
06d326d3a   Jon Smith   tools: bmp_logo: ...
144
  	skip_bytes(fp, hdr_size - 34);
0bbe2005e   wdenk   Initial revision
145
146
147
148
  
  	/*
  	 * Repair endianess.
  	 */
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
149
  	data_offset = le_short(data_offset);
0bbe2005e   wdenk   Initial revision
150
151
152
  	b->width = le_short(b->width);
  	b->height = le_short(b->height);
  	n_colors = le_short(n_colors);
245b1029e   Heiko Schocher   bmp_logo: support...
153
  	size = b->width * b->height;
0bbe2005e   wdenk   Initial revision
154
155
156
157
158
159
  
  	/* 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...
160
161
162
163
164
165
166
  	if (mode == MODE_GEN_INFO) {
  		gen_info(b, n_colors);
  		goto out;
  	}
  
  	printf("/*
  "
0bbe2005e   wdenk   Initial revision
167
168
169
170
171
172
173
174
175
176
177
178
  		" * Automatically generated by \"tools/bmp_logo\"
  "
  		" *
  "
  		" * DO NOT EDIT
  "
  		" *
  "
  		" */
  
  
  "
c270730f5   Che-Liang Chiou   tools: logo: spli...
179
180
181
182
183
  		"#ifndef __BMP_LOGO_DATA_H__
  "
  		"#define __BMP_LOGO_DATA_H__
  
  ");
0bbe2005e   wdenk   Initial revision
184

0bbe2005e   wdenk   Initial revision
185
  	/* read and print the palette information */
c270730f5   Che-Liang Chiou   tools: logo: spli...
186
187
  	printf("unsigned short bmp_logo_palette[] = {
  ");
0bbe2005e   wdenk   Initial revision
188
189
190
191
192
193
  
  	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/...
194
195
  		printf ("%s0x0%X%X%X,%s",
  			((i%8) == 0) ? "\t" : "  ",
0bbe2005e   wdenk   Initial revision
196
197
198
  			(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/...
199
200
  			((i%8) == 7) ? "
  " : ""
0bbe2005e   wdenk   Initial revision
201
  		);
0bbe2005e   wdenk   Initial revision
202
  	}
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
203
  	/* seek to offset indicated by file header */
245b1029e   Heiko Schocher   bmp_logo: support...
204
205
206
207
208
209
210
211
212
213
214
215
216
  	if (mode == MODE_GEN_BMP) {
  		/* copy full bmp file */
  		fseek(fp, 0L, SEEK_END);
  		size = ftell(fp);
  		fseek(fp, 0L, SEEK_SET);
  	} else {
  		fseek(fp, (long)data_offset, SEEK_SET);
  	}
  
  	/* allocate memory */
  	b->data = (uint8_t *)malloc(size);
  	if (!b->data)
  		error("Error allocating memory for file", fp);
fd4bb67bd   Wolfgang Denk   Fix tools/bmp_log...
217

0bbe2005e   wdenk   Initial revision
218
219
220
221
222
223
224
  	/* read the bitmap; leave room for default color map */
  	printf ("
  ");
  	printf ("};
  ");
  	printf ("
  ");
c270730f5   Che-Liang Chiou   tools: logo: spli...
225
226
  	printf("unsigned char bmp_logo_bitmap[] = {
  ");
245b1029e   Heiko Schocher   bmp_logo: support...
227
228
229
230
231
232
233
234
  	if (mode == MODE_GEN_BMP) {
  		/* write full bmp */
  		for (i = 0; i < size; i++)
  			b->data[i] = (uint8_t)fgetc(fp);
  	} else {
  		for (i = (b->height - 1) * b->width; i >= 0; i -= b->width) {
  			for (x = 0; x < b->width; x++) {
  				b->data[i + x] = (uint8_t)fgetc(fp)
0bbe2005e   wdenk   Initial revision
235
  						+ DEFAULT_CMAP_SIZE;
245b1029e   Heiko Schocher   bmp_logo: support...
236
  			}
0bbe2005e   wdenk   Initial revision
237
238
  		}
  	}
0bbe2005e   wdenk   Initial revision
239

245b1029e   Heiko Schocher   bmp_logo: support...
240
  	for (i = 0; i < size; ++i) {
0bbe2005e   wdenk   Initial revision
241
242
243
244
245
246
247
248
249
250
251
252
253
  		if ((i%8) == 0)
  			putchar ('\t');
  		printf ("0x%02X,%c",
  			b->data[i],
  			((i%8) == 7) ? '
  ' : ' '
  		);
  	}
  	printf ("
  "
  		"};
  
  "
c270730f5   Che-Liang Chiou   tools: logo: spli...
254
255
  		"#endif /* __BMP_LOGO_DATA_H__ */
  "
0bbe2005e   wdenk   Initial revision
256
  	);
c270730f5   Che-Liang Chiou   tools: logo: spli...
257
258
259
  out:
  	fclose(fp);
  	return 0;
0bbe2005e   wdenk   Initial revision
260
  }