Gewusst wie GetGlyphOutline() Puffer Eigenformat

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 87115 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Die GetGlyphOutline -Funktion stellt eine Methode für eine Anwendung die untersten Ebene Informationen über ein Symbol in der TrueType-Umgebung abzurufen. Dieser Artikel beschreibt das Format der Daten, die GetGlyphOutline -Funktion gibt.

Weitere Informationen

Eine Gliederung Symbol ist eine Reihe von Profile, die das Symbol zu beschreiben. Jede Oberfläche wird durch eine TTPOLYGONHEADER -Datenstruktur definiert, von wie viele TTPOLYCURVE Datenstrukturen erforderlich gefolgt, um die Oberfläche beschrieben werden.

Jede Position wird durch eine Datenstruktur POINTFX beschrieben, die eine absolute Position keine relative Position darstellt. Die Anfangs- und Endpunkt für das Symbol wird durch die PfxStart Mitglied der TTPOLYGONHEADER -Datenstruktur angegeben.

Die TTPOLYCURVE -Datenstrukturen fallen in zwei Typen: ein TT_PRIM_LINE-Datensatz oder ein TT_PRIM_QSPLINE-Datensatz. Ein TT_PRIM_LINE-Datensatz ist eine Reihe von Punkten; Linien zwischen den Punkten gezeichnet wird die Gliederung des Symbols für das beschreiben. Ein TT_PRIM_QSPLINE-Datensatz ist eine Reihe von Punkten definieren die quadratische Splines (Q-Splines) erforderlich, um den Umriss des Zeichens beschreiben.

In TrueType wird durch drei Punkte (A, B und C), Punkt A und C, wo sich die Kurve befinden und Punkt B Deaktivieren der Kurve ist ein Q-Spline definiert. Die Gleichung für jede Q-Spline lautet wie folgt (xA stellt die X-Koordinate des Punkt A yA stellt die y-Koordinate des Punkt A usw.)
   x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
   y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
				
, wobei t variiert von 0,0 1.0.

Das Format des ein TT_PRIM_QSPLINE-Datensatz ist wie folgt:
  • Punkt A auf die Q-Spline wird die aktuelle Position (entweder PfxStart in der TTPOLYGONHEADER, den Ausgangspunkt für die TTPOLYCURVE oder der Endpunkt des vorherigen TTPOLYCURVE).
  • Punkt B ist der aktuelle Punkt im Datensatz.
  • Punkt C lautet wie folgt:
    • Wenn der Datensatz verfügt über zwei oder mehr Punkte nach Punkt B, zeigen Sie C dem mittleren Punkt zwischen Punkt B und der nächste Punkt im Datensatz ist.
    • Andernfalls ist Punkt C den folgenden Punkt b Punkt
Der folgende Code zeigt den Algorithmus an einen TT_PRIM_QSPLINE-Datensatz verarbeitet. Während dieser Code zum Extrahieren von Q-Splines aus einem Datensatz TT_PRIM_QSPLINE veranschaulicht, ist es nicht für die Verwendung in einer Anwendung geeignet.
   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
   }
				
der oben angegebenen Algorithmus bearbeitet Punkt direkt mit Gleitkommazahlen Operatoren. Punkte in Q-Spline-Datensätze sind jedoch in einem festen Datentyp gespeichert. Der folgende Code veranschaulicht wie fest Datenelemente bearbeiten:
   FIXED fx;
   long *pl = (long *)&fx;

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

   *pl = *pl / 2;
				
die folgende Funktion konvertiert eine Gleitkommazahl in festen Darstellung:
   FIXED FixedFromDouble(double d)
   {

   long l;

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

   }
				
in einer Produktionsanwendung, sondern schreiben eine DrawQSpline -Funktion einzeln jedes Q-Spline zu zeichnen, ist es effizienter, Punkte auf dem Q-Spline berechnen und in ein Array von POINT -Datenstrukturen zu speichern. Wenn die Berechnungen für ein Symbol abgeschlossen sind, übergeben Sie das POINT-Array an die Funktion PolyPolygon zeichnen und füllen Sie das Symbol.

Das folgende Beispiel zeigt die Daten von GetGlyphOutline für die Kleinbuchstaben "j" Symbols in die Schriftart auf 24 Punkt Arial des 8514/a (kleine Schriftarten) Grafiktreibers zurückgegeben:
   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
				

Eigenschaften

Artikel-ID: 87115 - Geändert am: Dienstag, 21. November 2006 - Version: 2.3
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface
Keywords: 
kbmt kbhowto KB87115 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 87115
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

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