14号先生 2014-04-23 13:05
浏览 1605

获取TTF字符轮廓信息相关问题

本人用以下代码获取TTF字符轮廓,用vc6运行成功,但是获得的点数太少。造成字体不太圆滑。求大神指点怎样增多获取的点数?

HDC hDC = pDC->GetSafeHdc();

//创建字体

CFont font;

VERIFY(font.CreateFont(m_iFontHeight, 0, 0, 0,FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS,m_sFontFaceName));

CFont *pOldFont = pDC->SelectObject(&font);

//定义并初始化变换矩阵

MAT2 mat2;

memset(&mat2, 0, sizeof(mat2));

mat2.eM11 = 1;

mat2.eM22 = 1;

GLYPHMETRICS metrics; //保存字符相关信息

DWORD dwDataSize = 0; //初始化字符数据缓冲区大小

//……

//通过函数GetGlyphOutline()确定存储字符结构的空间

dwDataSize = pDC->GetGlyphOutline(nChar, GGO_NATIVE, &metrics, 0, NULL, &mat2);

if ((dwDataSize != 0) && (dwDataSize != GDI_ERROR))

{

//创建保存字符数据缓冲区大小

LPBYTE pPixels = new BYTE[dwDataSize];

ASSERT( pPixels != NULL );

TTPOLYGONHEADER pHeader = (TTPOLYGONHEADER)pPixels;

dwDataSize = pDC->GetGlyphOutline(nChar,GGO_NATIVE,&metrics, dwDataSize, pPixels, &mat2);

while(dwDataSize > 0)

{

//计算字符轮廓的起点,转换坐标

int xOld = MapFXY(pHeader->pfxStart.x);

int yOld = MapFXY(pHeader->pfxStart.y);

//根据TTF字体结构获取字符轮廓

::MoveToEx(hDC,iXpos + xOld,iYpos - yOld,NULL);

TTPOLYCURVE pCurrentCurve = (TTPOLYCURVE)(pHeader + 1);

int remainByte = pHeader->cb - sizeof(TTPOLYGONHEADER);

while (remainByte > 0)

{

CPoint lpPoint[1000];

CPoint bezi[2];

int index;

for (index = 0; index < pCurrentCurve->cpfx; ++index)

{

lpPoint[index].x = iXpos + MapFXY(pCurrentCurve->apfx[index].x);

lpPoint[index].y = iYpos - MapFXY(pCurrentCurve->apfx[index].y);

}

switch (pCurrentCurve->wType)

{

case TT_PRIM_LINE:

case TT_PRIM_QSPLINE:

for (index =0; index < pCurrentCurve->cpfx; index++)

{

::LineTo(hDC,lpPoint[index].x,lpPoint[index].y);

}

break;

default:

MessageBox(_T("字体不支持"));

break;

}

int count = sizeof(TTPOLYCURVE) + (pCurrentCurve->cpfx -1)*sizeof(POINTFX);

pCurrentCurve = (TTPOLYCURVE*)((char*)pCurrentCurve + count);

        remainByte -= count;  
        }  
    ::LineTo(hDC,iXpos + xOld, iYpos - yOld);  
    dwDataSize -= pHeader->cb;  
    pHeader = (TTPOLYGONHEADER*)((char*)pHeader + pHeader->cb);  
}  
delete [] pPixels;  
}  
}  
  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题