Використання об'єктів Glyph | Рішення API для .NET
Робота з гліфами має вирішальне значення при кодуванні шрифтів, оскільки це їх одиниця. Коли основна інформація про гліфи пояснюється в статті Що таке абзац шрифту, тут ми навчимо вас функціональності Aspose.Font для роботи з гліфами та зокрема об’єкти Glyph.
Об’єкт гліф
Гліфи будь-якого шрифту представлені типом Glyph у бібліотеці Aspose.Font. Отже, тип Glyph є універсальним об’єктом для гліфів шрифту, незалежно від формату шрифту (TrueType, Compact Font Format тощо).
Функціональність, яку забезпечує об’єкт Glyph
Яку функціональність надає нам цей об’єкт?
На це питання відповідають властивості, якими він володіє.
- Спочатку давайте розглянемо властивість State. Деякі шрифти можуть бути пошкоджені, а також їхні гліфи. Властивість State повідомляє нам, чи пошкоджений гліф. Якщо він має значення ParsedWithErrors, це означає, що цей гліф було проаналізовано з помилками, і отримано не всі дані гліфа.
- Властивості WidthVectorX і LeftSidebearingX повідомляють нам про такі метрики гліфа, як передова ширина та лівий бік відповідно.
- Властивості WidthVectorY і LeftSidebearingY мають той самий сенс, що і WidthVectorX і LeftSidebearingX, але WidthVectorY і LeftSidebearingY пов’язані з координатами для вертикальної осі Y .
Розглянемо приклад із наступним фрагментом коду, який показує, як обчислити ширину тексту «Hello world» у пікселях, коли розмір шрифту становить 10.
Додайте наступні простори імен у заголовок файлу:
1using Aspose.Font.Glyphs;
2using Aspose.Font.Font font;
Тоді потрібно зробити наступні кроки:
1 Aspose.Font.Font font;
2
3 // Declare text and other constants
4 const string text = "Hello world";
5 const int fontSize = 10;
6
7 //Declare a variable for string width
8 double width = 0;
9
10 //Get glyphs for each letter in the text and calculate the width for the whole text
11 //The same result can be achieved using the method font.Metrics.MeasureString (text, fontSize)
12 foreach (char symbol in text)
13 {
14 GlyphId gid = font.Encoding.DecodeToGid(symbol);
15 Glyph glyph = font.GetGlyphById(gid);
16 width += (glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
17 }
Щоб отримати обмежувальну рамку гліфа, використовуйте властивість 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 Glyph glyph;
2
3 //Declare resultant list with points
4 List<Point> points = new List<Point>();
5
6 //Init service reference on IPathSegment
7 IPathSegment prevSegment = null;
8
9 //Iterate all glyph path segments and collect points
10 foreach (IPathSegment segment in glyph.Path.Segments)
11 {
12 if ((segment is LineTo)
13 || (segment is CurveTo))
14 {
15 if (prevSegment is MoveTo)
16 {
17 MoveTo moveTo = prevSegment as MoveTo;
18 AddPoint((int)moveTo.X, (int)moveTo.Y, points);
19 }
20 if (segment is LineTo)
21 {
22 LineTo line = segment as LineTo;
23 AddPoint((int)line.X, (int)line.Y, points);
24 }
25 else if (segment is CurveTo)
26 {
27 CurveTo curve = segment as CurveTo;
28 AddPoint((int)curve.X1, (int)curve.Y1, points);
29 AddPoint((int)curve.X2, (int)curve.Y2, points);
30 AddPoint((int)curve.X3, (int)curve.Y3, points);
31 }
32 }
33 prevSegment = segment;
34 }
35
36 void AddPoint(int x, int y, List<Point> points)
37 {
38 Point p = new Point();
39 p.X = x;
40 p.Y = y;
41 points.Add(p);
42 }
Як розрахувати значення кернінгу для гліфів?
Інша метрика гліфа, але не надається об’єктом типу гліфа. Тут ми говоримо про кернінг. Така характеристика, як кернінг, відноситься не до одного, а до пари гліфів. Тому для розрахунку кернінгу потрібно використовувати ідентифікатор не одного, а двох гліфів.
Інтерфейс IFontMetrics у бібліотеці Aspose.Font визначає метод GetKerningValue(), який приймає ідентифікатори гліфів для пари гліфів і повертає значення кернінгу, пов’язане з цією парою. Якщо для пари гліфів не існує інформації про кернінг, метод повертає 0. Реалізація інтерфейсу IFontMetrics існує для всіх класів підтримуваних форматів шрифтів і доступна за допомогою властивості Metrics.
Наступний фрагмент обчислює значення кернінгу для гліфів, пов’язаних із символами «A» і «C»:
1 Font font;
2
3 double kerning = font.Metrics.GetKerningValue(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:
- Використовуйте метод UnicodeToGid(), якщо ваш код символу є Unicode.
- Якщо ваш код символу не є Unicode, використовуйте метод DecodeToGid().
- Метод DecodeToGidParameterized() призначений для складних випадків, коли потрібні спеціальні параметри для обчислення ідентифікаторів гліфів.
Після отримання ідентифікатора гліфа або, іншими словами, посилання на об’єкт GlyphId, ви можете отримати гліф, пов’язаний із цим GlyphId, використовуючи функції, визначені інтерфейсом IGlyphAccessor.
Інтерфейс IGlyphAccessor реалізується будь-яким класом, похідним від базового класу Font і доступним за допомогою властивості IFont.GlyphAccessor.
Інтерфейс IGlyphAccessor визначає метод GetGlyphById(). Використовуйте цей метод, щоб передати гліф для GlyphId.
Приклад того, як використовувати метод GetGlyphById для отримання GlyphId і відповідного гліфа, включено до прикладу з розділу Функціональні можливості, надані об’єктом Glyph.
Наступні 2 методи цього інтерфейсу призначені для отримання ідентифікаторів гліфів:
- Якщо вам потрібно отримати ідентифікатор гліфа для кожного символу в якомусь текстовому рядку, ви можете скористатися методом GetGlyphsForText().
- Метод GetAllGlyphIds() призначений для отримання всіх ідентифікаторів гліфів, доступних у шрифті.
Також інтерфейс 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 і протягом кількох годин наша служба підтримки все вирішить. для вас.