/* vector font IO */ T3F_VECTOR_FONT * t3f_load_vector_font_f(ALLEGRO_FILE * fp) { T3F_VECTOR_FONT * vfp = NULL; T3F_VECTOR_OBJECT * vp; float w; float max_y = 0.0; char header[16] = {0}; int i, j; if(al_fread(fp, header, 16) != 16) { return NULL; } if(stricmp(header, "T3FVF")) { return NULL; } vfp = t3f_create_vector_font(); if(!vfp) { return NULL; } for(i = 0; i < T3F_VECTOR_FONT_MAX_CHARACTERS; i++) { if(al_fgetc(fp)) { vp = t3f_load_vector_object_f(fp); w = t3f_fread_float(fp); t3f_add_vector_character(vfp, i, vp, w); for(j = 0; j < vp->segments; j++) { if(vp->segment[j]->point[0].y > max_y) { max_y = vp->segment[j]->point[0].y; } if(vp->segment[j]->point[1].y > max_y) { max_y = vp->segment[j]->point[1].y; } } } } vfp->height = max_y; return vfp; }
/* vector object IO */ T3F_VECTOR_OBJECT * t3f_load_vector_object_f(ALLEGRO_FILE * fp) { T3F_VECTOR_OBJECT * vp = NULL; T3F_VECTOR_SEGMENT segment; int r, g, b, a; char header[16] = {0}; int i; int segments = 0; if(al_fread(fp, header, 16) != 16) { return NULL; } if(stricmp(header, "T3FV")) { return NULL; } vp = t3f_create_vector_object(); if(!vp) { return NULL; } segments = al_fread32le(fp); for(i = 0; i < segments; i++) { segment.point[0].x = t3f_fread_float(fp); segment.point[0].y = t3f_fread_float(fp); segment.point[0].z = t3f_fread_float(fp); segment.point[1].x = t3f_fread_float(fp); segment.point[1].y = t3f_fread_float(fp); segment.point[1].z = t3f_fread_float(fp); r = al_fgetc(fp); g = al_fgetc(fp); b = al_fgetc(fp); a = al_fgetc(fp); segment.color = al_map_rgba(r, g, b, a); segment.thickness = t3f_fread_float(fp); if(!t3f_add_vector_segment(vp, segment.point[0].x, segment.point[0].y, segment.point[0].z, segment.point[1].x, segment.point[1].y, segment.point[1].z, segment.color, segment.thickness)) { return NULL; } } return vp; }
T3F_TILEMAP * t3f_load_tilemap_f(ALLEGRO_FILE * fp) { int i, j, k, w, h; T3F_TILEMAP * tmp; char header[16]; al_fread(fp, header, 16); if(strcmp(header, "T3F_TILEMAP")) { return NULL; } tmp = malloc(sizeof(T3F_TILEMAP)); if(!tmp) { return NULL; } switch(header[15]) { case 0: { tmp->layers = al_fread16le(fp); for(i = 0; i < tmp->layers; i++) { tmp->layer[i] = malloc(sizeof(T3F_TILEMAP_LAYER)); w = al_fread16le(fp); h = al_fread16le(fp); tmp->layer[i] = t3f_create_tilemap_layer(w, h); for(j = 0; j < tmp->layer[i]->height; j++) { for(k = 0; k < tmp->layer[i]->width; k++) { tmp->layer[i]->data[j][k] = al_fread16le(fp); } } tmp->layer[i]->x = t3f_fread_float(fp); tmp->layer[i]->y = t3f_fread_float(fp); tmp->layer[i]->z = t3f_fread_float(fp); tmp->layer[i]->scale = t3f_fread_float(fp); tmp->layer[i]->speed_x = t3f_fread_float(fp); tmp->layer[i]->speed_y = t3f_fread_float(fp); tmp->layer[i]->flags = al_fread32le(fp); } tmp->flags = al_fread32le(fp); break; } } return tmp; }
T3F_ANIMATION * t3f_load_animation_f(ALLEGRO_FILE * fp, const char * fn) { T3F_ANIMATION * ap; int i; char header[12] = {0}; int ver; int fpos = 0; ALLEGRO_STATE old_state; ALLEGRO_BITMAP * bp; al_fread(fp, header, 12); ver = check_header(header); if(ver < 0) { return NULL; } ap = t3f_create_animation(); if(ap) { switch(ver) { case 0: { ap->bitmaps->count = al_fread16le(fp); for(i = 0; i < ap->bitmaps->count; i++) { ap->bitmaps->bitmap[i] = t3f_load_resource_f((void **)(&ap->bitmaps->bitmap[i]), T3F_RESOURCE_TYPE_BITMAP, fp, fn, 1, 0); } ap->frames = al_fread16le(fp); for(i = 0; i < ap->frames; i++) { ap->frame[i] = al_malloc(sizeof(T3F_ANIMATION_FRAME)); if(!ap->frame[i]) { return NULL; } ap->frame[i]->bitmap = al_fread16le(fp); ap->frame[i]->x = t3f_fread_float(fp); ap->frame[i]->y = t3f_fread_float(fp); ap->frame[i]->z = t3f_fread_float(fp); ap->frame[i]->width = t3f_fread_float(fp); ap->frame[i]->height = t3f_fread_float(fp); ap->frame[i]->angle = t3f_fread_float(fp); ap->frame[i]->ticks = al_fread32le(fp); ap->frame[i]->flags = al_fread32le(fp); } ap->flags = al_fread32le(fp); break; } case 1: { ap->bitmaps->count = al_fread16le(fp); for(i = 0; i < ap->bitmaps->count; i++) { fpos = al_ftell(fp); ap->bitmaps->bitmap[i] = t3f_load_resource_f((void **)(&ap->bitmaps->bitmap[i]), T3F_RESOURCE_TYPE_BITMAP, fp, fn, 0, 0); if(!ap->bitmaps->bitmap[i]) { al_fseek(fp, fpos, ALLEGRO_SEEK_SET); al_store_state(&old_state, ALLEGRO_STATE_NEW_BITMAP_PARAMETERS); al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP); bp = t3f_load_bitmap_f(fp); al_restore_state(&old_state); if(bp) { ap->bitmaps->bitmap[i] = t3f_squeeze_bitmap(bp, NULL, NULL); al_destroy_bitmap(bp); } } else if(al_get_bitmap_flags(ap->bitmaps->bitmap[i]) & ALLEGRO_MEMORY_BITMAP) { bp = t3f_squeeze_bitmap(ap->bitmaps->bitmap[i], NULL, NULL); al_destroy_bitmap(ap->bitmaps->bitmap[i]); ap->bitmaps->bitmap[i] = bp; } if(!ap->bitmaps->bitmap[i]) { return NULL; } } ap->frames = al_fread16le(fp); for(i = 0; i < ap->frames; i++) { ap->frame[i] = al_malloc(sizeof(T3F_ANIMATION_FRAME)); if(!ap->frame[i]) { return NULL; } ap->frame[i]->bitmap = al_fread16le(fp); ap->frame[i]->x = t3f_fread_float(fp); ap->frame[i]->y = t3f_fread_float(fp); ap->frame[i]->z = t3f_fread_float(fp); ap->frame[i]->width = t3f_fread_float(fp); ap->frame[i]->height = t3f_fread_float(fp); ap->frame[i]->angle = t3f_fread_float(fp); ap->frame[i]->ticks = al_fread32le(fp); ap->frame[i]->flags = al_fread32le(fp); } ap->flags = al_fread32le(fp); break; } } } t3f_animation_build_frame_list(ap); return ap; }