Exemple #1
0
INT __stdcall CFontObject::DrawText(TCHAR* str,DWORD dwLen,RECT* pRect,DWORD dwColor,CHAR_CODE_TYPE type,DWORD dwFlag,void* sprite)
{
	INT			iResult = 0xffffffff;
	BOOL		bHasCRLF = RemoveCRLF(str,dwLen);
	
	
#ifdef	_DEBUG
	char	txt[2048];
	DWORD	dwAddr;

	if (bHasCRLF)
	{
		memset(txt,0,sizeof(txt));
		wsprintf(txt,"Fail to RenderFont(), string has CR or LF or HT!! %s\n",str);
		GetEIP(&dwAddr);
		g_pErrorHandleFunc(ERROR_TYPE_PARAMETER_INVALID,1,(void*)dwAddr,txt);
	}
	
	if (0 == pRect->right - pRect->left)
	{
		memset(txt,0,sizeof(txt));
		wsprintf(txt,"Fail to RenderFont(), rect's width zero!! %s\n",str);
		GetEIP(&dwAddr);
		g_pErrorHandleFunc(ERROR_TYPE_PARAMETER_INVALID,0,(void*)dwAddr,txt);
	}
	if (0 == pRect->bottom - pRect->top)
	{
		memset(txt,0,sizeof(txt));
		wsprintf(txt,"Fail to RenderFont(), rect's height zero!! %s\n",str);
		GetEIP(&dwAddr);
		g_pErrorHandleFunc(ERROR_TYPE_PARAMETER_INVALID,0,(void*)dwAddr,txt);
	}
	if (pRect->right - pRect->left > m_pFontCache->GetMaxWidth())
	{
		memset(txt,0,sizeof(txt));
		wsprintf(txt,"Fail to RenderFont(), rect's width too large!! %s\n",str);
		GetEIP(&dwAddr);
		g_pErrorHandleFunc(ERROR_TYPE_PARAMETER_INVALID,0,(void*)dwAddr,txt);
	}
	if (pRect->bottom - pRect->top > m_pFontCache->GetMaxWidth())
	{
		memset(txt,0,sizeof(txt));
		wsprintf(txt,"Fail to RenderFont(), rect's height too large!! %s\n",str);
		GetEIP(&dwAddr);
		g_pErrorHandleFunc(ERROR_TYPE_PARAMETER_INVALID,0,(void*)dwAddr,txt);
	}
#endif

	if (!dwLen)
		goto lb_return;


	LPDIRECT3DDEVICE9 pDevice;
	
	pDevice = m_pRenderer->GetDevice();
	pDevice->SetRenderState(D3DRS_ZWRITEENABLE ,FALSE);
	pDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);

	pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT);
	pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT);
	
	VECTOR2	v2Pos;
	v2Pos.x = (float)pRect->left;
	v2Pos.y = (float)pRect->top;

	pDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX,0);


	pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP );
	pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP );
	pDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
	pDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
	pDevice->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_DISABLE  );
	
	CVertexBuffer*	pVB;
	CIndexBuffer*	pIB;
	LPDIRECT3DTEXTURE9	pTex;
	
	m_propertyDesc.pszString = str;
	m_propertyDesc.dwStrLen = dwLen;
	m_propertyDesc.dwColor = dwColor;

	m_pFontCache->GetResource(&pTex,&pVB,&pIB,pRect,&m_propertyDesc);

	/// LeHide Edit, Check - FVF형을 정확히 알아야 함 폰트는 빌보드로 돼 있을까/ 여튼 현재 잘 돌아간다
	pDevice->SetVertexShader(NULL);
	pDevice->SetFVF(pVB->GetVertexShader());
	//pDevice->SetFVF(D3DFVF_D3DTLVERTEX);

	pDevice->SetStreamSource( 0, pVB->GetVertexBuffer(), 0, pVB->GetVertexSize());

	pDevice->SetTexture(0,pTex);
	 
	DWORD dwAlpha;
	dwAlpha = (dwColor & 0xff000000)>>24;

	
	//trustpak

	EnableAlphaSetting(pDevice, 0, dwAlpha);

	//BeginAlphaMeshObject(pDevice,0,255,dwAlpha);		
	
	//pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE );
	//pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
	//pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);	
	
	//trustpak
		
//	pDevice->SetRenderState(D3DRS_FILLMODE,RENDER_MODE_WIREFRAME);

	pDevice->SetIndices(pIB->GetIndexBuffer());

	HRESULT l_RetValue = pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, pVB->GetStartIndex(), 0, 4, pIB->GetStartIndex(), 2);

	if(D3D_OK != l_RetValue)
	{
		goto lb_return;
	}
	
	EndAlphaMeshObject(pDevice);	
	
//	pDevice->SetRenderState(D3DRS_FILLMODE,RENDER_MODE_SOLID);


	pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE );

	pDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
	pDevice->SetRenderState(D3DRS_ZWRITEENABLE ,TRUE);
	pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );

	pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
	pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);

//	__asm
//	{
//		rdtsc
//		pop		ecx
//		pop		ebx
//		sub		edx,ecx
//		sub		eax,ebx
//		nop
//	}

lb_return:
	return iResult;
}