Un contorno de glifo es una serie de perfiles que describen el glifo. Cada perfil se define mediante una estructura de datos
TTPOLYGONHEADER , seguido por estructuras de datos
TTPOLYCURVE tantos como son necesarios para describir el perfil.
Cada posición es descrita por una estructura de datos
POINTFX , que representa una posición absoluta, no una posición relativa. La inicial y final punto para el glifo viene dado por el miembro
pfxStart de la estructura de datos
TTPOLYGONHEADER .
Las estructuras de datos
TTPOLYCURVE se dividen en dos tipos: un registro TT_PRIM_LINE o un registro TT_PRIM_QSPLINE. Un registro TT_PRIM_LINE es una serie de puntos; las líneas dibujadas entre los puntos de describan el esquema del glifo. Un registro TT_PRIM_QSPLINE es una serie de puntos que definen las curvas cuadráticas spline (q curvas spline) necesarias para describir el esquema del carácter.
En TrueType, se define una spline q por tres puntos (A, B y C), donde los puntos de A y C son de la curva y punto que B es desactivar la curva. La ecuación para cada spline q es como sigue (xA representa la coordenada x del punto A, hasta que representa la coordenada y de un punto y así sucesivamente)
x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
donde t varía desde 0,0 a 1,0.
El formato de un registro TT_PRIM_QSPLINE es como sigue:
- A punto de la spline q es la posición actual (bien pfxStart en el TTPOLYGONHEADER, el punto de partida para la TTPOLYCURVE o el punto final de la anterior TTPOLYCURVE).
- Punto B es el punto actual en el registro.
- Punto C es como sigue:
- Si el registro tiene dos o más puntos siguiente punto B, C de punto es el punto medio entre punto B y el punto siguiente en el registro.
- Lo contrario, punto C es el punto siguiente punto B.
El código siguiente presenta el algoritmo utilizado para procesar un registro TT_PRIM_QSPLINE. Mientras este código muestra cómo extraer q splines de un registro TT_PRIM_QSPLINE, no es adecuado para su uso en una aplicación.
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
}
el algoritmo anterior manipula puntos directamente, mediante operadores de punto flotante. Sin embargo, los puntos de spline q registros se almacenan en un tipo de datos decimal. El código siguiente muestra cómo manipular los elementos de datos decimal:
FIXED fx;
long *pl = (long *)&fx;
// Perform all arithmetic on *pl rather than on fx
*pl = *pl / 2;
la función siguiente convierte un número de punto flotante en la representación decimal:
FIXED FixedFromDouble(double d)
{
long l;
l = (long) (d * 65536L);
return *(FIXED *)&l;
}
en una aplicación de producción, en lugar escribir una función
DrawQSpline para dibujar cada spline q individualmente, resulta más eficaz para calcular puntos de la spline q y almacenarlos en una matriz de estructuras de datos
POINT . Cuando se completan los cálculos para un glifo, pasar la matriz POINT a la función
PolyPolygon para dibujar y rellenar el glifo.
En el ejemplo siguiente se presenta los datos devueltos por GetGlyphOutline para el glifo minúsculas "j" en la fuente Arial de 24 puntos del 8514/a (fuentes pequeñas) controlador de vídeo:
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
Id. de artículo: 87115 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 2.3
La información de este artículo se refiere a:
- Microsoft Windows Software Development Kit 3.1
- Microsoft Win32 Application Programming Interface
| kbmt kbhowto KB87115 KbMtes |
Traducción automáticaIMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés):
87115
(http://support.microsoft.com/kb/87115/en-us/
)
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia algunaEl presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.