Читайте інформацію про гліфи та їх метрики
Рішення C++ API для обчислення ширини рядка, обчислення координат гліфа та інших маніпуляцій із гліфами.
API Aspose.Font пропонує широку функціональність, пов’язану зі шрифтами, включаючи конверсія, маніпуляції з гліфами, виявлення латинських символів тощо. Деякі з цих функцій стосуються роботи із гліфами, які є окремими символами гарнітури або графічним представленням символів/знаків. Щоб дізнатися більше про ці одиниці шрифту, перегляньте статтю Вступ до гліфа .
На цій сторінці описано варіант читання інформації про гліфи та показники, але для повного розуміння функціональності зверніться до статті Використання об’єктів гліфів , де ви знайдете численні приклади коду C++ і дізнаєтеся про можливості Aspose.Font для роботи з гліфами та об’єктами Glyph. Більше прикладів коду, що демонструють використання Aspose.Font для роботи з гліфами, можна знайти в Aspose Github Project .
Метрики гліфа, термін, що використовується тут, відносяться до інформації та вимірів конкретного гліфа у шрифті. Вони можуть включати таку інформацію, як висота, ширина, ширина просування та інші розміри гліфа, які важливі для правильного позиціювання та інтервалу символів у шрифті. Ці метрики використовуються системами верстки та рендерингу тексту для забезпечення послідовного та точного відображення тексту.
Для роботи з гліфами нам знадобиться:
API Aspose.Font для C++, який є багатофункціональним, потужним і простим у використанні API для обробки та перетворення документів.
Відкрити менеджер пакунків NuGet і знайдіть Aspose.Font і встановіть. Ви також можете використати наступну команду з консолі менеджера пакетів.
Package Manager Console Command
PM> Install-Package Aspose.Font
Покрокова інструкція для обчислення ширини рядка за допомогою C++:
Щоб обчислити ширину рядка за допомогою гліфів, вам потрібно спочатку визначити ширину кожного окремого гліфа в рядку, а потім підсумувати ці ширини, щоб отримати загальне число. Якщо пояснити це кроками, порядок буде наступним:
- Визначте шрифт і розмір, які ви хочете використовувати для обчислення ширини рядка.
- Для кожного символу в рядку визначте відповідний гліф у шрифті. Скористайтеся картою символів, яка дасть вам індекс відповідного гліфа.
- Використовуючи індекс гліфів, знайдіть показники для гліфа в таблиці показників шрифту. Показники для гліфа зазвичай включають його ширину, висоту та ширину просування.
- Додайте розширену ширину всіх гліфів у рядку, щоб отримати загальну ширину рядка. Зверніть увагу на інформацію про кернінг.
Якщо описувати подібний процес за допомогою коду C++, це виглядатиме наступним чином.
Код C++ для визначення ширини рядка
using System;
using System::IO;
using System::Drawing;
using System::Collections::Generic;
using Aspose::Font::Sources;
using Aspose::Font::Glyphs;
using Aspose::Font::RenderingPath;
//Declare the text and other constants
const System::String text = u"Hello world";
const int32_t fontSize = 10;
//Declare the variable for string width
double width = 0;
//Get glyph for each letter in text and calculate width for whole text.
//The same result can be achieved using method font.Metrics.MeasureString(text, fontSize).
for (char16_t symbol : text)
{
System::SharedPtr<GlyphId> gid = this->_font->get_Encoding()->DecodeToGid(symbol);
System::SharedPtr<Glyph> glyph = this->_font->GetGlyphById(gid);
width += (glyph->get_WidthVectorX() / this->_font->get_Metrics()->get_UnitsPerEM()) * fontSize;
}
font->get_Metrics()->MeasureString(text, width);
//Print the output results
System::Console::WriteLine(System::String::Format(u"Width for text \"{0}\" with font size {2} is equal {3}.", text, FontName, fontSize, width));
Покрокова інструкція для обчислення всіх точок гліфів із координатами за допомогою C++:
- Оголосіть список points типу System::Drawing::Point: цей список зберігатиме точки сегмент шляху гліфа.
- Вкажіть посилання на службу Init в інтерфейсі IPathSegment .
- Повторіть усі сегменти шляху гліфа та підсумуйте бали.
Код C++ для пошуку точок гліфів
//Declare the resultant list with points
System::SharedPtr<System::Collections::Generic::List<System::Drawing::Point>> points =
System::MakeObject<System::Collections::Generic::List<System::Drawing::Point>>();
//Init the service reference on IPathSegment
System::SharedPtr<IPathSegment> prevSegment;
//Iterate all the glyph path segments and collect points
for (auto&& segment : glyph->get_Path()->get_Segments())
{
if ((System::ObjectExt::Is<LineTo>(segment)) || (System::ObjectExt::Is<CurveTo>(segment)))
{
if (System::ObjectExt::Is<MoveTo>(prevSegment))
{
System::SharedPtr<MoveTo> moveTo = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::MoveTo>(prevSegment);
AddPoint((int32_t)moveTo->get_X(), (int32_t)moveTo->get_Y(), points);
}
if (System::ObjectExt::Is<LineTo>(segment))
{
System::SharedPtr<LineTo> line = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::LineTo>(segment);
AddPoint((int32_t)line->get_X(), (int32_t)line->get_Y(), points);
}
else if (System::ObjectExt::Is<CurveTo>(segment))
{
System::SharedPtr<CurveTo> curve = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::CurveTo>(segment);
AddPoint((int32_t)curve->get_X1(), (int32_t)curve->get_Y1(), points);
AddPoint((int32_t)curve->get_X2(), (int32_t)curve->get_Y2(), points);
AddPoint((int32_t)curve->get_X3(), (int32_t)curve->get_Y3(), points);
}
}
prevSegment = segment;
}
FAQ
1. Що таке метрика гліфа?
Метрики гліфа – це параметри, які впливають на розташування гліфа під час створення макета тексту.
2. Наведіть приклади метрик гліфів.
Найчастіше використовувані метрики гліфів: ширина просування, початок, бічні відступи, базова лінія, підйом, верхній підйом, спуск, нижній спуск, обмежувальний прямокутник, висота, ширина та кернінг.
3. Як керувати гліфами за допомогою цього рішення API?
Щоб кодувати гліфи в C#, використовуйте сутності простору імен Aspose.Font.Glyphs .
4. Який вплив мають метрики гліфів?
Розуміючи та правильно налаштовуючи показники гліфів, типографи та дизайнери можуть забезпечити оптимальний інтервал, вирівнювання та розбірливість тексту в друкованих матеріалах, цифрових інтерфейсах або веб-сторінках.