SDL_Surface *WadImageCache::image_from_desc(WadImageDescriptor& desc) { SDL_Surface *surface = NULL; OpenedFile wad_file; if (open_wad_file_for_reading(desc.file, wad_file)) { struct wad_header header; if (read_wad_header(wad_file, &header)) { struct wad_data *wad; wad = read_indexed_wad_from_file(wad_file, &header, desc.index, true); if (wad) { void *data; size_t length; data = extract_type_from_wad(wad, desc.tag, &length); if (data && length) { SDL_RWops *rwops = SDL_RWFromConstMem(data, length); #ifdef HAVE_SDL_IMAGE surface = IMG_Load_RW(rwops, 1); #else surface = SDL_LoadBMP_RW(rwops, 1); #endif } free_wad(wad); } } close_wad_file(wad_file); } clear_game_error(); return surface; }
/* --------- local code */ static struct wad_data *get_physics_wad_data( bool *bungie_physics) { struct wad_data *wad= NULL; // dprintf("Open is: %d %d %.*s", physics_file.vRefNum, physics_file.parID, physics_file.name[0], physics_file.name+1); OpenedFile PhysicsFile; if(open_wad_file_for_reading(PhysicsFileSpec,PhysicsFile)) { struct wad_header header; if(read_wad_header(PhysicsFile, &header)) { if(header.data_version==BUNGIE_PHYSICS_DATA_VERSION || header.data_version==PHYSICS_DATA_VERSION) { wad= read_indexed_wad_from_file(PhysicsFile, &header, 0, true); if(header.data_version==BUNGIE_PHYSICS_DATA_VERSION) { *bungie_physics= true; } else { *bungie_physics= false; } } } close_wad_file(PhysicsFile); } /* Reset any errors that might have occurred.. */ set_game_error(systemError, errNone); return wad; }
static void load_preferences( void) { /* If it was already allocated, we are reloading, so free the old one.. */ if(prefInfo->wad) { free_wad(prefInfo->wad); prefInfo->wad= NULL; } OpenedFile PrefsFile; if (open_wad_file_for_reading(prefInfo->PrefsFile,PrefsFile)) { struct wad_header header; /* Read the header from the wad file */ if(read_wad_header(PrefsFile, &header)) { /* Read the indexed wad from the file */ prefInfo->wad= read_indexed_wad_from_file(PrefsFile, &header, 0, false); // LP change: more graceful degradation if (!prefInfo->wad) { set_game_error(gameError, errUnknownWadVersion); } } /* Close the file.. */ close_wad_file(PrefsFile); } }