您目前已離線,請等候您的網際網路重新連線

如何 GetGlyphOutline() 原生緩衝區格式

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:87115
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。
結論
GetGlyphOutline 函式提供應用程式擷取圖像 (Glyph) TrueType 環境中最低層級資訊的方法。本文將告訴您,GetGlyphOutline 函式會傳回的資料的格式。
其他相關資訊
圖像 (Glyph) 大綱是一系列的描述該圖像 (Glyph) 的作業分佈。每個分佈是由後面會多 TTPOLYCURVE 資料結構在必要描述作業分佈一個 TTPOLYGONHEADER 資料結構定義。

每個位置是來代表絕對位置不相對位置一個 POINTFX 資料結構描述。開始和結束的圖像的點是由 TTPOLYGONHEADER 資料結構 pfxStart 成員所提供。

TTPOLYCURVE 資料結構可分為兩種類型: TT_PRIM_LINE 記錄或 TT_PRIM_QSPLINE 記錄。TT_PRIM_LINE 記錄是一系列點 ; 點之間繪製的線條描述圖像的大綱。TT_PRIM_QSPLINE 記錄是字元的一系列點定義二次方曲線 (q 曲線) 所需說明外的框。

在 TrueType,q 曲線是由三個點 (A、 B 和 C) 曲線會點 A 與 C 和 B 是關閉的曲線點所定義。 每個 q 曲線的方程式是如下 (xA 代表 x 座標小心代表的點 A 的點 A 等等的 y 座標)
   x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA   y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA				
其中 t 異 0.0 到 1.0。

TT_PRIM_QSPLINE 記錄的格式,如下所示為:
  • q 曲線上的點 A 是目前的位置 (在 [TTPOLYGONHEADER、 [TTPOLYCURVE 的起點或結束點的前一個 TTPOLYCURVE 任一 pfxStart)。
  • 點 B 是資料錄中目前的點。
  • 點 C 是,如下所示:
    • 如果記錄具有兩個或更多點之後的點 B,點 C 是點 B] 和 [下一筆記錄中的點之間的中間點。
    • 否則,點 C 是點之後的點 B。
下列程式碼會呈現用來處理 TT_PRIM_QSPLINE 資料錄的演算法。雖然這個程式碼會示範如何從 TT_PRIM_QSPLINE 記錄擷取 q 曲線,並不適用於在應用程式中使用。
   pfxA = pfxStart;                // Starting point for this polygon   for (u = 0; u < cpfx - 1; u++)  // Walk through points in spline   {   pfxB = apfx[u];              // B is always the current point   if (u < cpfx - 2)            // If not on last spline, compute C      {      pfxC.x = (pfxB.x + apfx[u+1].x) / 2;  // x midpoint      pfxC.y = (pfxB.y + apfx[u+1].y) / 2;  // y midpoint      }   else                         // Else, next point is C      pfxC = apfx[u+1];                                // Draw q-spline   DrawQSpline(hdc, pfxA, pfxB, pfxC);   pfxA = pfxC;                 // Update current point   }				
上述演算法操作點直接,使用浮點數的運算子。不過,q 曲線記錄的資料點會儲存在 FIXED 的資料型別。下列程式碼會示範如何操控 FIXED 的資料的項目:
   FIXED fx;   long *pl = (long *)&fx;   // Perform all arithmetic on *pl rather than on fx   *pl = *pl / 2;				
以下的函數將浮點數值轉換成 FIXED 表示:
   FIXED FixedFromDouble(double d)   {   long l;   l = (long) (d * 65536L);   return *(FIXED *)&amp;l;   }				
在實際執行應用程式而不是撰寫 DrawQSpline 函式來個別地繪製每個 q 曲線,會更有效率計算 q 曲線上的點,並將其儲存在 指向 資料結構的陣列。當圖像 (Glyph) 的計算都已完成、 指向陣列傳遞到 PolyPolygon 函式,以繪製及填滿該圖像 (Glyph)。

下列範例會呈現為 24 點新細明體字型的 8514/A (小字型) 視訊驅動程式中的小寫 j 圖像 (Glyph GetGlyphOutline 傳回資料:
   GetGlyphOutline GGO_NATIVE 'j'   dwrc            = 208      // Total native buffer size in bytes   gmBlackBoxX, Y  = 6, 29    // Dimensions of black part of glyph   gmptGlyphOrigin = -1, 23   // Lower-left corner of glyph   gmCellIncX, Y   = 7, 0     // Vector to next glyph origin   TTPOLYGONHEADER #1           // Contour for dot on "j"   cb       = 44              // Total size of dot polygon   dwType   = 24              // TT_POLYGON_TYPE   pfxStart = 2.000, 20.000   // Start at lower-left corner of dot   TTPOLYCURVE #1   wType  = TT_PRIM_LINE   cpfx   = 3   pfx[0] = 2.000, 23.000   pfx[1] = 5.000, 23.000   pfx[2] = 5.000, 20.000   // Automatically close to pfxStart   TTPOLYGONHEADER #2   // Contour for body of "j"   cb       = 164     // Total size is 164 bytes   dwType   = 24      // TT_POLYGON_TYPE   pfxStart = -1.469, -5.641   TTPOLYCURVE #1     // Finish flat bottom end of "j"   wType  = TT_PRIM_LINE   cpfx   = 1   pfx[0] = -0.828, -2.813   TTPOLYCURVE #2    // Make hook in "j" with spline                    // Point A in spline is end of TTPOLYCURVE #1    wType  = TT_PRIM_QSPLINE    cpfx   = 2               // two points in spline -> one curve    pfx[0] = -0.047, -3.000  // This is point B in spline    pfx[1] = 0.406, -3.000   // Last point is always point C   TTPOLYCURVE #3    // Finish hook in "j"                    // Point A in spline is end of TTPOLYCURVE #2   wType  = TT_PRIM_QSPLINE   cpfx   = 3               // Three points -> two splines   pfx[0] = 1.219, -3.000   // Point B for first spline                             // Point C is (pfx[0] + pfx[1]) / 2   pfx[1] = 2.000, -1.906   // Point B for second spline   pfx[2] = 2.000, 0.281    // Point C for second spline   TTPOLYCURVE #4    // Majority of "j" outlined by this polyline    wType  = TT_PRIM_LINE    cpfx   = 3    pfx[0] = 2.000, 17.000    pfx[1] = 5.000, 17.000    pfx[2] = 5.000, -0.250   TTPOLYCURVE #5    // start of bottom of hook    wType  = TT_PRIM_QSPLINE    cpfx   = 2               // One spline in this polycurve    pfx[0] = 5.000, -3.266   // Point B for spline    pfx[1] = 4.188, -4.453   // Point C for spline   TTPOLYCURVE #6    // Middle of bottom of hook    wType  = TT_PRIM_QSPLINE    cpfx   = 2               // One spline in this polycurve    pfx[0] = 3.156, -6.000   // B for spline    pfx[1] = 0.766, -6.000   // C for spline   TTPOLYCURVE #7    // Finish bottom of hook and glyph    wType  = TT_PRIM_QSPLINE    cpfx   = 2               // One spline in this polycurve    pfx[0] = -0.391, -6.000  // B for spline    pfx[1] = -1.469, -5.641  // C for spline				

警告:本文為自動翻譯

內容

文章識別碼:87115 - 最後檢閱時間:11/21/2006 15:33:33 - 修訂: 2.3

Microsoft Windows Software Development Kit 3.1, Microsoft Win32 Application Programming Interface

  • kbmt kbhowto KB87115 KbMtzh
意見反應
eateElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">