/* read_win_bminfoheader: * Reads information from a BMP file header. */ static int read_win_bminfoheader(ALLEGRO_FILE *f, BMPINFOHEADER *infoheader) { WINBMPINFOHEADER win_infoheader; win_infoheader.biWidth = al_fread32le(f); win_infoheader.biHeight = al_fread32le(f); win_infoheader.biPlanes = al_fread16le(f); win_infoheader.biBitCount = al_fread16le(f); win_infoheader.biCompression = al_fread32le(f); win_infoheader.biSizeImage = al_fread32le(f); win_infoheader.biXPelsPerMeter = al_fread32le(f); win_infoheader.biYPelsPerMeter = al_fread32le(f); win_infoheader.biClrUsed = al_fread32le(f); win_infoheader.biClrImportant = al_fread32le(f); infoheader->biWidth = win_infoheader.biWidth; infoheader->biHeight = win_infoheader.biHeight; infoheader->biBitCount = win_infoheader.biBitCount; infoheader->biCompression = win_infoheader.biCompression; infoheader->biClrUsed = win_infoheader.biClrUsed; if (al_feof(f) || al_ferror(f)) { ALLEGRO_ERROR("Failed to read file header\n"); return -1; } return 0; }
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; }
/* read_bmfileheader: * Reads a BMP file header and check that it has the BMP magic number. */ static int read_bmfileheader(ALLEGRO_FILE *f, BMPFILEHEADER *fileheader) { fileheader->bfType = al_fread16le(f); fileheader->bfSize = al_fread32le(f); fileheader->bfReserved1 = al_fread16le(f); fileheader->bfReserved2 = al_fread16le(f); fileheader->bfOffBits = al_fread32le(f); if (fileheader->bfType != 19778) { ALLEGRO_ERROR("Not BMP format\n"); return -1; } if (al_feof(f) || al_ferror(f)) { ALLEGRO_ERROR("Failed to read file header\n"); return -1; } return 0; }
/* read_os2_bminfoheader: * Reads information from an OS/2 format BMP file header. */ static int read_os2_bminfoheader(ALLEGRO_FILE *f, BMPINFOHEADER *infoheader) { OS2BMPINFOHEADER os2_infoheader; os2_infoheader.biWidth = al_fread16le(f); os2_infoheader.biHeight = al_fread16le(f); os2_infoheader.biPlanes = al_fread16le(f); os2_infoheader.biBitCount = al_fread16le(f); infoheader->biWidth = os2_infoheader.biWidth; infoheader->biHeight = os2_infoheader.biHeight; infoheader->biBitCount = os2_infoheader.biBitCount; infoheader->biCompression = BIT_RGB; infoheader->biClrUsed = 0; /* default */ if (al_feof(f) || al_ferror(f)) { ALLEGRO_ERROR("Failed to read file header\n"); return -1; } return 0; }
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; }
T3F_TILESET * t3f_load_tileset_f(ALLEGRO_FILE * fp, const char * fn) { int i, j; T3F_TILESET * tsp; char header[16]; tsp = t3f_create_tileset(0, 0); if(!tsp) { return NULL; } al_fread(fp, header, 16); if(strcmp(header, "T3F_TILESET")) { t3f_destroy_tileset(tsp); return NULL; } switch(header[15]) { case 0: { /* read tile data */ tsp->tiles = al_fread16le(fp); for(i = 0; i < tsp->tiles; i++) { tsp->tile[i] = t3f_create_tile(); tsp->tile[i]->ap = t3f_load_animation_f(fp, fn); if(!tsp->tile[i]->ap) { printf("load animation failed\n"); return NULL; } tsp->tile[i]->flags = al_fread32le(fp); /* read user data */ if(tsp->tile[i]->flags & T3F_TILE_FLAG_USER_DATA) { for(j = 0; j < T3F_TILE_MAX_DATA; j++) { tsp->tile[i]->user_data[j] = al_fread32le(fp); } } /* read animation frames */ tsp->tile[i]->frame_list_total = al_fread32le(fp); for(j = 0; j < tsp->tile[i]->frame_list_total; j++) { tsp->tile[i]->frame_list[j] = al_fread16le(fp); } } /* read tileset data */ tsp->width = al_fread32le(fp); tsp->height = al_fread32le(fp); tsp->flags = al_fread32le(fp); break; } } return tsp; }