Cómo GetGlyphOutline() formato nativo de búfer

Seleccione idioma Seleccione idioma
Id. de artículo: 87115 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

La función GetGlyphOutline proporciona un método para una aplicación recuperar la información de nivel más bajo sobre un glifo en el entorno de TrueType. Este artículo describe el formato de los datos que devuelve la función GetGlyphOutline .

Más información

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 *)&amp;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
				

Propiedades

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
Palabras clave: 
kbmt kbhowto KB87115 KbMtes
Traducción automática
IMPORTANTE: 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
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El 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.

Enviar comentarios

 

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