Utiliser des objets Glyphe | Solution API pour C++

Travailler avec des glyphes est crucial lors du codage des polices car c’est leur unité. Lorsque les informations de base sur les glyphes sont expliquées dans le article du Qu’est-ce que le paragraphe de police, nous allons ici vous apprendre les fonctionnalités d’Aspose.Font pour travailler avec des glyphes et les objets Glyph en particulier.

Objet glyphe

Les glyphes de n’importe quelle police sont représentés par le type Glyph dans la bibliothèque Aspose.Font. Ainsi, le type Glyph est un objet universel pour les glyphes de police, indépendamment du format de police (TrueType, Compact Font Format, etc.).

La fonctionnalité fournie par l’objet Glyph

Quelle fonctionnalité cet objet nous apporte-t-il ?

Cette question trouve sa réponse dans les propriétés dont il dispose.

Prenons un exemple avec l’extrait de code suivant qui montre comment calculer la largeur du texte “Bonjour tout le monde” en pixels lorsque la taille de police est de 10.

Ajoutez les espaces de noms suivants en tête du fichier :

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

Ensuite, vous devez passer aux étapes suivantes :

 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    }

Pour obtenir la boîte englobante du glyphe, utilisez la propriété GlyphBBox de l’objet Glyph.

Pour obtenir une représentation visuelle des glyphes, vous devez connaître les coordonnées de tous les points des glyphes.

Comment obtenir les coordonnées de tous les points glyphes de l’objet Glyph ?

Les propriétés suivantes, IsEmpty et Path ont été conçues pour ce cas.

La propriété IsEmpty est auxiliaire. Il nous indique si le chemin du glyphe est vide ou si, en d’autres termes, le glyphe n’a aucune instruction de dessin. S’il a la valeur false, il est temps de construire la figure entière du glyphe en utilisant la très utile propriété Path.

Dans le concept de la bibliothèque Aspose.Font, la représentation de n’importe quel glyphe est divisée en primitives graphiques les plus simples, appelées segments, et représentées par l’interface IPathSegment. L’interface IPathSegment est une primitive graphique abstraite de base.

Les primitives graphiques concrètes sont représentées par des types tels que MoveTo, LineTo, CurveTo et ClosePath.

Le type ClosePath permet d’indiquer la fin du contour graphique courant.

Les types MoveTo, LineTo et CurveTo par leur définition correspondent aux opérateurs postscript identiques.

Aussi, les types MoveTo et LineTo par leur définition correspondent aux fonctions MoveToEx() et LineTo() de la lib Windows GDI, le type CurveTo est utilisé pour décrire les courbes Bézier.

La propriété Glyph Path nous fournit une collection de toutes les primitives graphiques pour ce glyphe.

La propriété Path a le type SegmentPath et chaque objet de ce type a la propriété Segments de type PathSegmentCollection. Cette propriété Segments renvoie toutes les primitives graphiques incluses dans l’objet SegmentPath. En d’autres termes, nous pouvons obtenir toutes les primitives graphiques du glyphe en utilisant l’entrée glyph.Path.Segments.

Le exemple suivant calcule tous les points du glyphe et les stocke dans la variable « points », qui représente un tableau d’objets de type Point.

La logique utilisée par cet exemple est simple et n’extrait pas les contours des glyphes. Pour obtenir ces contours, le type ClosePath doit être ajouté au traitement des segments.

Ajoutez les espaces de noms suivants en tête du fichier :

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

Ensuite, vous devez passer aux étapes suivantes :

 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}

Tous les exemples d’utilisation de Aspose.Font sont stockés dans la solution Aspose.Font.Examples.CPP.sln, dans les cpp-examples de la Documentation Aspose.Font

Si vous rencontrez des problèmes, vous pouvez les publier dans la section Aspose.Font.Product Family du Free Support Forum et dans quelques heures, notre équipe d’assistance clarifiera tout. pour toi.

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.