예제 #1
0
void streamReader_close(streamReader *pThis) {
	if (pThis->fileHandle) {
#ifndef DREAMCAST
		fclose(pThis->fileHandle);
#else
		gdFsClose(pThis->fileHandle);
#endif
	}
}
예제 #2
0
파일: Text.c 프로젝트: RedRingRico/TERMINAL
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;
}
예제 #3
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;
}