Usando objetos glifos | Solução da API para C ++

Trabalhar com glifos é crucial ao codificar fontes, pois é a unidade deles. Quando as informações básicas sobre os glifos são explicadas no artigo do o que é o parágrafo da fonte, aqui vamos ensinar a você a funcionalidade do Aspose.Font para trabalhar com glifos e os objetosglifosem particular.

Objeto de glifos

Os glifos de qualquer fonte são representados por glyph digite na biblioteca Aspose.font. Portanto, * o tipo de glifo * é um objeto universal para glifos de fonte, independentemente do formato da fonte (TrueType, formato de fonte compacta, etc.).

A funcionalidade fornecida pelo objeto Glyph

Que funcionalidade esse objeto fornece para nós?

Esta pergunta é respondida pelas propriedades que possui.

Vamos ter um exemplo com o próximo trecho de código que mostra como calcular a largura do texto “Hello World” em pixels quando o tamanho da fonte é 10.

Adicione os próximos namespaces à frente do arquivo:

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

Então você precisa dar os próximos passos:

 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    }

Para obter a caixa delimitadora do glifo, use a propriedade glyphbbox do objeto glifo.

Para obter uma representação visual dos glifos, você precisa conhecer as coordenadas para todos os pontos dos glifos.

Como obter coordenadas para todos os pontos de glifos do objeto Glyph?

As próximas propriedades, isEmpty e caminho foram projetadas para este caso.

Propriedade isEmpty é auxiliar. Ele nos diz se o caminho do glifo está vazio ou, em outras palavras, o Glyph não tem instruções de desenho. Se tiver o valor false, é hora de construir toda a figura do glifo usando a propriedade muito útil caminho.

No conceito de Aspose.Font Library, a representação de qualquer glifo é dividida nos primitivos gráficos mais simples, chamados segmentos, e representados pela interface ipathsegment. Interface ipathsegment é um gráfico abstrato básico primitivo.

Os primitivos gráficos concretos são representados por tipos como moveto, lineto, curveto e ClosePath.

Tipo ClosePath é usado para indicar o final do contorno gráfico atual.

Tipos moveto, lineto e curveto por sua definição correspondem aos operadores de pós -escritos idênticos.

Além disso, os tipos moveto e lineto por sua definição correspondem às funções movetoEx () e lineto () de Windows gdi lib, type curveto é usado para descrever Bézier curvas.

Glyth PROPRIEDADE Path nos fornece uma coleção de todas as primitivas gráficas para esse glifo. Propriedade Path possui tipo segmentpath e todo objeto desse tipo possui propriedade segmentos do tipo pathsegmentCollection. Esta propriedade segmentos retorna todas as primitivas gráficas que objeto segmentpath inclui. Em outras palavras, podemos obter todas as primitivas gráficas para o glifo usando o Glyph.Path.segments de entrada.

O próximo Exemplo calcula todos os pontos que o Glyph possui e os armazena em variável Points, que representa uma matriz de objetos com o tipo Point.

A lógica usada por esta amostra é simples e não extrai contornos de glifos. Para obter esses contornos usando o Type ClosePath deve ser adicionado ao processamento dos segmentos.

Adicione os próximos namespaces à frente do arquivo:

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

Então você precisa dar os próximos passos:

 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}

Todos os exemplos de uso do Aspose.font são armazenados em Aspose.font.examples.cpp.sln Solution, no cpp-examples da documentação aspose.font

Se você tiver algum problema, poderá publicá -los na seção Aspose.font.product Family do fórum de suporte gratuito e dentro de poucas horas nossa equipe de suporte limpará tudo para você.

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.