Usando objetos Glifo | Solución API para .NET
Trabajar con glifos es crucial al codificar fuentes, ya que es su unidad. Cuando la información básica sobre los glifos se explica en el artículo del Qué es el párrafo de fuente, aquí le enseñaremos la funcionalidad de Aspose.Font para trabajar con glifos y los objetos Glifo en particular.
Objeto glifo
Los glifos de cualquier fuente se representan mediante el tipo Glyph en la biblioteca Aspose.Font. Por lo tanto, el tipo Glifo es un objeto universal para los glifos de fuentes, independientemente del formato de fuente (TrueType, formato de fuente compacto, etc.).
La funcionalidad proporcionada por el objeto Glyph.
¿Qué funcionalidad nos proporciona este objeto?
Esta pregunta se responde por las propiedades que tiene.
- Primero, veamos la propiedad Estado. Algunas de las fuentes pueden estar dañadas y sus glifos también pueden estar dañados. La propiedad Estado nos dice si el glifo está dañado. Si tiene el valor ParsedWithErrors, entonces ese glifo se analizó con errores y no se recibieron todos los datos del glifo.
- Las propiedades WidthVectorX y LeftSidebearingX nos informan sobre glifos métricos como el ancho de avance y el rumbo del lado izquierdo correspondientemente.
- Las propiedades WidthVectorY y LeftSidebearingY tienen el mismo sentido que WidthVectorX y LeftSidebearingX, pero WidthVectorY y LeftSidebearingY están relacionadas con las coordenadas del eje Y vertical. .
Tengamos un ejemplo con el siguiente fragmento de código que muestra cómo calcular el ancho del texto “Hola mundo” en píxeles cuando el tamaño de fuente es 10.
Agregue los siguientes espacios de nombres al principio del archivo:
1using Aspose.Font.Glyphs;
2using Aspose.Font.Font font;
Entonces debes seguir los siguientes pasos:
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 }
Para obtener el cuadro delimitador del glifo, utilice la propiedad GlyphBBox del objeto Glyph.
Para obtener una representación visual de los glifos, necesita conocer las coordenadas de todos los puntos de los glifos.
¿Cómo obtener coordenadas para todos los puntos de glifo del objeto Glifo?
Las siguientes propiedades, IsEmpty y Path fueron diseñadas para este caso.
La propiedad IsEmpty es auxiliar. Nos dice si el camino del glifo está vacío o, en otras palabras, el glifo no tiene ninguna instrucción de dibujo. Si tiene el valor falso, es hora de construir la figura completa del glifo usando la muy útil propiedad Path.
En el concepto de la biblioteca Aspose.Font, la representación de cualquier glifo se divide en las primitivas gráficas más simples, llamadas segmentos, y representadas por la interfaz IPathSegment.
La interfaz IPathSegment es una primitiva gráfica abstracta básica.
Las primitivas gráficas concretas están representadas por tipos como MoveTo, LineTo, CurveTo y ClosePath.
El tipo ClosePath se utiliza para indicar el final del contorno gráfico actual.
Los tipos MoveTo, LineTo y CurveTo por su definición corresponden con los operadores postscript idénticos.
Además, los tipos MoveTo y LineTo por su definición corresponden a las funciones MoveToEx()
y LineTo()
de la biblioteca GDI de Windows, el tipo CurveTo se usa para describir curvas Bézier.
La propiedad Glyph Path nos proporciona una colección de todas las primitivas gráficas para ese glifo. La propiedad Path tiene el tipo SegmentPath y cada objeto de este tipo tiene la propiedad Segments de tipo PathSegmentCollection. Esta propiedad Segmentos devuelve todas las primitivas gráficas que incluye el objeto SegmentPath. En otras palabras, podemos obtener todas las primitivas gráficas del glifo usando la entrada glifo.Path.Segments.
El siguiente
ejemplo calcula todos los puntos que tiene el glifo y los almacena en puntos
variables, que representan una matriz de objetos con tipo
Punto.
La lógica utilizada por este ejemplo es simple y no extrae contornos de glifos. Para obtener estos contornos, se debe agregar el tipo ClosePath al procesamiento de segmentos.
Agregue los siguientes espacios de nombres al principio del archivo:
1using System.Collections.Generic;
2using System.Drawing;
3using Aspose.Font.Glyphs;
4using Aspose.Font.RenderingPath;
Entonces debes seguir los siguientes pasos:
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 }
¿Cómo calcular el valor de kerning para glifos?
Otra métrica de Glifo pero que no la proporciona el objeto tipo Glifo. Aquí estamos hablando de kerning. Una característica como el interletraje se aplica no a uno sino a un par de glifos. Entonces, para calcular el kerning necesitas usar el identificador no de uno sino de dos glifos.
La interfaz IFontMetrics en la biblioteca Aspose.Font define el método GetKerningValue() que toma identificadores de glifos para un par de glifos y devuelve un valor de interletraje, relacionado con ese par. Si no existe información de interletraje para el par de glifos, el método devuelve 0. La implementación de la interfaz IFontMetrics existe para todas las clases de formatos de fuente admitidos y se puede acceder a ella mediante la propiedad Metrics.
El siguiente fragmento calcula el valor de interletraje para los glifos asociados con los símbolos ‘A’ y ‘C’:
1 Font font;
2
3 double kerning = font.Metrics.GetKerningValue(font.Encoding.UnicodeToGid('A'), font.Encoding.UnicodeToGid('C'));
¿Cómo obtener glifos de la fuente?
Se puede acceder a cualquier glifo de una fuente mediante un identificador de glifo especial. Esta regla es válida para cualquier formato de fuente.
Los identificadores de glifos GlyphId pueden ser de dos tipos: enteros o de cadena. Estos tipos de datos GlyphId están vinculados con características de glifo como el índice de glifo y el nombre de glifo correspondientemente.
Además, cada glifo tiene un índice igual a su numeración en la fuente. Un punto importante es que la numeración no comienza desde 1 sino desde 0, por lo que si una fuente contiene 15 glifos, tendrán ID de glifo del 0 al 14.
Los glifos normalmente también tienen nombres de glifos que son breves etiquetas de texto ASCII sin espacios. Por ejemplo, el nombre del glifo del símbolo “+” es “más”.
Entonces, el tipo de datos “entero” corresponde con una característica del glifo como el índice de glifo, y el tipo de datos “cadena” corresponde con el nombre del glifo. Cada glifo de una fuente representa la imagen del símbolo al que está asociado ese glifo, por lo que el glifo está vinculado no sólo a su identificador sino al código único correspondiente a este símbolo.
La relación entre códigos de caracteres e identificadores de glifos se llama codificación. Se puede acceder a los glifos de la fuente directamente mediante identificadores de glifos o mediante codificación.
En el último caso, primero se calcula el identificador de glifo basado en el código de carácter. Luego se recibe el glifo correspondiente al identificador calculado.
¿Qué tipo de identificador de glifo se debe utilizar para acceder al glifo deseado?
Depende del formato de la fuente. Se puede acceder a los glifos en fuentes de formato de fuente tipo 1 y formato de fuente compacto (CFF) mediante el nombre del glifo. En realidad, los glifos en fuentes de estos formatos se mantienen como una matriz y son físicamente accesibles mediante un índice numérico, pero en el nivel lógico superior para obtener un glifo se utiliza su nombre.
Las fuentes TrueType utilizan tipos enteros para los identificadores de glifos. Si la fuente TrueType tiene una tabla ‘post’, se puede utilizar el nombre del glifo o un identificador de glifo de tipo cadena para acceder al glifo.
Recuperar glifos de una fuente usando la biblioteca Aspose.Font.
La biblioteca Aspose.Font introduce el espacio de nombres Aspose.Font.Glyphs donde se colocan glifos, identificadores de glifos y otros objetos. La clase GlyphId es una clase abstracta base para identificadores de glifos. Los objetos de esa clase se utilizan para obtener los glifos deseados.
Los identificadores de glifos para números enteros y un tipo de cadena están representados por las clases GlyphUInt32Id y GlyphStringId respectivamente.
Ambas clases se heredan de la clase abstracta base GlyphId y particularmente los objetos de esta clase abstracta GlyphId se pasan en la función de la biblioteca para acceder al glifo necesario. Entonces, para obtener el glifo requerido, crea un objeto de tipo GlyphUInt32Id o GlyphStringId y luego pasa el objeto creado a una de las funciones diseñadas para recuperar glifos.
En la mayoría de los casos, no se sabe qué identificador de glifo corresponde al carácter específico, por lo que para obtener el identificador de glifo es necesario encontrar la relación entre el código de carácter y el identificador de glifo.
Como se mencionó anteriormente, la codificación de fuentes es responsable de dichas relaciones. La funcionalidad de codificación de fuentes base está definida por la interfaz IFontEncoding.
La interfaz base IFont implementada por todas las clases de fuentes define la propiedad Encoding del tipo IFontEncoding, por lo que cualquier objeto de fuente creado por la biblioteca Aspose.Font proporciona implementación para la funcionalidad IFontEncoding por parte de propiedad Codificación.
Se diseñaron los siguientes métodos para calcular el identificador de glifo para un código de carácter: UnicodeToGid(), DecodeToGid y DecodeToGidParameterized:
- Utilice el método UnicodeToGid() si su código de carácter es Unicode.
- Si el código de tu carácter no es Unicode, utiliza el método DecodeToGid().
- El método DecodeToGidParameterized() está diseñado para casos compuestos cuando se necesitan parámetros especiales para calcular identificadores de glifos.
Después de obtener un identificador de glifo o, en otras palabras, una referencia al objeto GlyphId, puede obtener el glifo asociado con este GlyphId usando la funcionalidad, definida por la interfaz IGlyphAccessor.
La interfaz IGlyphAccessor es implementada por cualquier clase, derivada de la clase base Font y es accesible mediante la propiedad IFont.GlyphAccessor.
La interfaz IGlyphAccessor define el método GetGlyphById(). Utilice este método para pasar el glifo de GlyphId.
El ejemplo de cómo utilizar el método GetGlyphById para obtener GlyphId y el glifo correspondiente se incluye en el ejemplo del capítulo La funcionalidad proporcionada por el objeto Glyph.
Los siguientes 2 métodos de esta interfaz están diseñados para obtener identificadores de glifos:
- Si necesita obtener un identificador de glifo para cada carácter en alguna cadena de texto, puede usar el método GetGlyphsForText().
- El método GetAllGlyphIds() está diseñado para obtener todos los identificadores de glifos disponibles en la fuente.
Además, la interfaz IGlyphAccessor define la propiedad GlyphIdType que nos dice qué tipo de datos, entero o cadena es un identificador de glifo.
La compatibilidad con la recuperación de glifos es más potente para las fuentes TrueType. Aquí puede encontrar información sobre cómo obtener acceso a glifos de fuentes.
Todos los ejemplos de uso de Aspose.Font se almacenan en la solución Aspose.Font.Examples.sln, en los net-examples de la Documentación de Aspose.Font
Si tiene algún problema, puede publicarlo en la sección Aspose.Font.Product Family del Foro de soporte gratuito y dentro de unas horas nuestro equipo de soporte aclarará todo. para ti.