/*
 ============================================================================
 Name        : LSM_pic_convert.c
 Changelog:
   July 2023: Fix bug that causes originally 255 (full brightness) value pixels to come out black (0) in converted image
   Around 2016: Initial version
 ============================================================================
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int
main(int argc, char ** argv)
{
	FILE * file_read;
	FILE *file_write;
	unsigned char *img = NULL;
	unsigned int w=512;
	unsigned int h=512;
	unsigned char red[w][h],green[w][h],blue[w][h];
	unsigned int x,y,r,g,b,i,j;
	unsigned int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int
	char outfilename[1000];
	int current_pixel; //this needs to be int so we can handle a EOF (-1, 0xffff) from fgetc correctly

	if(argc!=2){
		fprintf(stderr,"USAGE: lsm_pic_convert inputfile.\n");
		exit(1);
	}

	//read in .pic data
	if((file_read=fopen(argv[1],"rb"))==NULL){
		fprintf(stderr, "open read file error.\n");
		exit(1);
	}



	//Fill RGB array with image data from .PIC file
	for( i=0; i<h; i++)
	{
	    for( j=0; j<w; j++)
	{

	    	if( ( current_pixel = fgetc(file_read) ) != EOF ){
	    		red[j][(h-1)-i]=current_pixel;
	    		green[j][(h-1)-i]=current_pixel;
	    		blue[j][(h-1)-i] =current_pixel;
	    	}else{
	    		red[j][(h-1)-i]=0;
	    		green[j][(h-1)-i]=0;
	    		blue[j][(h-1)-i] =0;
	    	}

	}
	}

	fclose(file_read);

	strcpy(outfilename,argv[1]);
	strcat(outfilename,".bmp");

	//write BMP
	if( img )
	    free( img );
	img = (unsigned char *)malloc(3*w*h);
	memset(img,0,sizeof(img));

	//Write Buffer for image in .bmp format
	for( i=0; i<w; i++)
	{
	    for( j=0; j<h; j++)
	{
	    x=i; y=(h-1)-j;
	    r = red[i][j];
	    g = green[i][j];
	    b = blue[i][j];
	    if (r > 255) r=255;
	    if (g > 255) g=255;
	    if (b > 255) b=255;
	    img[(x+y*w)*3+2] = (unsigned char)(r);
	    img[(x+y*w)*3+1] = (unsigned char)(g);
	    img[(x+y*w)*3+0] = (unsigned char)(b);
	}
	}

	unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
	unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};
	unsigned char bmppad[3] = {0,0,0};

	bmpfileheader[ 2] = (unsigned char)(filesize    );
	bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
	bmpfileheader[ 4] = (unsigned char)(filesize>>16);
	bmpfileheader[ 5] = (unsigned char)(filesize>>24);

	bmpinfoheader[ 4] = (unsigned char)(       w    );
	bmpinfoheader[ 5] = (unsigned char)(       w>> 8);
	bmpinfoheader[ 6] = (unsigned char)(       w>>16);
	bmpinfoheader[ 7] = (unsigned char)(       w>>24);
	bmpinfoheader[ 8] = (unsigned char)(       h    );
	bmpinfoheader[ 9] = (unsigned char)(       h>> 8);
	bmpinfoheader[10] = (unsigned char)(       h>>16);
	bmpinfoheader[11] = (unsigned char)(       h>>24);

	file_write = fopen(outfilename,"wb");
	fwrite(bmpfileheader,1,14,file_write);
	fwrite(bmpinfoheader,1,40,file_write);
	for(i=0; i<h; i++)
	{
	    fwrite(img+(w*(h-i-1)*3),3,w,file_write);
	    fwrite(bmppad,1,(4-(w*3)%4)%4,file_write);
	}
	fclose(file_write);


	return 0;
}

