//
// bmp.cpp : reads or writes a 24-bit .BMP file
//
#include <stdio.h>
#include <stdlib.h>
#include "bmp.h"

int main(int argc, char* argv[])
{

	BMPFileHeader	fheader;
	FILE			*f;

	if ( *argv[2] == 'r' ) {
	// try to read one
	f = fopen (argv[1], "rb" );
	if (!f) {
		fprintf ( stderr, "can't open file");
		exit(1);
	}

	fread (&fheader.filetype,2,1,f);
	fread (&fheader.filesize,4,1,f);
	fread (&fheader.reserved,4,1,f);
	fread (&fheader.offset,4,1,f);
	fread (&fheader.bytesInHeader,4,1,f);
	fread (&fheader.width,4,1,f);
	fread (&fheader.height,4,1,f);
	fread (&fheader.planes,2,1,f);
	fread (&fheader.bitsPerPixel,2,1,f);
	fread (&fheader.compression,4,1,f);
	fread (&fheader.size,4,1,f);
	fread (&fheader.horizRes,4,1,f);
	fread (&fheader.vertRes,4,1,f);
	fread (&fheader.indicesUsed,4,1,f);
	fread (&fheader.indicesImportant,4,1,f);


	printf ("width =%d\n", fheader.width );
	printf ("height = %d\n", fheader.height );
	printf ("bitsPerPixel = %d\n", fheader.bitsPerPixel );

	} else {

	// try to write one
	f = fopen (argv[1], "wb" );
	if (!f) {
		fprintf ( stderr, "can't open file");
		exit(1);
	}
	int w = 100;
	int h = 100;
	int bytes = 0;
	fheader.filetype = 'M' << 8 | 'B';
	fheader.filesize = 0;  // fill in later
	fheader.reserved = 0;
	fheader.offset = 40; // ?
	fheader.bytesInHeader = 40;
	fheader.width = w;
	fheader.height = h;
	fheader.planes = 1;
	fheader.bitsPerPixel = 24;
	fheader.compression = 0;
	fheader.size = 0;
	fheader.horizRes = 0;
	fheader.vertRes = 0;
	fheader.indicesUsed = 0;
	fheader.indicesImportant = 0;

	fwrite (&fheader.filetype,2,1,f);
	fwrite (&fheader.filesize,4,1,f);
	fwrite (&fheader.reserved,4,1,f);
	fwrite (&fheader.offset,4,1,f);
	fwrite (&fheader.bytesInHeader,4,1,f);
	fwrite (&fheader.width,4,1,f);
	fwrite (&fheader.height,4,1,f);
	fwrite (&fheader.planes,2,1,f);
	fwrite (&fheader.bitsPerPixel,2,1,f);
	fwrite (&fheader.compression,4,1,f);
	fwrite (&fheader.size,4,1,f);
	fwrite (&fheader.horizRes,4,1,f);
	fwrite (&fheader.vertRes,4,1,f);
	fwrite (&fheader.indicesUsed,4,1,f);
	fwrite (&fheader.indicesImportant,4,1,f);

	// checkerboard
	int i,  j;

	for ( i = 0; i < h; i++ ) {
		int rowbytes = 0;
		for ( j = 0; j < w; j++ ) {
			if ( ((j/10)%2) != ((i/10)%2) ) {
				// BGR
				fputc ( 0x0, f ); fputc ( 0x0, f ); fputc (0xff, f);
			}
			else {
				fputc ( 0x00, f );fputc ( 0xff, f ); fputc (0, f);
			}
			rowbytes += 3;
		}
		// pad to 32-bit bdy
		while ( rowbytes % 4 ) {
			fputc(0,f);  
			rowbytes++;
		}
	}

	}
	return 0;
}
