Використання об'єктів Glyph | Рішення API для C++

Робота з гліфами має вирішальне значення при кодуванні шрифтів, оскільки це їх одиниця. Коли основна інформація про гліфи пояснюється в статті Що таке абзац шрифту, тут ми навчимо вас функціональності Aspose.Font для роботи з гліфами та зокрема об’єкти Glyph.

Об’єкт гліф

Гліфи будь-якого шрифту представлені типом Glyph у бібліотеці Aspose.Font. Отже, тип Glyph є універсальним об’єктом для гліфів шрифту, незалежно від формату шрифту (TrueType, Compact Font Format тощо).

Функціональність, яку забезпечує об’єкт Glyph

Яку функціональність надає нам цей об’єкт?

На це питання відповідають властивості, якими він володіє.

Розглянемо приклад із наступним фрагментом коду, який показує, як обчислити ширину тексту «Hello world» у пікселях, коли розмір шрифту становить 10.

Додайте наступні простори імен у заголовок файлу:

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

Тоді потрібно зробити наступні кроки:

 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    }

Щоб отримати обмежувальну рамку гліфа, використовуйте властивість GlyphBBox об’єкта Glyph.

Щоб отримати візуальне представлення гліфів, вам потрібно знати координати всіх точок гліфів.

Як отримати координати для всіх точок гліфа з об’єкта Glyph?

Наступні властивості, IsEmpty і Path були розроблені для цього випадку.

Властивість IsEmpty є допоміжною. Він повідомляє нам, чи шлях гліфа порожній, або, іншими словами, гліф взагалі не має інструкцій для малювання. Якщо він має значення false, настав час побудувати всю фігуру гліфа за допомогою дуже корисної властивості Path.

У концепції бібліотеки Aspose.Font представлення будь-якого гліфа розділено на найпростіші графічні примітиви, які називаються сегментами, і представлені інтерфейсом IPathSegment.

Інтерфейс IPathSegment — базовий абстрактний графічний примітив.

Конкретні графічні примітиви представлені такими типами, як MoveTo, LineTo, CurveTo і ClosePath.

Тип ClosePath використовується для позначення кінця поточного графічного контуру.

Типи MoveTo, LineTo і CurveTo за своїм визначенням відповідають ідентичним операторам postscript.

Крім того, типи MoveTo і LineTo за своїм визначенням відповідають функціям MoveToEx() і LineTo() з Windows GDI lib, тип CurveTo використовується для опису кривих Безьє.

Властивість Glyph Path надає нам колекцію всіх графічних примітивів для цього гліфа. Властивість Path має тип SegmentPath, а кожен об’єкт цього типу має властивість Segments типу PathSegmentCollection. Ця властивість Segments повертає всі графічні примітиви, які містить об’єкт SegmentPath. Іншими словами, ми можемо отримати всі графічні примітиви для гліфа за допомогою запису glyph.Path.Segments.

Наступний приклад обчислює всі точки, які має гліф, і зберігає їх у змінній points, яка представляє масив об’єктів типу Point.

Логіка, використана в цьому зразку, проста, і вона не виділяє контури гліфів. Щоб отримати ці контури за допомогою типу ClosePath, потрібно додати до обробки сегментів.

Додайте наступні простори імен у заголовок файлу:

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

Тоді потрібно зробити наступні кроки:

 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}

Усі приклади використання Aspose.Font зберігаються в [рішенні Aspose.Font.Examples.CPP.sln]( https://github.com/aspose-font/Aspose.Font-Documentation/tree/master/cpp -examples), у cpp-examples Aspose.Font Documentation

Якщо у вас виникли проблеми, ви можете опублікувати їх у розділі Aspose.Font.Product Family Безкоштовного форуму підтримки, і протягом кількох годин наша служба підтримки все вирішить. для вас.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.