首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

從 TrueType 字體提取點陣資料的完整流程

     編輯:關於VC++

三大關鍵步驟

  1. 篩選 TrueType 字體:CFontDialog dlg; dlg.m_cf.Flags |= CF_TTONLY;
  2. 解析 "cmap" 表取得字符編碼區段:透過 CDC::GetFontData 讀取 cmap 表,解析 Format 4 (Windows Unicode) 區段結構,獲得字符起始/結束碼。
  3. 呼叫 GetGlyphOutline 取得點陣:依字體大小計算 MAT2 矩陣,取得輪廓或點陣資料,處理 DWORD 對齊與座標原點轉換。

讀取 cmap 表

#define MAKETABLENAME(c1,c2,c3,c4) (((DWORD)c4<<24)|((DWORD)c3<<16)|((DWORD)c2<<8)|(DWORD)c1)
DWORD tag = MAKETABLENAME('c','m','a','p');
DWORD size = pFontDC->GetFontData(tag, 0, NULL, 0);
BYTE* buf = new BYTE[size];
pFontDC->GetFontData(tag, 0, buf, size);
// 解析 buf ... 參考 showttf.c 邏輯,提取 startchars/endchars 陣列

GetGlyphOutline 點陣轉換

關鍵參數:

  • MAT2 mat2 = { {0,1}, {0,0}, {0,0}, {0,1} };(單位矩陣,無縮放旋轉)
  • GLYPHMETRICS gm:回傳 gmBlackBoxX/Y(點陣寬高)、gmCellIncX(進位寬度)、gmptGlyphOrigin(原點偏移)。
  • TEXTMETRIC tm:取得 tmAscent 計算基線。

點陣資料後處理(含對齊與反鋸齒)

int iAdjust = (box_x + 3) & 0xFFFC; // DWORD 對齊
// 反鋸齒 2-bit/pixel (4 階)
width = (width % 4 == 0) ? width/4 : width/4 + 1;
for (y=0; y

完整函數 CreateFontMatrix 封裝上述邏輯,輸出點陣緩衝區、每列位元組數、高度、基線、字符寬高等資訊,方便直接繪製或快取。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved