Verwenden von Glyph-Objekten | API-Lösung für C++

Die Arbeit mit Glyphen ist beim Codieren von Schriftarten von entscheidender Bedeutung, da es sich dabei um deren Einheit handelt. Wenn die grundlegenden Informationen zu Glyphen im Artikel des Absatzes Was ist eine Schriftart erläutert werden, zeigen wir Ihnen hier die Funktionalität von Aspose.Font für die Arbeit mit Glyphen und insbesondere die Glyph-Objekte.

Glyph-Objekt

Glyphen jeder Schriftart werden durch den Typ Glyph in der Aspose.Font-Bibliothek dargestellt. Der Typ Glyph ist also ein universelles Objekt für Schriftglyphen, unabhängig vom Schriftformat (TrueType, Compact Font Format usw.).

Die vom Glyph-Objekt bereitgestellte Funktionalität

Welche Funktionalität bietet uns dieses Objekt?

Diese Frage wird durch die Eigenschaften beantwortet, die es hat.

Lassen Sie uns ein Beispiel mit dem nächsten Codeausschnitt erstellen, der zeigt, wie die Breite für den Text „Hallo Welt“ in Pixel berechnet wird, wenn die Schriftgröße 10 beträgt.

Fügen Sie am Kopf der Datei die nächsten Namespaces hinzu:

1using namespace Aspose::Font::Glyphs;
2System::SharedPtr<Aspose::Font::Font> font;

Dann müssen Sie die nächsten Schritte unternehmen:

 1    //Declare text and other constants
 2    const System::String text = u"Hello world";
 3    const int32_t fontSize = 10;
 4    
 5    //Declare variable for string width
 6    double width = 0;
 7    
 8    //Get glyph for each letter in text and calculate width for whole text.
 9    //The same result can be achieved using method font->get_Metrics()->MeasureString(text, fontSize).
10    for (char16_t symbol : text)
11    {
12        System::SharedPtr<GlyphId> gid = this->_font->get_Encoding()->DecodeToGid(symbol);
13        System::SharedPtr<Glyph> glyph = this->_font->GetGlyphById(gid);
14        width += (glyph->get_WidthVectorX() / this->_font->get_Metrics()->get_UnitsPerEM()) * fontSize;
15    }

Um den Begrenzungsrahmen der Glyphe zu erhalten, verwenden Sie die Eigenschaft GlyphBBox des Objekts Glyph.

Um eine visuelle Darstellung von Glyphen zu erhalten, müssen Sie die Koordinaten aller Glyphenpunkte kennen.

Wie erhalte ich Koordinaten für alle Glyphenpunkte vom Glyph-Objekt?

Die nächsten Eigenschaften, IsEmpty und Path, wurden für diesen Fall entworfen.

Die Eigenschaft IsEmpty ist eine Hilfseigenschaft. Es sagt uns, ob der Pfad der Glyphe leer ist, oder mit anderen Worten, die Glyphe hat überhaupt keine Zeichenanweisungen. Wenn es den Wert false hat, ist es an der Zeit, die Figur der gesamten Glyphe mithilfe der sehr nützlichen Eigenschaft Path zu erstellen.

Im Konzept der Aspose.Font-Bibliothek wird die Darstellung einer beliebigen Glyphe in die einfachsten grafischen Grundelemente, sogenannte Segmente, unterteilt und durch die Schnittstelle IPathSegment dargestellt. Die Schnittstelle IPathSegment ist ein abstraktes Basisgrafikprimitiv.

Konkrete grafische Grundelemente werden durch Typen wie MoveTo, LineTo, CurveTo und ClosePath dargestellt.

Der Typ ClosePath wird verwendet, um das Ende der aktuellen grafischen Kontur anzuzeigen.

Die Typen MoveTo, LineTo und CurveTo entsprechen ihrer Definition nach den identischen Postscript-Operatoren.

Außerdem entsprechen die Typen MoveTo und LineTo ihrer Definition nach den Funktionen „MoveToEx()“ und „LineTo()“ aus der Windows GDI-Bibliothek. Der Typ CurveTo wird zur Beschreibung von Bézier-Kurven verwendet.

Die Glyph-Eigenschaft Path stellt uns eine Sammlung aller grafischen Grundelemente für diese Glyphe zur Verfügung. Die Eigenschaft Path hat den Typ SegmentPath und jedes Objekt dieses Typs hat die Eigenschaft Segments vom Typ PathSegmentCollection. Diese Eigenschaft Segments gibt alle grafischen Grundelemente zurück, die das Objekt SegmentPath enthält. Mit anderen Worten: Mit dem Eintrag glyph.Path.Segments können wir alle grafischen Grundelemente für die Glyphe abrufen.

Das nächste Beispiel berechnet alle Punkte, die die Glyphe hat, und speichert sie in der Variablen „points“, die ein Array von Objekten vom Typ Point darstellt.

Die von diesem Beispiel verwendete Logik ist einfach und es werden keine Glyphenkonturen extrahiert. Um diese Konturen mithilfe des Typs ClosePath zu erhalten, muss der Segmentverarbeitung hinzugefügt werden.

Fügen Sie am Kopf der Datei die nächsten Namespaces hinzu:

1using System::Collections::Generic;
2using System::Drawing;
3using Aspose::Font::Glyphs;
4using Aspose::Font::RenderingPath;

Dann müssen Sie die nächsten Schritte unternehmen:

 1    System::SharedPtr<Glyph> glyph;
 2
 3    //Declare resultant list with pints
 4    System::SharedPtr<System::Collections::Generic::List<System::Drawing::Point>> points = System::MakeObject<System::Collections::Generic::List<System::Drawing::Point>>();
 5    
 6    //Init service reference on IPathSegment
 7    System::SharedPtr<IPathSegment> prevSegment;
 8    
 9    //Iterate all glyph path segments and collect points
10    for (auto&& segment : glyph->get_Path()->get_Segments())
11    {
12        if ((System::ObjectExt::Is<LineTo>(segment)) || (System::ObjectExt::Is<CurveTo>(segment)))
13        {
14            if (System::ObjectExt::Is<MoveTo>(prevSegment))
15            {
16                System::SharedPtr<MoveTo> moveTo = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::MoveTo>(prevSegment);
17                AddPoint((int32_t)moveTo->get_X(), (int32_t)moveTo->get_Y(), points);
18            }
19            if (System::ObjectExt::Is<LineTo>(segment))
20            {
21                System::SharedPtr<LineTo> line = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::LineTo>(segment);
22                AddPoint((int32_t)line->get_X(), (int32_t)line->get_Y(), points);
23            }
24            else if (System::ObjectExt::Is<CurveTo>(segment))
25            {
26                System::SharedPtr<CurveTo> curve = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::CurveTo>(segment);
27                AddPoint((int32_t)curve->get_X1(), (int32_t)curve->get_Y1(), points);
28                AddPoint((int32_t)curve->get_X2(), (int32_t)curve->get_Y2(), points);
29                AddPoint((int32_t)curve->get_X3(), (int32_t)curve->get_Y3(), points);
30            }
31        }
32        prevSegment = segment;
33    }	
34
35void GlyphMetrics::AddPoint(int32_t x, int32_t y, System::SharedPtr<System::Collections::Generic::List<System::Drawing::Point>> points)
36{
37    System::Drawing::Point p;
38    p.set_X(x);
39    p.set_Y(y);
40    points->Add(p);
41}

Alle Beispiele zur Verwendung von Aspose.Font sind in der Aspose.Font.Examples.CPP.sln-Lösung in den cpp-examples der Aspose.Font-Dokumentation gespeichert.

Wenn Sie irgendwelche Probleme haben, können Sie diese im Abschnitt Aspose.Font.Product Family des Kostenlosen Support-Forums posten und innerhalb weniger Stunden wird unser Support-Team alles klären für dich.

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.