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 *)&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
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
| kbhowto kbmt KB87115 KbMtnl |
Automatische vertalingBELANGRIJK: 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
(http://support.microsoft.com/kb/87115/en-us/
)
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde productenDit 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.