void streamReader_close(streamReader *pThis) { if (pThis->fileHandle) { #ifndef DREAMCAST fclose(pThis->fileHandle); #else gdFsClose(pThis->fileHandle); #endif } }
int TXT_CreateGlyphSetFromFile( char *p_pFileName, GLYPHSET *p_pGlyphSet, PMEMORY_BLOCK p_pMemoryBlock ) { GDFS FileHandle; long FileBlocks; char *pFileContents; char *pLine; char Token[ 256 ]; char *pLineChar; size_t FilePosition = 0; BMF_CHUNK Chunk; Sint32 FileSize; if( !( FileHandle = FS_OpenFile( p_pFileName ) ) ) { LOG_Debug( "Failed to open glyph file" ); return 1; } gdFsGetFileSize( FileHandle, &FileSize ); gdFsGetFileSctSize( FileHandle, &FileBlocks ); pFileContents = MEM_AllocateFromBlock( p_pMemoryBlock, FileBlocks * 2048, p_pFileName ); if( gdFsReqRd32( FileHandle, FileBlocks, pFileContents ) < 0 ) { LOG_Debug( "Could not load the glyph file into memory" ); return 1; } while( gdFsGetStat( FileHandle ) != GDD_STAT_COMPLETE ) { } gdFsClose( FileHandle ); if( ( pFileContents[ 0 ] != 'B' ) || ( pFileContents[ 1 ] != 'M' ) || ( pFileContents[ 2 ] != 'F' ) || ( pFileContents[ 3 ] != 0x03 ) ) { MEM_FreeFromBlock( p_pMemoryBlock, pFileContents ); LOG_Debug( "Font file is not a binary file" ); return 1; } FilePosition = 4; while( FilePosition != FileSize ) { size_t TestSize = sizeof( BMF_CHAR ); Sint32 Size = 0; memcpy( &Chunk, &pFileContents[ FilePosition ], sizeof( BMF_CHUNK ) ); /* Very ugly code */ Size = ( Chunk.Size[ 0 ] ); Size |= ( Chunk.Size[ 1 ] << 8 ); Size |= ( ( Chunk.Size[ 2 ] ) << 16 ); Size |= ( ( Chunk.Size[ 3 ] ) << 24 ); FilePosition += sizeof( BMF_CHUNK ); switch( Chunk.ID ) { case BMF_ID_COMMON: { BMF_COMMON Common; memcpy( &Common, &pFileContents[ FilePosition ], BMF_COMMON_PACKED_SIZE ); FilePosition += BMF_COMMON_PACKED_SIZE; p_pGlyphSet->LineHeight = Common.LineHeight; p_pGlyphSet->BaseLine = Common.BaseLine; p_pGlyphSet->Width = Common.Width; p_pGlyphSet->Height = Common.Height; break; } case BMF_ID_CHARS: { size_t CharCount = Size / sizeof( BMF_CHAR ); size_t CharIndex; for( CharIndex = 0; CharIndex < CharCount; ++CharIndex ) { BMF_CHAR Char; memcpy( &Char, &pFileContents[ FilePosition ], sizeof( BMF_CHAR ) ); p_pGlyphSet->Glyphs[ Char.ID ].X = Char.X; p_pGlyphSet->Glyphs[ Char.ID ].Y = Char.Y; p_pGlyphSet->Glyphs[ Char.ID ].Width = Char.Width; p_pGlyphSet->Glyphs[ Char.ID ].Height = Char.Height; p_pGlyphSet->Glyphs[ Char.ID ].XOffset = Char.XOffset; p_pGlyphSet->Glyphs[ Char.ID ].YOffset = Char.YOffset; p_pGlyphSet->Glyphs[ Char.ID ].XAdvance = Char.XAdvance; FilePosition += sizeof( BMF_CHAR ); } break; } default: { FilePosition += Size; break; } } } MEM_FreeFromBlock( p_pMemoryBlock, pFileContents ); MEM_GarbageCollectMemoryBlock( p_pMemoryBlock ); return 0; }
int TEX_LoadTexture( PTEXTURE p_pTexture, const char *p_pFileName, PMEMORY_BLOCK p_pMemoryBlock ) { GDFS FileHandle; long FileBlocks; PKMDWORD pTexture; GLOBAL_INDEX GlobalIndex; PVRT_HEADER PVRTHeader; Sint32 TextureOffset = 0; Sint32 FileSize = 0; Sint32 DataOffset = 0; if( !( FileHandle = FS_OpenFile( p_pFileName ) ) ) { LOG_Debug( "Failed to open texture: %s", p_pFileName ); return 1; } gdFsGetFileSize( FileHandle, &FileSize ); gdFsGetFileSctSize( FileHandle, &FileBlocks ); pTexture = MEM_AllocateFromBlock( p_pMemoryBlock, FileBlocks * 2048, p_pFileName ); gdFsReqRd32( FileHandle, FileBlocks, pTexture ); while( gdFsGetStat( FileHandle ) != GDD_STAT_COMPLETE ) { } gdFsClose( FileHandle ); FileSize /= 4; while( TextureOffset < FileSize ) { /* GBIX */ if( pTexture[ TextureOffset ] == 0x58494247 ) { memcpy( &GlobalIndex, &pTexture[ TextureOffset ], sizeof( GlobalIndex ) ); DataOffset += ( sizeof( GLOBAL_INDEX ) + GlobalIndex.Size ) / 4; TextureOffset += ( sizeof( GLOBAL_INDEX ) + GlobalIndex.Size ) / 4; } /* PVRT */ if( pTexture[ TextureOffset ] == 0x54525650 ) { memcpy( &PVRTHeader, &pTexture[ TextureOffset / 4 ], sizeof( PVRTHeader ) ); DataOffset += sizeof( PVRT_HEADER ) / 4; TextureOffset += ( ( sizeof( Uint32 ) * 2 ) + PVRTHeader.Size ) / 4; p_pTexture->Width = PVRTHeader.Width; p_pTexture->Height = PVRTHeader.Height; p_pTexture->Flags = PVRTHeader.Flags; } } kmCreateTextureSurface( &p_pTexture->SurfaceDescription, p_pTexture->Width, p_pTexture->Height, p_pTexture->Flags ); kmLoadTexture( &p_pTexture->SurfaceDescription, pTexture + DataOffset ); while( kmQueryFinishLastTextureDMA( ) != KMSTATUS_SUCCESS ) { } MEM_FreeFromBlock( p_pMemoryBlock, pTexture ); return 0; }