Het oorspronkelijke Buffer indeling GetGlyphOutline()

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 87115 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Samenvatting

De functie GetGlyphOutline biedt een methode voor een toepassing het laagste niveau informatie ophalen over een glyph in het TrueType omgeving. Dit artikel beschrijft de indeling van de gegevens de De functie GetGlyphOutline retourneert.

Meer informatie

Een overzicht van de glyph is een reeks contouren die de glyph beschrijven. Elke contour wordt gedefinieerd door een gegevensstructuur TTPOLYGONHEADER is gevolgd door zoveel TTPOLYCURVE gegevensstructuren zijn vereist Beschrijf de contour.

Elke positie wordt beschreven door een gegevensstructuur POINTFX die vertegenwoordigt een absolute positie een positie. De eerste en eindpunt voor de glyph wordt gegeven door het lid pfxStart van de TTPOLYGONHEADER -gegevensstructuur.

De gegevensstructuren TTPOLYCURVE vallen in twee typen: een TT_PRIM_LINE record of een record TT_PRIM_QSPLINE. Een record TT_PRIM_LINE is een serie punten; lijnen getekend tussen de punten de omtrek van de glyph. Een record TT_PRIM_QSPLINE is een reeks punten definiëren de kwadratische splines (q-splines) nodig om de omtrek van de teken.

TrueType, q-spline wordt gedefinieerd door drie punten (A, B en C) waar de punten a en c op de curve en punt b zijn is uit de kromme. De vergelijking voor elke q spline is als volgt (xA vertegenwoordigt de x-coördinaat van een punt, yA vertegenwoordigt de y-coördinaat van een punt, enzovoort)
   x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
   y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
				
waarbij t varieert tussen 0,0 en 1,0.

De indeling van een record TT_PRIM_QSPLINE is als volgt:
  • Een punt op de q-spline wordt de huidige positie (of pfxStart in de TTPOLYGONHEADER het beginpunt voor de TTPOLYCURVE of de eindpunt van de vorige TTPOLYCURVE).
  • Punt b is het huidige punt in de record.
  • Punt c is als volgt:
    • Als de record heeft twee of meer punten na punt B, punt c is het middelpunt tussen punt b en het volgende punt in de record.
    • Anders, punt c is het volgende punt B.
De volgende code geeft de algoritme gebruikt om het proces een TT_PRIM_QSPLINE record. Terwijl deze code demonstreert het uitpakken q-splines uit een record TT_PRIM_QSPLINE, is niet geschikt voor gebruik in een toepassing.
   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
   }
				
De bovenstaande algoritme manipuleert punten rechtstreeks met drijvende komma operatoren. Punten q spline records worden echter opgeslagen in een vast gegevenstype. De volgende code toont hoe vast bewerken items van gegevens:
   FIXED fx;
   long *pl = (long *)&fx;

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

   *pl = *pl / 2;
				
De volgende functie converteert een getal met drijvende komma naar vast weergave:
   FIXED FixedFromDouble(double d)
   {

   long l;

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

   }
				
In een productietoepassing voor de, in plaats van schrijven een functie DrawQSpline afzonderlijk elke q spline tekenen, is het efficiënter om punten op de q-spline berekenen en deze opslaan in een matrix van punt gegevensstructuren. Wanneer de berekeningen voor een glyph zijn, doorgeven de matrix punt aan de functie PolyPolygon tekenen en vullen de glyph.

In het volgende voorbeeld worden de gegevens die zijn geretourneerd door de GetGlyphOutline voor de kleine letter 'j' glyph in de 24-punts Arial van de 8514/a (kleine lettertypen) stuurprogramma:
   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
				

Eigenschappen

Artikel ID: 87115 - Laatste beoordeling: maandag 11 juni 2012 - Wijziging: 4.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32-API
Trefwoorden: 
kbhowto kbmt KB87115 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende: 87115
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.

Geef ons feedback

 

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