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

文章翻譯 文章翻譯
文章編號: 87115 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

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 - 上次校閱: 2006年11月21日 - 版次: 2.3
這篇文章中的資訊適用於:
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface
關鍵字:?
kbmt kbhowto KB87115 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:87115
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com