2 * Copyright (c) 1999 Greg Haerr <greg@censoft.com>
4 * Framebuffer data to .bmp file converter
14 #define BI_BITFIELDS 3L
16 typedef unsigned char BYTE;
17 typedef unsigned short WORD;
18 typedef unsigned long DWORD;
45 int MakeBMP(FILE *ifp,FILE *ofp);
48 main(int ac,char **av)
54 fprintf(stderr, "Usage: makebmp <infile> <outfile>\n");
57 ifp = fopen(av[1], "rb");
59 fprintf(stderr, "Can't open file: %s\n", av[1]);
62 ofp = fopen(av[2], "wb");
64 fprintf(stderr, "Can't create file: %s\n", av[2]);
67 if(!MakeBMP(ifp, ofp)) {
68 fprintf(stderr, "Conversion failed: %s\n", av[2]);
78 /* create a bmp file*/
80 MakeBMP(FILE *ifp, FILE *ofp)
84 int cx, cy, extra, bitdepth, ncolors;
91 ncolors = 1<<bitdepth;
94 memset(&bmp, 0, sizeof(bmp));
97 bmp.bfSize = sizeof(bmp) + ncolors*4 + (long)cx*cy;
98 bmp.bfOffBits = sizeof(bmp) + ncolors*4;
103 bmp.BiBitCount = bitdepth;
104 bmp.BiCompression = BI_RGB;
105 //bmp.BiSizeImage = ??;
106 bmp.BiClrUsed = ncolors;
107 bmp.BiClrImportant = ncolors;
110 fwrite(&bmp, sizeof(bmp), 1, ofp);
114 for(i=0; i<ncolors; i++) {
115 unsigned char r, g, b;
126 /* write image data, upside down ;)*/
127 for(i=cy-1; i>0; --i) {
128 long base = sizeof(bmp) + ncolors*4 + (long)i*cx;
129 fseek(ofp, base, SEEK_SET);
131 putc(getc(ifp), ofp);
132 for(j=0; j<extra; ++j)
133 putc(0, ofp); /* DWORD pad each line*/