Використання об'єктів Glyph | .NET

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

Об’єкт гліф

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

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

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

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

Цей приклад підсумовує величини просування гліфів тексту “Hello world” за розміру шрифту 10 без урахування парного кернінгу. Результат виражається в тих самих одиницях, що й розмір шрифту; якщо розмір указано в пікселях, ширина також буде в пікселях.

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

1    using Aspose.Font;
2    using Aspose.Font.Glyphs;

Перед виконанням фрагментів підготуйте завантажений об’єкт Aspose.Font.Font з іменем font. Тести завантажують TTF/LatoWeb-Regular.ttf з DataDir, який указує на tests-data/Aspose.Font у проєкті прикладів, за допомогою Font.Open, FontDefinition, FontType.TTF і FileSystemStreamSource. У своєму застосунку використовуйте власний каталог із файлами шрифтів. Ця підготовка завантаження перебуває поза фрагментами.

Наступний приклад зіставляє кожному символу Unicode його гліф через UnicodeToGid і підсумовує масштабовані величини просування. Для наданого шрифту Lato результат дорівнює 50.99:

 1// Calculate text width from glyph advances
 2
 3const string text = "Hello world";
 4const int fontSize = 10;
 5double width = 0;
 6
 7// Sum glyph advances at the requested size, without pair kerning.
 8foreach (char symbol in text)
 9{
10    GlyphId gid = font.Encoding.UnicodeToGid(symbol);
11    Glyph glyph = font.GetGlyphById(gid);
12    width += ((double)glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
13}

Щоб отримати обмежувальну рамку гліфа, використовуйте властивість 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.

Цей приклад збирає кінцеві точки сегментів шляху та керувальні точки Bézier у points — список об’єктів типу Point. Під час приведення до int дробова частина координат відкидається.

Приклад не групує точки за контурами й не обробляє ClosePath. Для відновлення контурів потрібно відстежувати їхні межі та обробляти ClosePath.

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

1    using System.Collections.Generic;
2    using Aspose.Font.Glyphs;
3    using Aspose.Font.RenderingPath;
4    using Point = System.Drawing.Point;

Перед виконанням фрагмента отримайте із завантаженого шрифту непорожній Glyph з іменем glyph, наприклад через font.GetGlyphById(font.Encoding.UnicodeToGid('S')). У тестах використовуються гліфи A і S. Вибір і перевірка гліфа перебувають поза фрагментом.

 1// Collect integer coordinates from a glyph path
 2
 3List<Point> points = new List<Point>();
 4IPathSegment? prevSegment = null;
 5
 6// Collect endpoints and Bezier control points without grouping contours.
 7foreach (IPathSegment segment in glyph.Path.Segments)
 8{
 9    if (segment is LineTo || segment is CurveTo)
10    {
11        if (prevSegment is MoveTo moveTo)
12        {
13            AddPoint((int)moveTo.X, (int)moveTo.Y, points);
14        }
15        if (segment is LineTo line)
16        {
17            AddPoint((int)line.X, (int)line.Y, points);
18        }
19        else if (segment is CurveTo curve)
20        {
21            AddPoint((int)curve.X1, (int)curve.Y1, points);
22            AddPoint((int)curve.X2, (int)curve.Y2, points);
23            AddPoint((int)curve.X3, (int)curve.Y3, points);
24        }
25    }
26    prevSegment = segment;
27}
28
29void AddPoint(int x, int y, List<Point> target)
30{
31    target.Add(new Point(x, y));
32}

Як розрахувати значення кернінгу для гліфів?

Інша метрика гліфа, але не надається об’єктом типу гліфа. Тут ми говоримо про кернінг. Така характеристика, як кернінг, відноситься не до одного, а до пари гліфів. Тому для розрахунку кернінгу потрібно використовувати ідентифікатор не одного, а двох гліфів.

Інтерфейс IFontMetrics у бібліотеці Aspose.Font визначає метод GetKerningValue(), який приймає ідентифікатори гліфів для пари гліфів і повертає значення кернінгу, пов’язане з цією парою. Якщо для пари гліфів не існує інформації про кернінг, метод повертає 0. Реалізація інтерфейсу IFontMetrics існує для всіх класів підтримуваних форматів шрифтів і доступна за допомогою властивості Metrics.

Наступний фрагмент використовує той самий завантажений font і отримує значення кернінгу для гліфів символів A і C. У наданому шрифті Lato для цієї пари немає коригування, тому результат дорівнює 0:

1// Get kerning for the glyphs associated with A and C
2
3double kerning = font.Metrics.GetKerningValue(
4    font.Encoding.UnicodeToGid('A'), font.Encoding.UnicodeToGid('C'));

Як отримати гліфи зі шрифту?

Будь-який гліф у шрифті можна отримати за допомогою спеціального ідентифікатора гліфа. Це правило справедливо для будь-якого формату шрифту.

Ідентифікатори гліфів GlyphId можуть бути двох типів: цілими чи рядковими. Ці типи даних GlyphId пов’язані з такими характеристиками гліфа, як індекс гліфа та назва гліфа відповідно.

Крім того, кожен гліф має індекс, що дорівнює його нумерації в шрифті. Важливим моментом є те, що нумерація починається не з 1, а з 0, тому якщо шрифт містить 15 гліфів, вони мають ідентифікатори гліфів 0–14.

Зазвичай гліфи також мають назви гліфів, які є короткими текстовими мітками ASCII без пробілів. Наприклад, назва гліфа для символу «+» — «плюс».

Так, тип даних integer відповідає такій характеристиці гліфа, як індекс гліфа, а тип даних string — назві гліфа. Кожен гліф шрифту представляє зображення символу, з яким цей гліф пов’язаний, тому гліф пов’язаний не лише з ідентифікатором, але й з унікальним кодом, що відповідає цьому символу.

Зв’язок між кодами символів і ідентифікаторами гліфів називається кодуванням. Доступ до гліфів у шрифті можна отримати безпосередньо за допомогою ідентифікаторів гліфів або за допомогою кодування.

В останньому випадку спочатку обчислюється ідентифікатор гліфа на основі коду символу. Потім отримується гліф, що відповідає обчисленому ідентифікатору.

Який тип ідентифікатора гліфа слід використовувати для доступу до потрібного гліфа?

Це залежить від формату шрифту.

Гліфи у шрифтах Type 1 Font Format і Compact Font Format (CFF) доступні за назвою гліфа. Насправді гліфи у шрифтах цих форматів зберігаються як масив і фізично доступні через числовий індекс, але на вищому логічному рівні для отримання гліфа використовується його ім’я.

Шрифти TrueType використовують цілочисельний тип для ідентифікаторів гліфів. Якщо шрифт TrueType має таблицю «post», для доступу до гліфа можна використовувати назву гліфа або ідентифікатор гліфа рядкового типу.

Отримання гліфів зі шрифту за допомогою бібліотеки Aspose.Font.

Бібліотека Aspose.Font представляє простір імен Aspose.Font.Glyphs, де розміщуються гліфи, ідентифікатори гліфів та інші об’єкти.

Клас GlyphId є базовим абстрактним класом для ідентифікаторів гліфів. Об’єкти цього класу використовуються для отримання бажаних гліфів.

Ідентифікатори гліфів для цілих чисел і типів рядків представлені класами GlyphUInt32Id і GlyphStringId відповідно.

Обидва ці класи успадковуються від базового абстрактного класу GlyphId, і, зокрема, об’єкти цього абстрактного класу GlyphId передаються у функції бібліотеки для доступу до необхідного гліфа. Щоб отримати потрібний гліф, ви створюєте об’єкт типу GlyphUInt32Id або GlyphStringId, а потім передаєте створений об’єкт одній із функцій, призначених для отримання гліфів.

У більшості випадків ви не знаєте, який ідентифікатор гліфа відповідає певному символу, тому, щоб отримати ідентифікатор гліфа, вам потрібно знайти зв’язок між кодом символу та ідентифікатором гліфа.

Як було сказано вище, за такі зв’язки відповідає кодування шрифту. Функціональність базового кодування шрифту визначається інтерфейсом IFontEncoding.

Базовий інтерфейс IFont, реалізований усіма класами шрифтів, визначає властивість Encoding типу IFontEncoding, тому будь-який об’єкт шрифту, створений бібліотекою Aspose.Font, забезпечує реалізацію функції IFontEncoding за допомогою властивість Кодування.

Наступні методи були розроблені для обчислення ідентифікатора гліфа для коду символу: UnicodeToGid(), DecodeToGid і DecodeToGidParameterized:

Після отримання ідентифікатора гліфа або, іншими словами, посилання на об’єкт GlyphId, ви можете отримати гліф, пов’язаний із цим GlyphId, використовуючи функції, визначені інтерфейсом IGlyphAccessor.

Інтерфейс IGlyphAccessor реалізується будь-яким класом, похідним від базового класу Font і доступним за допомогою властивості IFont.GlyphAccessor.

Інтерфейс IGlyphAccessor визначає метод GetGlyphById(). Використовуйте цей метод, щоб передати гліф для GlyphId.

Приклад того, як використовувати метод GetGlyphById для отримання GlyphId і відповідного гліфа, включено до прикладу з розділу Функціональні можливості, надані об’єктом Glyph.

Наступні 2 методи цього інтерфейсу призначені для отримання ідентифікаторів гліфів:

Також інтерфейс IGlyphAccessor визначає властивість GlyphIdType, яка повідомляє нам, який тип даних, ціле число чи рядок має ідентифікатор гліфа.

Підтримка отримання гліфів є більш потужною для шрифтів TrueType. Тут ви можете знайти інформацію про те, як отримати доступ до гліфів шрифтів.

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

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