Utilizzo di oggetti Glyph | Soluzione API per C ++

Lavorare con glifi è cruciale durante la codifica dei caratteri in quanto è la loro unità. Quando le informazioni di base sui glifi sono spiegate nell’articolo Articolo del What is Font Paragraph, qui ti insegneremo la funzionalità di Aspose.Font per aver lavorato con glifi e gli oggettiGlyphin particolare.

Oggetto Glyph

Glifi di qualsiasi carattere sono rappresentati da glifo digitare in libreria Asposa. Font. Quindi, il tipo Glyph è un oggetto universale per glifi del carattere, indipendentemente dal formato di caratteri (truetype, formato di carattere compatto, ecc.).

La funzionalità fornita dall’oggetto glifo

Quale funzionalità ci fornisce questo oggetto?

Questa domanda viene data risposta dalle proprietà che ha.

Facciamo un Esempio con lo snippet di codice successivo che mostra come calcolare la larghezza per il testo “Hello World” nei pixel quando la dimensione del carattere è 10.

Aggiungi gli spazi dei nomi successivi alla testa del file:

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

Quindi devi fare i passi successivi:

 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    }

Per ottenere la casella di delimitazione del glifo utilizzare la proprietà glyphbbox dell’oggetto glyph.

Per ottenere una rappresentazione visiva dei glifi devi conoscere le coordinate per tutti i punti glifi.

Come ottenere coordinate per tutti i punti glifi dall’oggetto glifo?

Le prossime proprietà, isEmpty e Path sono state progettate per questo caso.

Proprietà isEmpty è ausiliario. Ci dice se il percorso del glifo è vuoto o in altre parole il glifo non ha alcuna istruzione di disegno. Se ha il valore *falso *, è tempo di costruire la figura del glifo intero usando la proprietà molto utile percorso.

Nel concetto di Aspose.Font Library la rappresentazione di qualsiasi glifo è divisa in primitive grafiche più semplici, chiamateSegments, e rappresentata dall’interfaccia ipathsegment. Interfaccia IpathSegment è una primitiva grafica astratta di base.

I primitivi grafici in cemento sono rappresentati da tipi come moveto, lineto, Curveto e ClosePath.

Tipo ClosePath viene utilizzato per indicare la fine del contorno grafico corrente.

Tipi Moveto, LineTo e CurveTo per la loro definizione corrispondono agli identici operatori PostScript.

Inoltre, i tipi MoveTo e LineTo per la loro definizione corrispondono alle funzioni MoveToEx() e LineTo() da Windows gdi lib, tipo CurveTo è usato per descrivere le curve Bézier.

Il prossimo Esempio calcola tutti i punti che il glifo ha e li memorizza in “punti” variabili, che rappresenta un array di oggetti con tipo punto.

La logica utilizzata da questo campione è semplice e non estrae contorni glifi. Per ottenere questi contorni usando il tipo ClosePath deve essere aggiunto all’elaborazione dei segmenti.

Aggiungi gli spazi dei nomi successivi alla testa del file:

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

Quindi devi fare i passi successivi:

 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}

Tutti gli esempi di utilizzo di Aspose.Font sono archiviati in aspose.font.examples.cpp.sln Solution, nella CPP-Examples della documentazione Aspose.Font

In caso di problemi, puoi pubblicarli nella sezione aspose.font.product del Forum di supporto gratuito e entro poche ore il nostro team di supporto chiarirà tutto per te.

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.