CMatrix
COpenGLFont::GetMatrix( UINT nChar )
{
CMatrix
matrix( 64, 64, 0);
GLYPHMETRICS gm;
memset( &gm, 0, sizeof(gm));
MAT2 mat2;
mat2.eM11.value = 1; mat2.eM11.fract = 0;
mat2.eM12.value = 0; mat2.eM12.fract = 0;
mat2.eM21.value = 0; mat2.eM21.fract = 0;
mat2.eM22.value = 1; mat2.eM22.fract = 0;
//»ñÈ¡±¾×Ö·ûÐèÒªµÄ»º³åÇø´óС
DWORD cbBuffer = ::GetGlyphOutline( m_hDC
, nChar
, GGO_BITMAP
, &gm
, 0l
, NULL
, &mat2
);
if( cbBuffer == GDI_ERROR )
{
ASSERT( FALSE );
return matrix;
}
//¿ª±Ù»º³åÇø
LPBYTE lpvBuffer = new BYTE[cbBuffer];
//Ìî³ä×Ö·ûͼÏñ»º³åÇølpvBuffer
cbBuffer = GetGlyphOutline( m_hDC
, nChar
, GGO_BITMAP
, &gm
, cbBuffer
, lpvBuffer
, &mat2
);
UINT nStride = cbBuffer / gm.gmBlackBoxY;
int nMargeLeft = gm.gmptGlyphOrigin.x;
int nMargeTop = 64 - gm.gmBlackBoxY;
for( size_t y = 0; y < gm.gmBlackBoxY; y++)
{
for( size_t x = 0; x < nStride; x++)
{
for( int k = 0; k < 8; k++)
{
if( ( lpvBuffer[y*nStride+x] >> (7-k) ) & 1 )
{
matrix.SetElem( nMargeTop + y, 8 * x + k + nMargeLeft, 1);
}
}
}
}
delete [] lpvBuffer;
return matrix;
}