/* ------------------------------------------------------------ PUBLIC INTERFACE */ int Dx_File_EXTSetDXArchiveAlias(const char *srcName, const char *destName) { ArchiveAliasEntry **pEntry = &s_archiveAliases; while (*pEntry != NULL) { if (PL_Text_Strcmp((*pEntry)->srcArchiveName, srcName) == 0) { DXFREE((*pEntry)->destArchiveName); if (destName == NULL) { ArchiveAliasEntry *next = (*pEntry)->next; DXFREE((*pEntry)->srcArchiveName); DXFREE(*pEntry); *pEntry = next; } else { (*pEntry)->destArchiveName = PL_Text_Strdup(destName); } return 0; } pEntry = &(*pEntry)->next; } if (srcName == NULL || destName == NULL) { return 0; } *pEntry = DXALLOC(sizeof(ArchiveAliasEntry)); (*pEntry)->srcArchiveName = PL_Text_Strdup(srcName); (*pEntry)->destArchiveName = PL_Text_Strdup(destName); (*pEntry)->next = NULL; return 0; }
static void s_CloseArchives() { /* - Close all open archives. */ ArchiveListEntry *entry, *nEntry; nEntry = s_archiveList; while ((entry = nEntry) != NULL) { nEntry = entry->next; DXA_CloseArchive(entry->archive); DXFREE(entry->filename); DXFREE(entry); } s_archiveList = NULL; }
int Dx_File_ReadFile(const char *filename, unsigned char **dData, unsigned int *dSize) { unsigned char *data; unsigned int size; int retval; SDL_RWops *rwops = Dx_File_OpenStream(filename); if (rwops == NULL) { return -1; } size = (unsigned int)SDL_RWsize(rwops); retval = 0; data = DXALLOC(size); if (SDL_RWread(rwops, data, size, 1) < 1) { retval = -1; DXFREE(data); } else { *dData = data; *dSize = size; } SDL_RWclose(rwops); return retval; }
void LunaFontSprite::Release(LFONTSPRITE lFontSpr) { LunaFontSprData *fontspr = (LunaFontSprData *)PL_Handle_GetData((int)lFontSpr, DXHANDLE_LUNAFONTSPRITE); if (fontspr != NULL) { int i; if (fontspr->sheetGraphs != NULL) { for (i = 0; i < fontspr->sheetCount; ++i) { PLG.Texture_Release(fontspr->sheetGraphs[i]); } DXFREE(fontspr->sheetGraphs); } if (fontspr->sheetSprites != NULL) { for (i = 0; i < fontspr->sheetCount; ++i) { LunaSprite::Release(fontspr->sheetSprites[i]); } DXFREE(fontspr->sheetSprites); } DXFREE(fontspr->lfdData); PL_Handle_ReleaseID(lFontSpr, DXTRUE); } }
static int s_CloseArchive(DXArchive *archive) { ArchiveListEntry **pEntry = &s_archiveList; ArchiveListEntry *entry; while ((entry = *pEntry) != NULL) { if (entry->archive == archive) { ArchiveListEntry *nextEntry = entry->next; DXA_CloseArchive(entry->archive); DXFREE(entry->filename); DXFREE(entry); *pEntry = nextEntry; return 0; } pEntry = &entry->next; } return -1; }
DWORD_PTR Dx_FileRead_findFirst(const char *filePath, FILEINFOA *fileInfo) { LocalFindData *data = DXCALLOC(sizeof(LocalFindData)); #ifndef DX_NON_DXA if (s_useArchiveFlag == DXTRUE) { char buf[2048]; const char *end; DXArchive *archive = s_TryGetArchive(filePath, buf, 2048, &end); if (archive != NULL) { data->dxaData = DXA_findFirst(archive, end + 1, fileInfo); if (data->dxaData != 0) { data->dxaFlag = DXTRUE; return (DWORD_PTR)data; } } } #endif #ifdef DXPORTLIB_USE_GLOB if (s_allowDirectFlag == DXTRUE) { char pathBuf[DX_STRMAXLEN]; int retval; /* glob is technically inaccurate here, since this is a clone of Windows' * FindFirstFile. FindFirstFile does not allow wildcards in pathnames, it * only seeks over a single directory's worth of contents. * * So we just assume the source code respects that. Because it should. */ retval = glob( PL_Text_ConvertStrncpyIfNecessary(pathBuf, -1, filePath, g_DxUseCharSet, DX_STRMAXLEN), 0, NULL, &data->globData); if (retval == 0) { data->globIndex = 0; data->globFlag = DXTRUE; if (Dx_FileRead_findNext((DWORD_PTR)data, fileInfo) == 0) { return (DWORD_PTR)data; } data->globFlag = DXFALSE; globfree(&data->globData); } } #endif DXFREE(data); return (DWORD_PTR)-1; }
void PL_Handle_End() { int i; if (s_initialized == DXFALSE) { return; } if (s_handleTable != NULL) { DXFREE(s_handleTable); } s_handleTable = NULL; s_handleCount = 0; for (i = 0; i < DXHANDLE_END; ++i) { s_handleLists[i] = -1; } s_initialized = DXFALSE; }
int PL_Window_SetTitle(const DXCHAR *titleString) { if (s_windowTitle != NULL) { DXFREE(s_windowTitle); s_windowTitle = NULL; } if (titleString != NULL) { char utf8Buf[2048]; if (PL_Text_DxStringToString(titleString, utf8Buf, 2048, DX_CHARSET_EXT_UTF8) > 0) { s_windowTitle = SDL_strdup(utf8Buf); if (s_initialized == DXTRUE) { SDL_SetWindowTitle(s_window, s_windowTitle); } } } return 0; }
int PL_Window_ResetSettings() { if (s_initialized == DXTRUE) { return -1; } PL_windowWidth = 640; PL_windowHeight = 480; s_windowRefreshRate = 60; s_windowDepth = 32; s_windowVSync = DXTRUE; s_alwaysRunFlag = DXFALSE; s_windowFlags = SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_RESIZABLE; s_mouseVisible = DXTRUE; if (s_windowTitle != NULL) { DXFREE(s_windowTitle); } s_windowTitle = NULL; return 0; }
int Dx_FileRead_findClose(DWORD_PTR fileHandle) { LocalFindData *data = (LocalFindData *)fileHandle; if (data == 0 || fileHandle == (DWORD_PTR)-1) { return -1; } return 0; #ifndef DX_NON_DXA if (data->dxaFlag == DXTRUE) { DXA_findClose(data->dxaData); } #endif #ifdef DXPORTLIB_USE_GLOB if (data->globFlag == DXTRUE) { globfree(&data->globData); } #endif DXFREE(data); return 0; }
void PL_Handle_ReleaseID(int handleID, int freeData) { HandleData *handle; if (handleID < 0 || handleID >= s_handleCount) { return; } handle = &s_handleTable[handleID]; if (freeData != DXFALSE && handle->data != NULL) { DXFREE(handle->data); handle->data = NULL; } if (handle->deleteFlag != 0) { *(handle->deleteFlag) = -1; handle->deleteFlag = 0; } s_Unlink(handleID); handle->handleType = DXHANDLE_NONE; s_Link(handleID); }
LFONTSPRITE LunaFontSprite::CreateFromFile(const char *pFileName, const char *pExt, Bool IsAlpha, Uint32 Num, Bool IsSortZ, eSurfaceFormat Format) { char filebuf[4096]; int file = PL_File_OpenRead( PL_Text_ConvertStrncpyIfNecessary( filebuf, -1, pFileName, g_lunaUseCharSet, 4096) ); unsigned char *lfdData = NULL; do { int64_t fileSize = PL_File_GetSize(file); const LFDHeader *lfdHeader; LunaFontSprData *fontspr; int fontSprHandle; int fontBaseSize; int i; /* don't allow files beyond a certain size */ if (file < 0 || fileSize <= 0 || fileSize > 65536) { break; } lfdData = (unsigned char *)DXALLOC((int)fileSize); if (PL_File_Read(file, lfdData, (int)fileSize) != (int)fileSize) { break; } PL_File_Close(file); file = -1; /* sanity checks to verify LFD data is valid */ lfdHeader = (const LFDHeader *)lfdData; if (memcmp(lfdHeader, lfd_id, 4) != 0 || lfdHeader->sheetCount == 0 || lfdHeader->sheetCount > 32) { break; } fontBaseSize = sizeof(LFDHeader) + (sizeof(Uint16) * CODE_TABLE_SIZE) + (32 * lfdHeader->sheetCount); if (fileSize < (int64_t)(fontBaseSize + (sizeof(LFDCharEntry) * lfdHeader->fontMax))) { break; } /* create sprite handle and data */ fontSprHandle = PL_Handle_AcquireID(DXHANDLE_LUNAFONTSPRITE); if (fontSprHandle < 0) { break; } fontspr = (LunaFontSprData *)PL_Handle_AllocateData(fontSprHandle, sizeof(LunaFontSprData)); fontspr->lfdData = lfdData; fontspr->lfdHeader = lfdHeader; fontspr->lfdIndex = (const Uint16 *)(lfdData + sizeof(LFDHeader)); fontspr->lfdCharEntries = (const LFDCharEntry *)(lfdData + fontBaseSize); fontspr->charMax = lfdHeader->fontMax; fontspr->sheetCount = lfdHeader->sheetCount; fontspr->sheetGraphs = (int *)DXALLOC(sizeof(int) * fontspr->sheetCount); fontspr->sheetSprites = (int *)DXALLOC(sizeof(int) * fontspr->sheetCount); fontspr->space = 0; for (i = 0; i < fontspr->sheetCount; ++i) { char buf[64]; memcpy(buf, lfdData + sizeof(LFDHeader) + (sizeof(Uint16) * CODE_TABLE_SIZE) + (32 * i), 32); buf[32] = '\0'; if (pExt != NULL) { char newBuf[2048]; PL_Text_ConvertStrncpy( newBuf, -1, buf, g_lunaUseCharSet, 2048); PL_Text_ConvertStrncat( newBuf, -1, pExt, g_lunaUseCharSet, 2048); int surface = PL_Surface_Load(newBuf); fontspr->sheetGraphs[i] = PL_Surface_ToTexture(surface); PL_Surface_Delete(surface); } else { /* FIXME: LAG support */ fontspr->sheetGraphs[i] = -1; } fontspr->sheetSprites[i] = LunaSprite::Create(Num, PRIM_VERTEX_UV1, IsSortZ); LunaSprite::AttatchTexture(fontspr->sheetSprites[i], 0, fontspr->sheetGraphs[i]); } return fontSprHandle; } while(0); PL_File_Close(file); if (lfdData != NULL) { DXFREE(lfdData); } return INVALID_FONTSPRITE; }