Files
Client/GameTools/ZALLA3D BASECLASS/IMEFont.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

249 lines
8.2 KiB
C++
Raw Blame History

// IMEFont.cpp: implementation of the CIMEFont class.
//
//////////////////////////////////////////////////////////////////////
#include "IMEFont.h"
#include "SceneStateMgr.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIMEFont::CIMEFont()
{
for(int i=0;i<10;i++)
{
strcpy(m_strPrint[i],"");
strcpy(m_strPrinted[i],"");
}
m_RenderX=0;
m_RenderY=0;
}
CIMEFont::~CIMEFont()
{
if(m_pTexture)
m_pTexture->Release();
}
void CIMEFont::Render(LPDIRECT3DDEVICE8 pd3dDevice)
{
if(isRewirte())
MakeTexture();
m_pVertex[0].v.x=0.0f+m_RenderX;
m_pVertex[1].v.x=0.0f+m_RenderX;
m_pVertex[2].v.x=(float)m_SizeX+m_RenderX;
m_pVertex[3].v.x=(float)m_SizeX+m_RenderX;
m_pVertex[1].v.y=0.0f+m_RenderY;
m_pVertex[3].v.y=0.0f+m_RenderY;
m_pVertex[0].v.y=(float)m_SizeY+m_RenderY;
m_pVertex[2].v.y=(float)m_SizeY+m_RenderY;
m_pVertex[0].tu=0.0f;
m_pVertex[1].tu=0.0f;
m_pVertex[3].tu=1.0f;
m_pVertex[2].tu=1.0f;
m_pVertex[1].tv=0.0f;
m_pVertex[3].tv=0.0f;
m_pVertex[0].tv=1.0f;
m_pVertex[2].tv=1.0f;
for(int i=0;i<4;i++)
{
m_pVertex[i].w=0.1f;
m_pVertex[i].v.z=0.1f;
m_pVertex[i].Diffuse.c=0xffffffff;
m_pVertex[i].Specular.c=0xffffffff;
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pd3dDevice->SetTexture(0,m_pTexture);
//3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
//3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
//m_CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
//m_CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_POINT );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_POINT );
//m_CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MIPFILTER, D3DTEXF_NONE );
pd3dDevice->SetVertexShader(TLVERTEXFVF);
pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_pVertex,sizeof(TLVertex));
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
}
void CIMEFont::Create(LPDIRECT3DDEVICE8 pd3dDevice,long sizeX,long sizeY)
{
m_SizeX=sizeX;
m_SizeY=sizeY;
// Chatting Message Font 512,64;
m_cLine=m_SizeY/16;
pd3dDevice->CreateTexture(sizeX,sizeY,1,0,D3DFMT_A4R4G4B4,D3DPOOL_MANAGED,&m_pTexture);
}
void CIMEFont::PrintToTexture(char *str, long line)
{
if( line >=0 && line<m_cLine)
strcpy(m_strPrint[line],str);
}
bool CIMEFont::isRewirte()
{
for(int cLine=0;cLine<m_cLine;cLine++)
{
if( strcmp(m_strPrint[cLine],m_strPrinted[cLine])!=0)
return true;
}
return false;
}
void CIMEFont::MakeTexture()
{
DWORD* pBitmapBits;
BITMAPINFO bmi;
ZeroMemory( &bmi.bmiHeader, sizeof(BITMAPINFOHEADER) );
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = (int)m_SizeX;
bmi.bmiHeader.biHeight = -(int)m_SizeY;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 32;
// Create a DC and a bitmap for the font
HDC hDC = CreateCompatibleDC( NULL );
HBITMAP hbmBitmap = CreateDIBSection( hDC, &bmi, DIB_RGB_COLORS,
(VOID**)&pBitmapBits, NULL, 0 );
SetMapMode( hDC, MM_TEXT );
HFONT hFont=CreateFont(-12,6,0,0,0,FALSE,FALSE,FALSE, CHINESEBIG5_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "MingLiu" );
SelectObject( hDC, hbmBitmap );
SelectObject( hDC, hFont );
SetTextColor( hDC, RGB(255,255,255) );
SetBkColor( hDC, 0x00000000 );
SetTextAlign( hDC, TA_LEFT);
for(int cLine=0;cLine<m_cLine;cLine++)
{
ExtTextOut( hDC, 0, cLine*16, ETO_OPAQUE, NULL,m_strPrint[cLine],strlen(m_strPrint[cLine]), NULL );
strcpy(m_strPrinted[cLine],m_strPrint[cLine]);
}
/*
ExtTextOut( hDC, 0, 12, ETO_OPAQUE, NULL,m_strPrint[1],strlen(m_strPrint[1]), NULL );
ExtTextOut( hDC, 0, 24, ETO_OPAQUE, NULL,m_strPrint[2],strlen(m_strPrint[2]), NULL );
ExtTextOut( hDC, 0, 36, ETO_OPAQUE, NULL,m_strPrint[3],strlen(m_strPrint[3]), NULL );
strcpy(m_strPrinted[0],m_strPrint[0]);
strcpy(m_strPrinted[1],m_strPrint[1]);
strcpy(m_strPrinted[2],m_strPrint[2]);
strcpy(m_strPrinted[3],m_strPrint[3]);
*/
//SIZE p;
//GetTextExtentPoint32(hDC,"<22><>",2,&p);
//RECT rcFont={0,0,25*15,4*16};
//DrawText(hDC,strTemp,strlen(strTemp),&rcFont,DT_WORDBREAK|DT_LEFT);
D3DLOCKED_RECT d3dlr;
m_pTexture->LockRect( 0, &d3dlr, 0, 0 );
WORD* pDst16 = (WORD*)d3dlr.pBits;
BYTE bAlpha;
int x,y;
for( y=0;y<m_SizeY; y++ )
{
for( x=0;x<m_SizeX; x++ )
{
bAlpha = (BYTE)((pBitmapBits[m_SizeX*y + x] & 0xff) >> 4);
if (bAlpha > 0)
{
*pDst16++ = (bAlpha << 12) | 0x0fff;
}
else
{
*pDst16++=0x0000;
}
}
}
m_pTexture->UnlockRect(0);
DeleteObject( hbmBitmap );
DeleteDC( hDC );
DeleteObject( hFont );
}
void CIMEFont::Render(LPDIRECT3DDEVICE8 pd3dDevice, DWORD dwColor)
{
if(isRewirte())
MakeTexture();
m_pVertex[0].v.x=0.0f+m_RenderX;
m_pVertex[1].v.x=0.0f+m_RenderX;
m_pVertex[2].v.x=(float)m_SizeX+m_RenderX;
m_pVertex[3].v.x=(float)m_SizeX+m_RenderX;
m_pVertex[1].v.y=0.0f+m_RenderY;
m_pVertex[3].v.y=0.0f+m_RenderY;
m_pVertex[0].v.y=(float)m_SizeY+m_RenderY;
m_pVertex[2].v.y=(float)m_SizeY+m_RenderY;
m_pVertex[0].tu=0.0f;
m_pVertex[1].tu=0.0f;
m_pVertex[3].tu=1.0f;
m_pVertex[2].tu=1.0f;
m_pVertex[1].tv=0.0f;
m_pVertex[3].tv=0.0f;
m_pVertex[0].tv=1.0f;
m_pVertex[2].tv=1.0f;
for(int i=0;i<4;i++)
{
m_pVertex[i].w=0.1f;
m_pVertex[i].v.z=0.1f;
m_pVertex[i].Diffuse.c=dwColor;
m_pVertex[i].Specular.c=dwColor;
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pd3dDevice->SetTexture(0,m_pTexture);
//3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
//3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
//m_CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
//m_CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_POINT );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_POINT );
//m_CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MIPFILTER, D3DTEXF_NONE );
pd3dDevice->SetVertexShader(TLVERTEXFVF);
pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_pVertex,sizeof(TLVertex));
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
}