獲取truetype字型資料

2021-04-25 12:40:27 字數 2760 閱讀 3266

vpoint.clear();

int aaa=m_editfont.getlength();

glyphmetrics gm;

dword dwsize;

handle hmem;

lpttpolygonheader lpph;

lpbyte lpb;

long cboutline, cbtotal;

hwnd hwnd1;

crect rect1;

getdlgitem(picture1,&hwnd1);

::getwindowrect(hwnd1,&rect1);

screentoclient   (&rect1);

hdc hdc=::getdc(hwnd1);

cdc dc1;

dc1.attach(hdc);

m_font1.createfontindirect(&m_type.info);

dc1.selectobject(&m_font1);

mat2 m2;

m2.em11 = floattofixed(1.0);

m2.em12 = floattofixed(0.0);

m2.em21 = floattofixed(0.0);

m2.em22 = floattofixed(1.0);

for(int i=0;iuint uchar;//判斷是漢字還是字元

if (m_editfont.getat(i) >= 0) 

uchar = m_editfont.getat(i);

else

int th =  m_editfont.getat(i);

int tl =  m_editfont.getat(i+1);

uchar = ((th & 0x00ff)<<8) + (tl & 0x00ff);

i++;

dwsize = dc1.getglyphoutline(uchar,ggo_native,&gm,0l,null,&m2); //獲得外輪廓資訊

hmem=globalalloc(ghnd,dwsize);//分配記憶體

lpph=(lpttpolygonheader)globallock(hmem);//獲得記憶體控制代碼

dc1.getglyphoutline(uchar,ggo_native,&gm,dwsize,lpph,&m2); //獲得外輪廓資訊

cbtotal = dwsize;//獲得折點所佔緩衝區的大小

cpoint p1;

p1.x=-1;

p1.y=-1;

vpoint.push_back(p1);

while( cbtotal > 0 )//有多個

hwnd hwnd1;

getdlgitem(picture1,&hwnd1);

hdc hdc=::getdc(hwnd1);

cdc dc1;

dc1.attach(hdc);

int xold = mapfxy( lpph->pfxstart.x );//座標轉化

int yold = mapfxy( lpph->pfxstart.y );//座標轉化

p1.x=xold;

p1.y=200-10-yold;

dc1.moveto(xold,200-10-yold);

vpoint.push_back(p1);

lpb   = (lpbyte)lpph + sizeof(ttpolygonheader);//ttpolygonheader為truetype字型檔頭結構

//lpb指向弧線描述的首位址

cboutline = (long)lpph->cb - sizeof(ttpolygonheader);//獲得所有

while( cboutline > 0 )

int  n;

lpttpolycurve lpc;

lpc = (lpttpolycurve)lpb;

//lpttpolycurve定義了字型的乙個弧度,其中包括 是否直線 二次b樣條 3次b樣條

//以及描述點的個數

此結構表示truetype字型外輪廓線的一條曲線

typedef struct tagttpolycurve ttpolycurve, far* lpttpolycurve; 

drawoutline(&dc1,lpc->wtype,lpc->cpfx,lpc->apfx, 0, 0); //畫曲線

int count=lpc->cpfx;//獲得點結構的個數

for (int i=0;ip1.x=mapfxy(lpc->apfx[i].x);

p1.y=mapfxy(lpc->apfx[i].y);

// point.push_back(p1);

n = sizeof(ttpolycurve) + sizeof(pointfx) * (lpc->cpfx - 1);

//n是每個線條點所佔的區域大小

lpb += n;//曲線組下移

cboutline -= n;

dc1.lineto(xold,200-yold-10);//畫結束線

p1.x=xold;

p1.y=200-10-yold;

vpoint.push_back(p1);

p1.x=-1;

p1.y=-1;

vpoint.push_back(p1);

cbtotal -= lpph->cb;//檔案下移

lpph     = (lpttpolygonheader)lpb;

獲取TrueType字型資訊

對truetype字型有一定了解的人,相信一定對windows中fonts資料夾中中文字庫案顯示的名字感到好奇。將中文字型複製到該目錄下顯示的是中文字型名,而將該字型複製到其它位置則沒有享受到該待遇變成一串英文了,該文將講述該實現背後的秘密。truetype字型有乙個檔案頭和很多表組成,具體結構如下...

為 LaTeX 新增英文 TrueType 字型

在windows miktex環境下,新增中文字型最方便的辦法恐怕是使用 hooklee 的 xgbkfonts 工具 http hooklee.tex.html 在 linux 環境下,王垠改進的 gbkfonts http learn.tsinghua.edu.homepage 20013154...

java 獲取系統字型

獲取系統字型對應全路徑map return map public static mapgetfontpathmap for font font fonts if stringutil.stringrepeatnum fontfilepath,1 fontpathmap.put font.getfon...