#include #include #include #include "convcom.c" typedef struct { unsigned char r, g, b, a; } Colour; int main(int argc, char** argv) { FILE* outfile, * infile; char bmp_magic[2]; int ret = 0; unsigned bmp_offset; int bmp_w, bmp_h, x, y, s, bs; unsigned short bmp_bits; unsigned* bitmap; Colour pixel, * buffer; unsigned char t; if (argc < 3) { fprintf(stderr, "Usage: %s infile outfile.\n", argv[0]); return 1; } infile = fopen(argv[1], "rb"); if (!infile) { fprintf(stderr, "Failed to open %s.\n", argv[1]); return 2; } fread(bmp_magic, 2, 1, infile); if (bmp_magic[0] != 'B' || bmp_magic[1] != 'M') { ret = 3; fprintf(stderr, "Not a valid bitmap file.\n"); goto end; } fseek(infile, 10, SEEK_SET); fread(&bmp_offset, 4, 1, infile); fseek(infile, 18, SEEK_SET); fread(&bmp_w, 4, 1, infile); fread(&bmp_h, 4, 1, infile); fseek(infile, 28, SEEK_SET); fread(&bmp_bits, 2, 1, infile); if (bmp_bits != 32) { ret = 4; fprintf(stderr, "Bitmap must have 32 bit pixels. %d\n", bmp_bits); goto end; } fseek(infile, bmp_offset, SEEK_SET); s = bmp_w * bmp_h; buffer = malloc(s * 4); /* Read & flip */ for (y = 0; y < bmp_h; y++) { for (x = 0; x < bmp_w; x++) { fread(&pixel, 1, 4, infile); t = pixel.r; pixel.r = pixel.b; pixel.b = t; if (pixel.a == 0) { pixel.r = 0; pixel.g = 0; pixel.b = 0; } buffer[x + (bmp_h - y - 1) * bmp_w] = pixel; } } outfile = fopen(argv[2], "wb"); if (!outfile) { fprintf(stderr, "Failed to open %s.\n", argv[2]); fclose(infile); return 2; } bs = (bmp_w * bmp_h + 32) / 32 * 4; bitmap = calloc(bs, 1); for (y = 0; y < bmp_h; y++) { for (x = 0; x < bmp_w; x++) { int idx = x + y * bmp_w; if (buffer[idx].r) { bitmap[idx / 32] |= 1 << (idx % 32); } } } fwrite(&bmp_w, 1, 2, outfile); fwrite(&bmp_h, 1, 2, outfile); fwrite(bitmap, 1, bs, outfile); pad_file(4 + bs, outfile); free(buffer); end: fclose(infile); fclose(outfile); return ret; }