Ejemplo n.º 1
0
/* ------------------------------------------------------------ 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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
    }
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
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;
}
Ejemplo n.º 10
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;
}
Ejemplo n.º 11
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);
}
Ejemplo n.º 12
0
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;
}