#include #include #include #include #include #include #define APPLICATION_NAME "PalJoin" #define MAX_LINE 1024 #define MAX_ENTRIES 256 #define MAXIMAL_ENTRY 255 #define MINIMAL_ENTRY 0 #define DELIMITERS ",\t " void main(int argc,char *argv[]){ char inStr[MAX_LINE]; char *inFileName,*sourceBaseString,*rangeString,*destinationBaseString; int sourceBase,range,destinationBase; int lineCount=0; int y; FILE *fileHandle; br_pixelmap *destinationMap, *sourceMap; br_colour colour; // Give user options list if inappropriate argc if(argc!=3){ fprintf(stderr,"\nUsage: %s \n\n",APPLICATION_NAME); fprintf(stderr,"This utility is designed to allow you to construct a new palette out of bits\n"); fprintf(stderr,"of existing palettes.\n\n"); fprintf(stderr,"Empty lines in the input file, or lines begining with # or ; will be ignored.\n\n"); fprintf(stderr,"A valid line in the input file will contain the following delimited by space,\n"); fprintf(stderr,"tab or comma:\n"); fprintf(stderr,"\t : Palette file name.\n"); fprintf(stderr,"\t : Source Index-Base - where to start reading colours from.\n"); fprintf(stderr,"\t : Index-Range - number of colours to copy.\n"); fprintf(stderr,"\t : Destination Index-Base - where to start writing colours to.\n"); fprintf(stderr,"\nExample:\n"); fprintf(stderr,"std.pal 0 64 192\n\n"); fprintf(stderr," - Copies first 64 colours from std.pal to last 64 colours of output.\n"); fprintf(stderr,"\nThe output file will be written once every line of the input file has been\n"); fprintf(stderr,"processed.\n"); exit(0); } // Get parameter file fileHandle=fopen(argv[1],"r"); if(!fileHandle){ fprintf(stderr,"Failed to open input file %s.\n",argv[1]); exit(0); } BrBegin(); destinationMap=BrPixelmapAllocate(BR_PMT_RGBX_888,1,256,NULL,BR_PMAF_NORMAL); while(!feof(fileHandle)){ lineCount++; // Read in line from file inStr[0]='\n'; // make sure it can handle empty lines fgets(inStr,MAX_LINE,fileHandle); // Break it into parameters inFileName=strtok(inStr,DELIMITERS); sourceBaseString=strtok(NULL,DELIMITERS); rangeString=strtok(NULL,DELIMITERS); destinationBaseString=strtok(NULL,DELIMITERS); // Skip comments and blank lines if(!((*inFileName=='#')||(*inFileName==';')||(*inFileName=='\n'))){ // Pre-process parameters // Source file sourceMap=BrPixelmapLoad(inFileName); if(!sourceMap){ fprintf(stderr,"Unable to open palette %s for input.",inFileName); exit(0); } // SourceIndexBase if(isdigit(*sourceBaseString)){ sourceBase=atoi(sourceBaseString); }else{ fprintf(stderr,"Poorly formed SourceIndexBase on line %d.",lineCount); exit(0); } if(sourceBaseMAXIMAL_ENTRY){ fprintf(stderr,"SourceIndexBase should be in the range [0,255] on line %d.",lineCount); exit(0); } // IndexRange if(isdigit(*rangeString)){ range=atoi(rangeString); }else{ fprintf(stderr,"Poorly formed 'Range' on line %d.",lineCount); exit(0); } if(rangeMAXIMAL_ENTRY){ fprintf(stderr,"'Range' should be in the range [1,256] on line %d.",lineCount); exit(0); } // DestinationIndexBase if(isdigit(*destinationBaseString)){ destinationBase=atoi(destinationBaseString); }else{ fprintf(stderr,"Poorly formed DestinationIndexBase on line %d.",lineCount); exit(0); } if(destinationBaseMAXIMAL_ENTRY){ fprintf(stderr,"DestinationIndexBase should be in the range [0,255] on line %d.",lineCount); exit(0); } // Tell the user what is happening printf("Processing line %d: %s %d %d %d\n",lineCount,inFileName,sourceBase,range,destinationBase); if(sourceBase+range>MAX_ENTRIES)fprintf(stderr,"\tSourceIndexBase+Range>256 will not read past end of palette\n"); if(destinationBase+range>MAX_ENTRIES)fprintf(stderr,"\tDestinationIndexBase+Range>256 will not write past end of palette\n"); // reset origin sourceMap->origin_x=0; sourceMap->origin_y=0; // Do the real work for(y=0;(y