static bool GetFleetByIndex (MELEE_STATE *pMS, COUNT index, MeleeTeam *result) { COUNT firstIndex; if (index < pMS->load.preBuiltCount) { MeleeTeam_copy (result, pMS->load.preBuiltList[index]); return true; } index -= pMS->load.preBuiltCount; firstIndex = index; for ( ; index < pMS->load.numIndices; index++) { DIRENTRY entry = SetAbsDirEntryTableIndex (pMS->load.dirEntries, pMS->load.entryIndices[index]); if (LoadTeamImage (entry, result)) break; // Success { const char *fileName; fileName = GetDirEntryAddress (entry); log_add (log_Warning, "Warning: File '%s' is not a valid " "SuperMelee team.", fileName); } } if (index != firstIndex) UnindexFleets (pMS, firstIndex, index - firstIndex); return index < pMS->load.numIndices; }
// returns (COUNT) -1 if not found static COUNT GetFleetIndexByFileName (MELEE_STATE *pMS, const char *fileName) { COUNT index; for (index = 0; index < pMS->load.numIndices; index++) { DIRENTRY entry = SetAbsDirEntryTableIndex (pMS->load.dirEntries, pMS->load.entryIndices[index]); const char *entryName = GetDirEntryAddress (entry); if (strcasecmp ((const char *) entryName, fileName) == 0) return pMS->load.preBuiltCount + index; } return (COUNT) -1; }
static bool LoadTeamImage (DIRENTRY DirEntry, MeleeTeam *team) { const char *fileName; uio_Stream *stream; fileName = GetDirEntryAddress (DirEntry); stream = uio_fopen (meleeDir, fileName, "rb"); if (stream == NULL) return false; if (MeleeTeam_deserialize (team, stream) == -1) return false; uio_fclose (stream); return true; }
void * _GetFontData (uio_Stream *fp, DWORD length) { COUNT numDirEntries; DIRENTRY fontDir = NULL; BuildCharDesc *bcds = NULL; size_t numBCDs = 0; int dirEntryI; uio_DirHandle *fontDirHandle = NULL; uio_MountHandle *fontMount = NULL; FONT fontPtr = NULL; if (_cur_resfile_name == 0) goto err; if (fp != (uio_Stream*)~0) { // font is zipped instead of being in a directory char *s1, *s2; int n; const char *fontZipName; char fontDirName[PATH_MAX]; if ((((s2 = 0), (s1 = strrchr (_cur_resfile_name, '/')) == 0) && (s2 = strrchr (_cur_resfile_name, '\\')) == 0)) { strcpy(fontDirName, "."); fontZipName = _cur_resfile_name; } else { if (s2 > s1) s1 = s2; n = s1 - _cur_resfile_name + 1; strncpy (fontDirName, _cur_resfile_name, n - 1); fontDirName[n - 1] = 0; fontZipName = _cur_resfile_name + n; } fontDirHandle = uio_openDir (repository, fontDirName, 0); fontMount = uio_mountDir (repository, _cur_resfile_name, uio_FSTYPE_ZIP, fontDirHandle, fontZipName, "/", autoMount, uio_MOUNT_RDONLY | uio_MOUNT_TOP, NULL); uio_closeDir (fontDirHandle); } fontDir = CaptureDirEntryTable (LoadDirEntryTable (contentDir, _cur_resfile_name, ".", match_MATCH_SUBSTRING)); if (fontDir == 0) goto err; numDirEntries = GetDirEntryTableCount (fontDir); fontDirHandle = uio_openDirRelative (contentDir, _cur_resfile_name, 0); if (fontDirHandle == NULL) goto err; bcds = HMalloc (numDirEntries * sizeof (BuildCharDesc)); if (bcds == NULL) goto err; // Load the surfaces for all dir Entries for (dirEntryI = 0; dirEntryI < numDirEntries; dirEntryI++) { char *char_name; unsigned int charIndex; TFB_Canvas canvas; EXTENT size; char_name = GetDirEntryAddress (SetAbsDirEntryTableIndex ( fontDir, dirEntryI)); if (sscanf (char_name, "%x.", &charIndex) != 1) continue; if (charIndex > 0xffff) continue; canvas = TFB_DrawCanvas_LoadFromFile (fontDirHandle, char_name); if (canvas == NULL) continue; TFB_DrawCanvas_GetExtent (canvas, &size); if (size.width == 0 || size.height == 0) { TFB_DrawCanvas_Delete (canvas); continue; } bcds[numBCDs].canvas = canvas; bcds[numBCDs].index = charIndex; numBCDs++; } uio_closeDir (fontDirHandle); DestroyDirEntryTable (ReleaseDirEntryTable (fontDir)); if (fontMount != 0) uio_unmountDir(fontMount); #if 0 if (numBCDs == 0) goto err; #endif // sort on the character index qsort (bcds, numBCDs, sizeof (BuildCharDesc), compareBCDIndex); fontPtr = AllocFont (0); if (fontPtr == NULL) goto err; fontPtr->Leading = 0; fontPtr->LeadingWidth = 0; { size_t startBCD = 0; UniChar pageStart; FONT_PAGE **pageEndPtr = &fontPtr->fontPages; while (startBCD < numBCDs) { // Process one character page. size_t endBCD; pageStart = bcds[startBCD].index & CHARACTER_PAGE_MASK; endBCD = startBCD; while (endBCD < numBCDs && (bcds[endBCD].index & CHARACTER_PAGE_MASK) == pageStart) endBCD++; { size_t bcdI; int numChars = bcds[endBCD - 1].index + 1 - bcds[startBCD].index; FONT_PAGE *page = AllocFontPage (numChars); page->pageStart = pageStart; page->firstChar = bcds[startBCD].index; page->numChars = numChars; *pageEndPtr = page; pageEndPtr = &page->next; for (bcdI = startBCD; bcdI < endBCD; bcdI++) { // Process one character. BuildCharDesc *bcd = &bcds[bcdI]; TFB_Char *destChar = &page->charDesc[bcd->index - page->firstChar]; if (destChar->data != NULL) { // There's already an image for this character. log_add (log_Debug, "Duplicate image for character %d " "for font %s.", (int) bcd->index, _cur_resfile_name); TFB_DrawCanvas_Delete (bcd->canvas); continue; } processFontChar (destChar, bcd->canvas); TFB_DrawCanvas_Delete (bcd->canvas); if (destChar->disp.height > fontPtr->Leading) fontPtr->Leading = destChar->disp.height; if (destChar->disp.width > fontPtr->LeadingWidth) fontPtr->LeadingWidth = destChar->disp.width; } } startBCD = endBCD; } *pageEndPtr = NULL; } fontPtr->Leading++; HFree (bcds); (void) fp; /* Satisfying compiler (unused parameter) */ (void) length; /* Satisfying compiler (unused parameter) */ return fontPtr; err: if (fontPtr != 0) HFree (fontPtr); if (bcds != NULL) { size_t bcdI; for (bcdI = 0; bcdI < numBCDs; bcdI++) TFB_DrawCanvas_Delete (bcds[bcdI].canvas); HFree (bcds); } if (fontDirHandle != NULL) uio_closeDir (fontDirHandle); if (fontDir != 0) DestroyDirEntryTable (ReleaseDirEntryTable (fontDir)); if (fontMount != 0) uio_unmountDir(fontMount); return 0; }