Comment faire pour GetGlyphOutline() natif tampon format

Traductions disponibles Traductions disponibles
Numéro d'article: 87115 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

La fonction GetGlyphOutline fournit une méthode pour une application pour récupérer les informations sur un glyphe de l'environnement TrueType niveau le plus bas. Cet article décrit le format des données que la fonction GetGlyphOutline renvoie.

Plus d'informations

Un plan glyphe est une série de profils qui décrivent le glyphe. Chaque profil est défini par une structure de données TTPOLYGONHEADER , qui est suivie par structures de données TTPOLYCURVE autant que nécessaire pour décrire le profil.

Chaque position est décrit par une structure de données POINTFX , qui représente une position absolue, pas une position relative. Début et de fin point pour le glyphe est fourni par le membre pfxStart de la structure de données TTPOLYGONHEADER .

Les structures de données TTPOLYCURVE se répartissent en deux types : un enregistrement TT_PRIM_LINE ou un enregistrement TT_PRIM_QSPLINE. Un enregistrement TT_PRIM_LINE est une série de points ; traits dessinés entre les points décrivent le plan du glyphe. Un enregistrement TT_PRIM_QSPLINE est une série de points définissant les splines quadratique (q-splines) requis pour décrire le plan du caractère.

De TrueType, un q-spline est défini par trois points (A, B et C), où les points de A et C sont sur la courbe et point que B est hors de la courbe. L'équation pour chaque q-spline est comme suit (xA représente la coordonnée x du point A, yA représente la coordonnée y d'un point, etc.)
   x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
   y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
				
où pas varie comprise entre 0,0 et 1,0.

Le format d'un enregistrement TT_PRIM_QSPLINE est comme suit :
  • UN point sur la q-spline est la position en cours (soit pfxStart dans le TTPOLYGONHEADER, le point de départ pour la TTPOLYCURVE ou le point de fin de la TTPOLYCURVE précédente).
  • Point B est le point en cours de l'enregistrement.
  • Point C est la suivante :
    • Si l'enregistrement a deux ou plusieurs points suivant point B, C point est le point central entre point B et le point suivant dans l'enregistrement.
    • Dans le cas contraire, point C est le point suivant point b.
Le code suivant présente l'algorithme utilisé pour traiter un enregistrement TT_PRIM_QSPLINE. Alors que ce code montre comment extraire q-splines à partir d'un enregistrement TT_PRIM_QSPLINE, il n'est pas appropriée pour une utilisation dans une application.
   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
   }
				
l'algorithme ci-dessus manipule points directement, à l'aide les opérateurs de calcul en virgule flottante. Cependant, points d'enregistrements q-spline sont stockés dans un type de données CTXT. Le code suivant montre comment manipuler des éléments de données FIXED :
   FIXED fx;
   long *pl = (long *)&fx;

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

   *pl = *pl / 2;
				
la fonction suivante convertit un nombre à virgule flottante dans la représentation FIXED :
   FIXED FixedFromDouble(double d)
   {

   long l;

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

   }
				
dans une application de production, plutôt qu'écrire une fonction DrawQSpline à dessiner chaque q-spline individuellement, il est plus efficace de calculer les points de la spline-q et les stocker dans un tableau de structures de données POINT . Lorsque les calculs pour un glyphe sont terminés, transmettre le tableau POINT à la fonction PolyPolygon pour dessiner et remplir le glyphe.

L'exemple suivant présente les données renvoyées par la GetGlyphOutline pour le glyphe j minuscule de la police Arial 24 points du pilote vidéo (polices MINUSCULE) 8514/a:
   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
				

Propriétés

Numéro d'article: 87115 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 2.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface
Mots-clés : 
kbmt kbhowto KB87115 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 87115
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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