⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 whwiltexture.cpp

📁 好游戏的客户端原码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************************************************
                                                                                                                   
	葛碘疙:																											
																													
	累己磊:																											
	累己老:																											
																													
	[老磊][荐沥磊] : 荐沥 郴侩																						
                                                                                                                   
*******************************************************************************************************************/
#include "StdAfx.h"


struct WILTextureContainer
{
    WILTextureContainer* m_pNext;

    TCHAR   m_strWilFileName[80];
	INT		m_nIdx;
	WORD*	m_pwData;				// Surface肺 肺爹矫懦锭父 蔼捞 沥狼等促. 弊寇浚 亲惑 NULL捞促.<---???
    DWORD   m_dwFlags;
    DWORD   m_dwWidth;
    DWORD   m_dwHeight;
    LPDIRECTDRAWSURFACE7 m_pddsSurface;

public:
//  HRESULT LoadImageData();
    HRESULT Restore(LPDIRECT3DDEVICE7 pd3dDevice);
    HRESULT CopyDataToSurface();
	HRESULT CopyDataToSurfaceToSurface();

    WILTextureContainer(TCHAR* strWilFileName, INT nIndex, DWORD dwFlags);
    ~WILTextureContainer();
};
static WILTextureContainer* g_ptcWILTextureList = NULL;


class CD3DWILTextureManager
{
public:
    CD3DWILTextureManager () {}
    ~CD3DWILTextureManager() { if ( g_ptcWILTextureList ) delete g_ptcWILTextureList; }
};

CD3DWILTextureManager g_StaticWILTextureEngine;


struct TEXTURESEARCHINFO
{
    DWORD dwDesiredBPP;
    BOOL  bUseAlpha;
    BOOL  bUsePalette;
    BOOL  bFoundGoodFormat;

    DDPIXELFORMAT* pddpf;
};


static HRESULT CALLBACK TextureSearchCallback(DDPIXELFORMAT* pddpf, VOID* param)
{
    if ( NULL==pddpf || NULL==param )
        return DDENUMRET_OK;

    TEXTURESEARCHINFO* ptsi = (TEXTURESEARCHINFO*)param;

    if ( pddpf->dwFlags & (DDPF_LUMINANCE|DDPF_BUMPLUMINANCE|DDPF_BUMPDUDV) )
        return DDENUMRET_OK;

    if ( ptsi->bUsePalette )
    {
        if( !(pddpf->dwFlags & DDPF_PALETTEINDEXED8) )
            return DDENUMRET_OK;
        memcpy(ptsi->pddpf, pddpf, sizeof(DDPIXELFORMAT));
        ptsi->bFoundGoodFormat = TRUE;
        return DDENUMRET_CANCEL;
    }

    if ( pddpf->dwRGBBitCount < 16 )
        return DDENUMRET_OK;

    if ( pddpf->dwFourCC != 0 )
        return DDENUMRET_OK;

    if( pddpf->dwRGBAlphaBitMask == 0x0000f000 )
        return DDENUMRET_OK;

    if ( (ptsi->bUseAlpha==TRUE) && !(pddpf->dwFlags&DDPF_ALPHAPIXELS) )
        return DDENUMRET_OK;
    if ( (ptsi->bUseAlpha==FALSE) && (pddpf->dwFlags&DDPF_ALPHAPIXELS) )
        return DDENUMRET_OK;

    if ( pddpf->dwRGBBitCount == ptsi->dwDesiredBPP )
    {
        memcpy(ptsi->pddpf, pddpf, sizeof(DDPIXELFORMAT));
        ptsi->bFoundGoodFormat = TRUE;
        return DDENUMRET_CANCEL;
    }

    return DDENUMRET_OK;
}


static WILTextureContainer* FindWilTexture(TCHAR* strWilFileName, INT nIdx)
{
    WILTextureContainer* ptcWILTexture = g_ptcWILTextureList;

    while ( ptcWILTexture )
    {
        if ( !lstrcmpi(strWilFileName, ptcWILTexture->m_strWilFileName) &&
			 nIdx == ptcWILTexture->m_nIdx )
		{
            return ptcWILTexture;
		}
        ptcWILTexture = ptcWILTexture->m_pNext;
    }

    return NULL;
}


BOOL D3DWILTextr_IsTextrExisted(TCHAR* strWilFileName, INT nIdx)
{
    if ( NULL != FindWilTexture(strWilFileName, nIdx) )
        return TRUE;
	return FALSE;
}


WILTextureContainer::WILTextureContainer(TCHAR* strWilFileName, INT nIndex, DWORD dwFlags)
{
    lstrcpy(m_strWilFileName, strWilFileName);
	m_nIdx				= nIndex;
    m_dwWidth			= 0;
    m_dwHeight			= 0;
    m_dwFlags			= dwFlags;
    m_pddsSurface		= NULL;
	m_pwData			= NULL;
    m_pNext				= g_ptcWILTextureList;
    g_ptcWILTextureList	= this;
}


WILTextureContainer::~WILTextureContainer()
{
    SAFE_RELEASE( m_pddsSurface );

    if ( g_ptcWILTextureList == this )
        g_ptcWILTextureList = m_pNext;
    else
    {
        for ( WILTextureContainer* ptc = g_ptcWILTextureList; ptc; ptc=ptc->m_pNext )
            if ( ptc->m_pNext == this )
                ptc->m_pNext = m_pNext;
    }
}


HRESULT WILTextureContainer::Restore(LPDIRECT3DDEVICE7 pd3dDevice)
{
    SAFE_RELEASE(m_pddsSurface);

    if( NULL == pd3dDevice )
        return DDERR_INVALIDPARAMS;

    D3DDEVICEDESC7 ddDesc;
    if ( FAILED(pd3dDevice->GetCaps(&ddDesc)) )
        return E_FAIL;

    DDSURFACEDESC2 ddsd;
    D3DUtil_InitSurfaceDesc( ddsd );
    ddsd.dwFlags         = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|
                           /*DDSD_PIXELFORMAT|*/DDSD_TEXTURESTAGE;
    ddsd.ddsCaps.dwCaps  = DDSCAPS_TEXTURE;
    ddsd.dwTextureStage  = 0;
    ddsd.dwWidth         = m_dwWidth;
    ddsd.dwHeight        = m_dwHeight;

    if ( ddDesc.deviceGUID == IID_IDirect3DHALDevice || ddDesc.deviceGUID == IID_IDirect3DTnLHalDevice )
        ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
    else
        ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;

	// Setting Power of 2
    if ( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2 )
    {
        for ( ddsd.dwWidth =1; m_dwWidth>ddsd.dwWidth;   ddsd.dwWidth<<=1 );
        for ( ddsd.dwHeight=1; m_dwHeight>ddsd.dwHeight; ddsd.dwHeight<<=1 );
    }

    DWORD dwMaxWidth  = ddDesc.dwMaxTextureWidth;
    DWORD dwMaxHeight = ddDesc.dwMaxTextureHeight;
    ddsd.dwWidth  = min(ddsd.dwWidth,  (dwMaxWidth  ? dwMaxWidth  : 256));
    ddsd.dwHeight = min(ddsd.dwHeight, (dwMaxHeight ? dwMaxHeight : 256));

	// 流荤阿屈狼 咆胶苗甫 瘤盔窍瘤 臼绰促搁...
    if ( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_SQUAREONLY )
    {
        if ( ddsd.dwWidth > ddsd.dwHeight ) ddsd.dwHeight = ddsd.dwWidth;
        else                                ddsd.dwWidth  = ddsd.dwHeight;
    }


	// 咆胶苗 侨伎器杆技泼...
    TEXTURESEARCHINFO tsi;
    tsi.bFoundGoodFormat = FALSE;
    tsi.pddpf            = &ddsd.ddpfPixelFormat;
    tsi.dwDesiredBPP     = 16;
    tsi.bUsePalette      = ( 16 <= 8 );
    tsi.bUseAlpha        = FALSE;
    tsi.dwDesiredBPP	 = 16;

    pd3dDevice->EnumTextureFormats( TextureSearchCallback, &tsi );

    if( FALSE == tsi.bFoundGoodFormat )
    {
		return E_FAIL;
    }

    LPDIRECTDRAW7        pDD;
    LPDIRECTDRAWSURFACE7 pddsRender;
    pd3dDevice->GetRenderTarget(&pddsRender);
    pddsRender->GetDDInterface((VOID**)&pDD);
    pddsRender->Release();

    HRESULT hr = pDD->CreateSurface(&ddsd, &m_pddsSurface, NULL);

    pDD->Release();

    if( FAILED(hr) )
        return hr;

	if ( ddsd.dwWidth == m_dwWidth && ddsd.dwHeight == m_dwHeight )
		CopyDataToSurface();
	else
		CopyDataToSurfaceToSurface();

	// 拿矾虐甫 技泼茄促.
	DDSetColorKey(m_pddsSurface, RGB(0, 0, 0));

    return S_OK;
}


HRESULT WILTextureContainer::CopyDataToSurfaceToSurface()
{
	LPDIRECTDRAW7 pDD;
    m_pddsSurface->GetDDInterface((VOID**)&pDD);

    DDSURFACEDESC2 ddsd;
    ddsd.dwSize = sizeof(ddsd);
    m_pddsSurface->GetSurfaceDesc(&ddsd);
    ddsd.dwFlags         = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|//DDSD_PIXELFORMAT|
                           DDSD_TEXTURESTAGE;
    ddsd.ddsCaps.dwCaps  = DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY;
    ddsd.ddsCaps.dwCaps2 = 0L;
    ddsd.dwWidth         = m_dwWidth;
    ddsd.dwHeight        = m_dwHeight;

    LPDIRECTDRAWSURFACE7 pddsTempSurface;
    HRESULT hr;
    if ( FAILED(hr = pDD->CreateSurface(&ddsd, &pddsTempSurface, NULL) ) )
    {
        pDD->Release();
        return NULL;
    }

    while ( pddsTempSurface->Lock(NULL, &ddsd, 0, 0) == DDERR_WASSTILLDRAWING );

    DWORD lPitch = ddsd.lPitch;
    WORD* pwData = (WORD*)ddsd.lpSurface;






	RECT			rc;
	SetRect(&rc, 0, 0, m_dwWidth, m_dwHeight);
			
	WORD* pwdDst = pwData;

	INT nWidthStart	= 0;
	INT nWidthEnd	= 0;
	INT nCurrWidth  = 0;
	INT nCntCopyWord = 0;
	INT nYCnt =0;
	INT nLastWidth = 0;

	// y绵 努府俏.
	for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
	{
		nWidthEnd += m_pwData[nWidthStart];
		nWidthStart++;
		nWidthEnd++;
		nWidthStart	= nWidthEnd;
	}

	// y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
	for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
	{
		// 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
		nWidthEnd += m_pwData[nWidthStart];
		nWidthStart++;
		
		// 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
		for ( INT x = nWidthStart; x < nWidthEnd ; )
		{
			if ( m_pwData[x] == 0xC0 )
			{
				x++;
				nCntCopyWord = m_pwData[x];
				x++;
				nCurrWidth += nCntCopyWord;
			}
			else if ( m_pwData[x] == 0xC1 )
			{
				x++;
				nCntCopyWord = m_pwData[x];
				x++;

				nLastWidth = nCurrWidth;
				nCurrWidth += nCntCopyWord;

				if ( rc.left > nCurrWidth || rc.right < nLastWidth )
				{
					x += nCntCopyWord;
				}
				else
				{
					// rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
					if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
					{
						x += (rc.left-nLastWidth);
						memcpy(&pwdDst[((nYCnt) * (ddsd.lPitch >> 1)) + (rc.left)], &m_pwData[x], sizeof(WORD)*(nCurrWidth-rc.left));
						x += (nCurrWidth-rc.left);
					}
					// rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
					else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
					{
						memcpy(&pwdDst[((nYCnt) * (ddsd.lPitch >> 1)) + (nLastWidth)], &m_pwData[x], sizeof(WORD)*(rc.right-nLastWidth));
						x += nCntCopyWord;
					}
					else
					{
						memcpy(&pwdDst[((nYCnt) * (ddsd.lPitch >> 1)) + (nLastWidth)], &m_pwData[x], sizeof(WORD)*nCntCopyWord);
						x += nCntCopyWord;
					}
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -