void LoadTeamList (MELEE_STATE *pMS) { COUNT i; DestroyDirEntryTable (ReleaseDirEntryTable (pMS->load.dirEntries)); pMS->load.dirEntries = CaptureDirEntryTable ( LoadDirEntryTable (meleeDir, "", ".mle", match_MATCH_SUFFIX)); if (pMS->load.entryIndices != NULL) HFree (pMS->load.entryIndices); pMS->load.numIndices = GetDirEntryTableCount (pMS->load.dirEntries); pMS->load.entryIndices = HMalloc (pMS->load.numIndices * sizeof pMS->load.entryIndices[0]); for (i = 0; i < pMS->load.numIndices; i++) pMS->load.entryIndices[i] = i; }
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; }