Jak formát nativní Buffer GetGlyphOutline()

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Souhrn

Funkce GetGlyphOutline poskytuje metody pro aplikaci k načtení nejnižší úroveň informací o piktogramy v prostředí TrueType. Tento článek popisuje formát dat
Funkce GetGlyphOutline vrátí.

Další informace

Glyf osnovy je řada profily, které popisují glyf. Každý rozvrh je definován TTPOLYGONHEADER struktury dat, který je následován tolik datových struktur TTPOLYCURVE podle potřeby k popisu obrysu.


Každá pozice je popsán POINTFX datové struktury, což představuje absolutní pozici relativní pozici. Počáteční a koncový bod pro glyf je dána členem pfxStart struktura dat TTPOLYGONHEADER .


Datové struktury TTPOLYCURVE spadají do dvou typů: TT_PRIM_LINE záznamu nebo záznam TT_PRIM_QSPLINE. TT_PRIM_LINE záznamu je řada bodů; čar nakreslených mezi body popisují osnovy glyfu. Záznam TT_PRIM_QSPLINE je řada bodů definování křivky kvadratické (q křivky) vyžadované k popsání osnovy znaku.


V písma TrueType q křivky je definován třemi body (A, B a C), kde jsou body A a C na křivce a bod že b je vypnuto křivky. Každý q křivky je definován takto (xA představuje souřadnici x bodu A, ja představuje souřadnici y bodu A atd.)

   x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA

Pokud t liší od 0,0 do 1,0.


Formát záznamu TT_PRIM_QSPLINE je následující:

  • Bod na q křivky je aktuální pozice (buď pfxStart TTPOLYGONHEADER, TTPOLYCURVE počáteční bod nebo koncový bod předchozí TTPOLYCURVE).
  • Bod B je aktuálního bodu v záznamu.
  • Bod C je následující:

    • Pokud záznam obsahuje dvě nebo více bodů od bodu B, bod C je střední bod mezi bodem B a dalšího bodu v záznamu.
    • V ostatních případech je C bod po bodu B.
Následující kód představuje algoritmus použitý k záznamu TT_PRIM_QSPLINE zpracovat. Když tento kód ukazuje, jak lze extrahovat ze záznamu TT_PRIM_QSPLINE q křivky, není vhodné pro použití v aplikaci.

   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
}

Výše uvedený algoritmus pracuje body přímo, pomocí operátorů s plovoucí desetinnou čárkou. Body v záznamech q křivky jsou však uložena v typ dat PEVNÉ. Následující kód ukazuje, jak pracovat s pevných datových položek:

   FIXED fx;   long *pl = (long *)&fx;

// Perform all arithmetic on *pl rather than on fx

*pl = *pl / 2;

Následující funkce převede číslo s plovoucí desetinnou čárkou do dlouhodobého vyjádření:

   FIXED FixedFromDouble(double d)   {

long l;

l = (long) (d * 65536L);
return *(FIXED *)&amp;l;

}

V produkční aplikaci, spíše než napíšete funkci DrawQSpline nakreslete každé křivky q jednotlivě je efektivnější pro výpočet bodů křivky q a uložit je do pole boddatových struktur. Po dokončení výpočtů pro glyf předáte PolyPolygon funkce kreslení a vyplňte glyf bod pole.


Následující příklad představuje dat vrácených GetGlyphOutline pro malá písmena "j" glyfů v písmu Arial 24 bod 8514/a (malá písma) video ovladače:

   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

Vlastnosti

ID článku: 87115 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor