void SpriteCache::init() { if (ff != NULL) fclose(ff); ff = NULL; changeMaxSize(elements); cachesize = 0; lockedSize = 0; liststart = -1; listend = -1; lastLoad = -2; maxCacheSize = DEFAULTCACHESIZE; }
void SpriteCache::initFile_adjustBuffers(short numspri) { // adjust the buffers to the sprite file size changeMaxSize(numspri + 1); }
int SpriteCache::initFile(const char *filnam) { short vers; char buff[20]; short numspri = 0; int vv, wdd, htt; long spr_initial_offs = 0; int spriteFileID = 0; for (vv = 0; vv < elements; vv++) { images[vv] = NULL; offsets[vv] = 0; } ff = clibfopen((char *)filnam, "rb"); if (ff == NULL) return -1; spr_initial_offs = ftell(ff); fread(&vers, 2, 1, ff); // read the "Sprite File" signature fread(&buff[0], 13, 1, ff); if ((vers < 4) || (vers > 6)) { fclose(ff); ff = NULL; return -1; } // unknown version buff[13] = 0; if (strcmp(buff, spriteFileSig)) { fclose(ff); ff = NULL; return -1; } if (vers == 4) this->spritesAreCompressed = false; else if (vers == 5) this->spritesAreCompressed = true; else if (vers >= 6) { this->spritesAreCompressed = (fgetc(ff) == 1); spriteFileID = getw(ff); } if (vers < 5) { // skip the palette fseek(ff, 256 * 3, SEEK_CUR); } fread(&numspri, 2, 1, ff); if (vers < 4) numspri = 200; #ifdef THIS_IS_THE_ENGINE // adjust the buffers to the sprite file size changeMaxSize(numspri + 1); #endif // if there is a sprite index file, use it if (loadSpriteIndexFile(spriteFileID, spr_initial_offs, numspri)) { // Succeeded return 0; } // failed, delete the index file because it's invalid unlink(spindexfilename); // no sprite index file, manually index it for (vv = 0; vv <= numspri; vv++) { offsets[vv] = ftell(ff); flags[vv] = 0; int coldep = getshort(ff); if (coldep == 0) { offsets[vv] = 0; images[vv] = NULL; #ifdef THIS_IS_THE_ENGINE // make it a blue cup, to avoid crashes spritewidth[vv] = spritewidth[0]; spriteheight[vv] = spriteheight[0]; offsets[vv] = offsets[0]; flags[vv] = SPRCACHEFLAG_DOESNOTEXIST; #else // no sprite ... blank it out spritewidth[vv] = 0; spriteheight[vv] = 0; offsets[vv] = 0; #endif if (feof(ff)) break; continue; } if (feof(ff)) break; if (vv >= elements) break; images[vv] = NULL; wdd = getshort(ff); htt = getshort(ff); spritewidth[vv] = wdd; spriteheight[vv] = htt; get_new_size_for_sprite(vv, wdd, htt, spritewidth[vv], spriteheight[vv]); long spriteDataSize; if (vers == 5) { spriteDataSize = getw(ff); } else { spriteDataSize = wdd * coldep * htt; } fseek(ff, spriteDataSize, SEEK_CUR); } sprite0InitialOffset = offsets[0]; return 0; }