[C++] 获取字体点阵

来源:互联网 发布:怪物猎人p3数据库安卓 编辑:程序博客网 时间:2024/04/30 00:09

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;
}




原创粉丝点击