Utiliser des objets Glyphe | Solution API pour .NET

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.

La propriété State nous indique si le glyphe est corrompu. S’il a la valeur ParsedWithErrors, alors ce glyphe a été analysé avec des erreurs et toutes les données du glyphe n’ont pas été reçues.

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 Aspose.Font.Glyphs;			
2using Aspose.Font.Font font;

Ensuite, vous devez passer aux étapes suivantes :

 1    Aspose.Font.Font font;
 2
 3    // Declare text and other constants
 4    const string text = "Hello world";
 5    const int fontSize = 10;
 6
 7    //Declare a variable for string width
 8    double width = 0;     
 9
10    //Get glyphs for each letter in the text and calculate the width for the whole text
11    //The same result can be achieved using the method font.Metrics.MeasureString (text, fontSize)
12    foreach (char symbol in text)
13    {
14        GlyphId gid = font.Encoding.DecodeToGid(symbol);
15        Glyph glyph = font.GetGlyphById(gid);
16        width += (glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
17    }

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    Glyph glyph;
 2
 3    //Declare resultant list with points
 4    List<Point> points = new List<Point>();
 5
 6    //Init service reference on IPathSegment
 7    IPathSegment prevSegment = null;
 8
 9    //Iterate all glyph path segments and collect points
10    foreach (IPathSegment segment in glyph.Path.Segments)
11    {
12        if ((segment is LineTo)
13            || (segment is CurveTo))
14        {
15            if (prevSegment is MoveTo)
16            {
17                MoveTo moveTo = prevSegment as MoveTo;
18                AddPoint((int)moveTo.X, (int)moveTo.Y, points);
19            }
20            if (segment is LineTo)
21            {
22                LineTo line = segment as LineTo;
23                AddPoint((int)line.X, (int)line.Y, points);
24            }
25            else if (segment is CurveTo)
26            {
27                CurveTo curve = segment as CurveTo;
28                AddPoint((int)curve.X1, (int)curve.Y1, points);
29                AddPoint((int)curve.X2, (int)curve.Y2, points);
30                AddPoint((int)curve.X3, (int)curve.Y3, points);
31            }
32        }
33        prevSegment = segment;
34    }	
35
36    void AddPoint(int x, int y, List<Point> points)
37    {
38        Point p = new Point();
39        p.X = x;
40        p.Y = y;
41        points.Add(p);
42    }

Comment calculer la valeur de crénage des glyphes ?

Une autre métrique Glyph mais celle qui n’est pas fournie par l’objet de type Glyph. Nous parlons ici de crénage. Une caractéristique telle que le crénage ne s’applique pas à un mais à une paire de glyphes. Ainsi, pour calculer le crénage, vous devez utiliser l’identifiant non pas d’un mais de deux glyphes.

L’interface IFontMetrics dans la bibliothèque Aspose.Font définit la méthode GetKerningValue() qui prend les identifiants de glyphes pour une paire de glyphes et renvoie une valeur de crénage, liée à cette paire. Si aucune information de crénage n’existe pour la paire de glyphes, la méthode renvoie 0.

L’implémentation de l’interface IFontMetrics existe pour toutes les classes de formats de police pris en charge et elle est accessible à l’aide de la propriété Metrics.

L’extrait suivant calcule la valeur de crénage pour les glyphes associés aux symboles « A » et « C » :

1    Font font; 
2
3    double kerning = font.Metrics.GetKerningValue(font.Encoding.UnicodeToGid('A'), font.Encoding.UnicodeToGid('C'));	

Comment obtenir des glyphes à partir d’une police ?

Tout glyphe dans une police est accessible via un identifiant de glyphe spécial. Cette règle est vraie pour n’importe quel format de police.

Les identifiants de glyphes GlyphId peuvent être de deux types : entier ou chaîne. Ces types de données GlyphId sont liés en conséquence à des caractéristiques de glyphe telles que l’index de glyphe et le nom de glyphe.

De plus, chaque glyphe possède un index égal à sa numérotation dans la police. Un point important est que la numérotation ne commence pas à 1 mais à 0, donc si une police contient 15 glyphes, elle aura les ID de glyphe 0 à 14.

Les glyphes ont généralement aussi des noms de glyphes qui sont de brèves étiquettes de texte ASCII sans espaces. Par exemple, le nom du glyphe du symbole « + » est « plus ».

Ainsi, le type de données « entier » correspond à une caractéristique du glyphe telle que l’index du glyphe, et le type de données « chaîne » correspond au nom du glyphe. Chaque glyphe d’une police représente l’image du symbole auquel ce glyphe est associé donc le glyphe est lié non seulement à son identifiant mais au code unique correspondant à ce symbole.

La relation entre les codes de caractères et les identifiants de glyphes est appelée codage. Les glyphes de la police sont accessibles directement par les identifiants de glyphes ou par encodage.

Dans ce dernier cas, l’identifiant du glyphe basé sur le code du caractère est calculé en premier. Puis le glyphe correspondant à l’identifiant calculé est reçu.

Quel type d’identifiant de glyphe faut-il utiliser pour accéder au glyphe souhaité ?

Cela dépend du format de la police. Les glyphes dans les polices de type 1 Font Format et Compact Font Format (CFF) sont accessibles par le nom du glyphe. En fait, les glyphes dans les polices de ces formats sont conservés sous forme de tableau et sont physiquement accessibles via un index numérique, mais au niveau logique supérieur pour obtenir un glyphe, son nom est utilisé.

Les polices TrueType utilisent le type entier pour les identifiants de glyphes. Si la police TrueType a une table « post », le nom du glyphe ou un identifiant de glyphe de type chaîne peut être utilisé pour accéder au glyphe.

Récupération de glyphes de la police à l’aide de la bibliothèque Aspose.Font.

La bibliothèque Aspose.Font introduit l’espace de noms Aspose.Font.Glyphs où sont placés les glyphes, les identifiants de glyphes et d’autres objets. La classe GlyphId est une classe abstraite de base pour les identifiants de glyphes. Les objets de cette classe sont utilisés pour obtenir les glyphes souhaités.

Les identifiants de glyphes pour les entiers et un type de chaîne sont représentés par les classes GlyphUInt32Id et GlyphStringId respectivement.

Ces deux classes sont héritées de la classe abstraite de base GlyphId et en particulier les objets de cette classe abstraite GlyphId sont passés dans la fonction de la bibliothèque pour accéder au glyphe nécessaire. Ainsi, pour obtenir le glyphe requis, vous créez un objet de type GlyphUInt32Id ou GlyphStringId, puis transmettez l’objet créé à l’une des fonctions conçues pour récupérer les glyphes.

Dans la plupart des cas, vous ne savez pas quel identifiant de glyphe correspond au caractère spécifique, donc pour obtenir l’identifiant de glyphe, vous devez trouver la relation entre le code de caractère et l’identifiant de glyphe.

Comme mentionné ci-dessus, le codage des polices est responsable de ces relations. La fonctionnalité de codage de police de base est définie par l’interface IFontEncoding.

L’interface de base IFont implémentée par toutes les classes de polices définit la propriété Encoding de type IFontEncoding, de sorte que tout objet de police créé par la bibliothèque Aspose.Font fournit une implémentation de la fonctionnalité IFontEncoding par le propriété Encodage.

Les méthodes suivantes ont été conçues pour calculer l’identifiant de glyphe pour un code de caractère : UnicodeToGid(), DecodeToGid et DecodeToGidParameterized :

Après avoir obtenu un identifiant de glyphe ou en d’autres termes une référence à l’objet GlyphId, vous pouvez obtenir le glyphe associé à ce GlyphId en utilisant la fonctionnalité définie par l’interface IGlyphAccessor.

L’interface IGlyphAccessor est implémentée par n’importe quelle classe, dérivée de la classe de base Font et elle est accessible par la propriété IFont.GlyphAccessor.

L’interface IGlyphAccessor définit la méthode GetGlyphById(). Utilisez cette méthode pour faire passer le glyphe de GlyphId.

L’exemple d’utilisation de la méthode GetGlyphById pour obtenir GlyphId et le glyphe correspondant est inclus dans l’exemple du chapitre La fonctionnalité fournie par l’objet Glyph.

Les 2 méthodes suivantes de cette interface sont conçues pour obtenir des identifiants de glyphes :

De plus, l’interface IGlyphAccessor définit la propriété GlyphIdType qui nous indique quel type de données, entier ou chaîne constitue un identifiant de glyphe.

La prise en charge de la récupération des glyphes est plus puissante pour les polices TrueType. Vous trouverez ici les informations sur la façon d’obtenir l’accès aux glyphes de polices.

Tous les exemples d’utilisation de Aspose.Font sont stockés dans la solution Aspose.Font.Examples.sln, dans les net-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.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.