Использование объектов Glyph | API-решение для C++

Работа с глифами имеет решающее значение при кодировании шрифтов, поскольку это их единица. Когда основная информация о глифах объяснена в статье параграфа Что такое шрифт, здесь мы собираемся научить вас функциональности Aspose.Font для работы с глифами и в частности, объекты Glyph.

Глиф объект

Глифы любого шрифта представлены типом Glyph в библиотеке Aspose.Font. Итак, тип Glyph — это универсальный объект для глифов шрифта, независимо от формата шрифта (TrueType, Compact Font Format и т. д.).

Функциональность, предоставляемая объектом Glyph

Какой функционал предоставляет нам этот объект?

На этот вопрос отвечают его свойства.

Давайте возьмем пример со следующим фрагментом кода, который показывает, как вычислить ширину текста «Привет, мир» в пикселях, когда размер шрифта равен 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 по своему определению соответствуют одинаковым постскриптумным операторам.

Также типы MoveTo и LineTo по своему определению соответствуют функциям MoveToEx() и LineTo() из библиотеки Windows GDI, тип CurveTo используется для описания кривых Безье.

Свойство Glyph Path предоставляет нам коллекцию всех графических примитивов для этого глифа.

Свойство Path имеет тип SegmentPath, и каждый объект этого типа имеет свойство Segments типа PathSegmentCollection. Это свойство Segments возвращает все графические примитивы, входящие в состав объекта SegmentPath. Другими словами, мы можем получить все графические примитивы для глифа, используя запись glyph.Path.Segments.

Следующий example вычисляет все точки, которые имеет глиф, и сохраняет их в переменной 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}

All the examples of using the Aspose.Font are stored in Aspose.Font.Examples.CPP.sln solution, in the cpp-examples of the Aspose.Font Documentation

Если у вас возникли какие-либо проблемы, вы можете опубликовать их в разделе Aspose.Font.Product Family на Форуме бесплатной поддержки, и в течение нескольких часов наша служба поддержки все прояснит. для тебя.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.