/* Asset Package Compiler */ %{ #include #include #include #include "sprite.h" #include "symbol.h" #include extern void yyerror(); extern int linit(); extern int yylex(); int handle_fname(char *); int eval_png_file(char*); int read_png_file(char*); %} %define parse.error verbose %union{ char* str; } /* %token EXT */ /* %token FW */ /* %token SPR */ /* %token CC */ /* /\* Rules *\/ */ /* %% */ /* SS: SPR '/' MD '.' EXT */ /* MD: CC '_' FW */ /* | FW */ /* | CC */ %token FDAT /* Rules */ %% FLIST : FLIST FNAME {printf("reducing to flist\n");} /* Now output to asspack.o */ | FNAME FNAME : FDAT {printf("handle_fname(%s)\n", $1);handle_fname(yylval.str);printf("handled fname\n");} %% int main(int argc, char** argv) { /* Parse cmd line arguments */ linit(); yyparse(); /* runs handle_fname for each filename */ return 0; } void yyerror (char const *s) { fprintf(stderr, "%s\n", s); } /* Analyze file_name for information on sprite sheet, store sprite sheet and label into sprite then push sprite onto sprites[]*/ int handle_fname(char* file_name) { /* Parse the file_name for data */ /* Get the specs of the PNG file */ if(eval_png_file(file_name)) { printf("Failed in eval_png_file\n"); return 1; } /* Insert sprite sheet from PNG into sprite_sheets */ push_sprite(); /* Store dir/filename in label as well as any other data that fits */ } int eval_png_file(char* file_name) { /* Evaluate file_name for metadata */ /* Extracts header info from png_file */ read_png_file(file_name); /* Create the symbol and put it in symbol_table[]*/ return 0; } /* variables for libPNG */ int png_width,png_height; png_byte bit_depth; png_byte color_type; png_structp png_ptr; png_infop info_ptr; int read_png_file( char* file_name) { /* Setup PNG file */ char header[8]; int is_png = 0; char* dir = "pngfiles"; /* TODO: Change this fopen to a real var! */ FILE *fp = fopen("pngfiles/env_street_road03_0.png","rb"); if(!fp) { printf("Could not read file %s in handle_fname()", file_name); return 1; } fread(header, 1, 8, fp); is_png = !png_sig_cmp(header, 0, 8); if(!is_png) return 1; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { printf("Failed to allocate png_ptr\n"); return 1; } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { printf("Failed to create info_ptr\n"); png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL); return 1; } png_infop end_info = png_create_info_struct(png_ptr); if (!end_info) { printf("Failed to create end_info \n"); png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL); return 1; } if(setjmp(png_jmpbuf(png_ptr))) { printf("Failed in init_io\n"); png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL); fclose(fp); return 1; } png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); png_width = png_get_image_width(png_ptr, info_ptr); png_height = png_get_image_height(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); png_read_update_info(png_ptr, info_ptr); printf("successfully read png file %s\n", file_name); return 0; }