Files
itgmania212121/stepmania/src/RageBitmapTexture.cpp
T

184 lines
5.0 KiB
C++
Raw Normal View History

2001-11-03 10:52:42 +00:00
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
File: RageBitmapTexture.h
Desc: Holder for a static texture with metadata. Can load just about any image format.
Copyright (c) 2001 Chris Danford. All rights reserved.
-----------------------------------------------------------------------------
*/
2001-11-03 10:52:42 +00:00
//-----------------------------------------------------------------------------
// In-line Links
//-----------------------------------------------------------------------------
//#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "dxerr8.lib")
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include "RageBitmapTexture.h"
#include "dxerr8.h"
#include "DXUtil.h"
#include "RageUtil.h"
2002-02-28 19:40:40 +00:00
#include "PrefsManager.h"
2001-11-03 10:52:42 +00:00
//#include <stdio.h>
#include <assert.h>
//-----------------------------------------------------------------------------
// RageBitmapTexture constructor
//-----------------------------------------------------------------------------
RageBitmapTexture::RageBitmapTexture( LPRageScreen pScreen, CString sFilePath, DWORD dwHints ) :
2001-11-03 10:52:42 +00:00
RageTexture( pScreen, sFilePath )
{
// RageLog( "RageBitmapTexture::RageBitmapTexture()" );
2001-12-19 01:50:57 +00:00
m_pd3dTexture = NULL;
Create( dwHints );
2001-11-03 10:52:42 +00:00
CreateFrameRects();
}
RageBitmapTexture::~RageBitmapTexture()
{
SAFE_RELEASE(m_pd3dTexture);
}
//-----------------------------------------------------------------------------
// GetTexture
//-----------------------------------------------------------------------------
LPDIRECT3DTEXTURE8 RageBitmapTexture::GetD3DTexture()
{
return m_pd3dTexture;
}
void RageBitmapTexture::Create( DWORD dwHints )
2001-11-03 10:52:42 +00:00
{
HRESULT hr;
2002-01-28 21:24:17 +00:00
///////////////////////
// Figure out which texture format to use
///////////////////////
2002-01-20 23:29:03 +00:00
D3DFORMAT fmtTexture;
2002-01-28 21:24:17 +00:00
2002-01-29 21:56:14 +00:00
// look in the file name for a format hint
2002-01-28 21:24:17 +00:00
m_sFilePath.MakeLower();
2002-01-29 21:56:14 +00:00
if( -1 != m_sFilePath.Find("no alpha") )
2002-01-20 23:29:03 +00:00
{
2002-01-28 21:24:17 +00:00
fmtTexture = D3DFMT_R5G6B5;
}
2002-01-29 21:56:14 +00:00
else if( -1 != m_sFilePath.Find("1 alpha") )
2002-01-28 21:24:17 +00:00
{
fmtTexture = D3DFMT_A1R5G5B5;
2002-01-20 23:29:03 +00:00
}
2002-01-28 21:24:17 +00:00
else // no hint, assume full alpha
{
2002-01-28 21:24:17 +00:00
fmtTexture = D3DFMT_A4R4G4B4;
}
2002-01-28 21:24:17 +00:00
2002-01-29 21:56:14 +00:00
// look in the file name for a dither hint
bool bDither = (dwHints & HINT_DITHER)
|| -1 != m_sFilePath.Find("dither");
bool bCreateMipMaps = !(dwHints & HINT_NOMIPMAPS);
2002-01-29 21:56:14 +00:00
2002-01-28 21:24:17 +00:00
// if the user has requested high color textures, use the higher color
2002-02-28 19:40:40 +00:00
if( PREFS != NULL
&& PREFS->m_GameOptions.m_iDisplayColor == 32
&& PREFS->m_GameOptions.m_iTextureColor == 32 )
2002-01-20 23:29:03 +00:00
{
2002-01-28 21:24:17 +00:00
fmtTexture = D3DFMT_A8R8G8B8;
2002-01-20 23:29:03 +00:00
}
2002-01-28 21:24:17 +00:00
/////////////////////
// Figure out whether the texture can fit into texture memory unscaled
/////////////////////
bool bScaleImageToTextureSize;
2001-11-03 10:52:42 +00:00
D3DXIMAGE_INFO ddii;
if( FAILED( hr = D3DXGetImageInfoFromFile(
m_sFilePath,
&ddii ) ) )
{
RageErrorHr( ssprintf("D3DXGetImageInfoFromFile() failed for file '%s'.", m_sFilePath), hr );
}
D3DCAPS8 caps;
m_pd3dDevice->GetDeviceCaps( &caps );
bScaleImageToTextureSize = ddii.Width > caps.MaxTextureWidth
|| ddii.Height > caps.MaxTextureHeight;
2002-03-06 09:14:52 +00:00
// HACK: The stupid Savage card will report that it can hold the entire texture,
// then allocate something smaller than the dimensions we need!
// after allocating the texture, make sure it's the size we expect. If not,
// load it again with scaling turned on.
DWORD dwExpectedWidth = ddii.Width;
DWORD dwExpectedHeight = ddii.Height;
while( 1 )
2002-01-20 09:40:21 +00:00
{
2002-03-06 09:14:52 +00:00
if( FAILED( hr = D3DXCreateTextureFromFileEx(
m_pd3dDevice, // device
m_sFilePath, // soure file
D3DX_DEFAULT, D3DX_DEFAULT, // width, height
bCreateMipMaps ? 4 : 0, // mip map levels
0, // usage (is a render target?)
fmtTexture, // our preferred texture format
D3DPOOL_MANAGED, // which memory pool
(bScaleImageToTextureSize ? D3DX_FILTER_BOX : D3DX_FILTER_NONE) | (bDither ? D3DX_FILTER_DITHER : 0), // filter
D3DX_DEFAULT | (bDither ? D3DX_FILTER_DITHER : 0), // mip filter
0, // no color key
&ddii, // struct to fill with source image info
NULL, // no palette
&m_pd3dTexture ) ) )
{
RageErrorHr( ssprintf("D3DXCreateTextureFromFileEx() failed for file '%s'.", m_sFilePath), hr );
}
/////////////////////
// Save information about the texture
/////////////////////
m_uSourceWidth = ddii.Width;
m_uSourceHeight= ddii.Height;
D3DSURFACE_DESC ddsd;
if ( FAILED( hr = m_pd3dTexture->GetLevelDesc( 0, &ddsd ) ) )
RageErrorHr( "Could not get level Description of D3DX texture!", hr );
// save information about the texture
m_uTextureWidth = ddsd.Width;
m_uTextureHeight = ddsd.Height;
m_TextureFormat = ddsd.Format;
if( dwExpectedWidth == ddsd.Width &&
dwExpectedHeight == ddsd.Height )
break; // done trying to load
2002-01-20 09:40:21 +00:00
}
2001-11-03 10:52:42 +00:00
2001-11-03 10:52:42 +00:00
if( bScaleImageToTextureSize )
{
m_uImageWidth = m_uTextureWidth;
m_uImageHeight = m_uTextureHeight;
}
else
{
m_uImageWidth = m_uSourceWidth;
m_uImageHeight = m_uSourceHeight;
}
2001-11-03 10:52:42 +00:00
}