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.
- Primeiro, vejamos a propriedade estado. Algumas das fontes podem ser corrompidas e seus glifos também podem ser corrompidos. Propriedade * Estado * nos diz se o glifo está corrompido. Se tiver o valor parsedWithErrors, esse glifo foi analisado com erros, e nem todos os dados do glifo foram recebidos.
- Propriedades widthVectorx e esquerda de bonde Conte -nos sobre tais métricas de glifos como largura de avanço e rolamento do lado esquerdo correspondentemente.
- As propriedades WidthVectory e à esquerda têm o mesmo sentido quewidthvectorxeesquerda de mão-de-esquerda, maslarguraeesquerdaestão relacionados às coordenadas para o eixo y vertical.
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ê.