Usando objetos Glyph en la biblioteca Aspose.Font | .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. .
El ejemplo suma los avances de los glifos del texto “Hello world” con un tamaño de fuente de 10, sin kerning entre pares. El resultado utiliza las mismas unidades que el tamaño de fuente; será un ancho en píxeles si el tamaño se especifica en píxeles.
Agregue los siguientes espacios de nombres al principio del archivo:
1 using Aspose.Font;
2 using Aspose.Font.Glyphs;Antes de ejecutar los fragmentos, proporcione un objeto Aspose.Font.Font cargado llamado font. Las pruebas cargan TTF/LatoWeb-Regular.ttf desde DataDir, que apunta a tests-data/Aspose.Font en el proyecto de ejemplos, mediante Font.Open con una FontDefinition, FontType.TTF y un FileSystemStreamSource. En su aplicación, utilice su propio directorio de datos de fuentes. Esta preparación de carga queda fuera de los fragmentos.
El siguiente ejemplo asigna cada carácter Unicode a su glifo mediante UnicodeToGid y suma los avances escalados. Para la fuente Lato incluida, el resultado es 50.99:
1// Calculate text width from glyph advances
2
3const string text = "Hello world";
4const int fontSize = 10;
5double width = 0;
6
7// Sum glyph advances at the requested size, without pair kerning.
8foreach (char symbol in text)
9{
10 GlyphId gid = font.Encoding.UnicodeToGid(symbol);
11 Glyph glyph = font.GetGlyphById(gid);
12 width += ((double)glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
13}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
ejemplo recopila los extremos de los segmentos de la ruta y los puntos de control Bézier en points, una lista de objetos de tipo
Punto. Las conversiones a int truncan las coordenadas fraccionarias.
Este ejemplo no agrupa los puntos en contornos ni procesa ClosePath. Para reconstruir los contornos, debe seguir sus límites y procesar también ClosePath.
Agregue los siguientes espacios de nombres al principio del archivo:
1 using System.Collections.Generic;
2 using Aspose.Font.Glyphs;
3 using Aspose.Font.RenderingPath;
4 using Point = System.Drawing.Point;Antes de ejecutar este fragmento, obtenga un Glyph no vacío llamado glyph de la fuente cargada, por ejemplo con font.GetGlyphById(font.Encoding.UnicodeToGid('S')). Las pruebas utilizan los glifos de A y S. La selección y validación del glifo quedan fuera del fragmento.
1// Collect integer coordinates from a glyph path
2
3List<Point> points = new List<Point>();
4IPathSegment? prevSegment = null;
5
6// Collect endpoints and Bezier control points without grouping contours.
7foreach (IPathSegment segment in glyph.Path.Segments)
8{
9 if (segment is LineTo || segment is CurveTo)
10 {
11 if (prevSegment is MoveTo moveTo)
12 {
13 AddPoint((int)moveTo.X, (int)moveTo.Y, points);
14 }
15 if (segment is LineTo line)
16 {
17 AddPoint((int)line.X, (int)line.Y, points);
18 }
19 else if (segment is CurveTo curve)
20 {
21 AddPoint((int)curve.X1, (int)curve.Y1, points);
22 AddPoint((int)curve.X2, (int)curve.Y2, points);
23 AddPoint((int)curve.X3, (int)curve.Y3, points);
24 }
25 }
26 prevSegment = segment;
27}
28
29void AddPoint(int x, int y, List<Point> target)
30{
31 target.Add(new Point(x, y));
32}¿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.
Con el mismo font cargado, el siguiente fragmento obtiene el valor de kerning para los glifos asociados a A y C. En la fuente Lato incluida, este par no tiene ajuste y el resultado es 0:
1// Get kerning for the glyphs associated with A and C
2
3double kerning = font.Metrics.GetKerningValue(
4 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.