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.
- Innanzitutto, diamo un’occhiata alla proprietà stato. Alcuni caratteri possono essere corrotti e anche i loro glifi possono essere corrotti. Proprietà State ci dice se il glifo è corrotto. Se ha il valore ParsedWithErrors, allora quel glifo è stato analizzato con errori e non tutti i dati del glifo sono stati ricevuti.
- Proprietà widthvectorx e LeftSidebearingX ci raccontano di tali metriche di glifi come larghezza avanzata e cuscinetto del lato sinistro di conseguenza.
- Proprietà WidthVectorY e LeftSidebearingY hanno lo stesso senso diwidthvectorxeLeftSidebearingX, ma WidthVectorY e LeftSidebearingY correlate a coordinate per l’asse Y verticale.
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.
- Glyph* Proprietà* Path* ci fornisce una raccolta di tutti i primitivi grafici per quel glifo. ProprietàPathha tipo SegmentPath e ogni oggetto di questo tipo ha proprietà Segments di tipo PathSegmentCollection. Questa proprietà Segments restituisce tutti i primitivi grafici che oggetto SegmentPath include. In altre parole, possiamo ottenere tutte le primitive grafiche per il glifo usando il glifo.Path.Path.Path.
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.