8 #define MAX_SPRITE_WIDTH 16
10 static void conv_sprite(int slice, unsigned char *img, int width, int height, int pitch);
11 static void conv_img_data(int sub, uint16_t *out, unsigned char *img, int width,
12 int height, int pitch);
14 int main(int argc, char **argv)
18 nslices = (width + MAX_SPRITE_WIDTH - 1) / MAX_SPRITE_WIDTH;
19 fprintf(stderr, "source image: %dx%d. splitting into %d slices\n",
20 width, height, nslices);
22 printf("\t.data\n\n");
24 for(i=0; i<nslices; i++) {
25 int xstart = i * MAX_SPRITE_WIDTH;
26 int spr_w = width - xstart;
27 if(spr_w > MAX_SPRITE_WIDTH) spr_w = MAX_SPRITE_WIDTH;
29 conv_sprite(i, header_data + xstart, spr_w, height, width);
32 printf("\n\t.global sprpal\n");
35 int r = header_data_cmap[i][0] >> 4;
36 int g = header_data_cmap[i][1] >> 4;
37 int b = header_data_cmap[i][2] >> 4;
38 unsigned int col = ((r & 0xf) << 8) | ((g & 0xf) << 4) | (b & 0xf);
39 printf("\t.short 0x%03x\n", col);
43 static void conv_sprite(int slice, unsigned char *img, int width, int height, int pitch)
49 printf("\n\t.global spr%d%c\n", slice, i == 0 ? 'a' : 'b');
50 printf("spr%d%c:\n", slice, i == 0 ? 'a' : 'b');
51 printf("\t.short 0, 0\n"); /* position x/y, vstop */
53 sprdata = malloc(height * 2 * sizeof *sprdata);
54 conv_img_data(i, sprdata, img, width, height, pitch);
56 for(j=0; j<height; j++) {
57 printf("\t.short 0x%x, 0x%x\n", (unsigned int)sprdata[j * 2],
58 (unsigned int)sprdata[j * 2 + 1]);
61 printf("\t.long 0\n"); /* end of sprite CW */
66 static void conv_img_data(int sub, uint16_t *out, unsigned char *img, int width,
67 int height, int pitch)
72 /* sprite 0: low order bits, sprite 1: high order bits */
73 inshift = sub == 0 ? 0 : 2;
75 for(i=0; i<height; i++) {
77 for(j=0; j<width; j++) {
78 bit0 = (bit0 << 1) | ((img[j] >> inshift) & 1);
79 bit1 = (bit1 << 1) | ((img[j] >> (inshift + 1)) & 1);
81 if(width < MAX_SPRITE_WIDTH) {
82 bit0 <<= MAX_SPRITE_WIDTH - width;
83 bit1 <<= MAX_SPRITE_WIDTH - width;