CGFontRef
CGFontRef — это тип данных (опaque type) в графической библиотеке Core Graphics (фреймворк Quartz 2D) операционной системы macOS, iOS и других платформах, использующих Core Foundation. Представляет собой непрозрачную ссылку (opaque reference) на объект шрифта, используемый для рендеринга текста и получения информации о глифах. CGFontRef является частью низкоуровневого API, обеспечивающего прямой доступ к данным шрифта без посредничества более высокоуровневых систем, таких как NSFont или UIFont.
Тип данных и управление памятью
CGFontRef, как и все объекты Core Foundation, подчиняется правилам управления памятью через функции CFRetain и CFRelease. При создании шрифта с помощью функций, содержащих в названии «Create» или «Copy», вызывающий код получает объект с retain count, равным 1, и обязан освободить его после использования. При получении шрифта через функции, не содержащие этих слов (например, через CGFontGetLastReservedFont), объект не требует освобождения, но его retain count может быть изменён при необходимости.
Тип CGFontRef определён в заголовочном файле CGContext.h и является частью Core Graphics, которая, в свою очередь, базируется на Core Foundation. В Objective-C и Swift для работы с CGFontRef используются соответствующие мосты (toll-free bridging) с объектами NSFont и UIFont, что позволяет преобразовывать типы без потери данных.
Создание и получение шрифта
Существует несколько способов получения CGFontRef:
- Из файла шрифта: функция
CGFontCreateWithFontNameпринимает имя шрифта в виде строки CFStringRef и возвращает CGFontRef, если шрифт доступен в системе. Например,CGFontCreateWithFontName(CFSTR("Helvetica")). - Из данных шрифта:
CGFontCreateWithDataProviderсоздаёт шрифт из объекта CGDataProvider, который может быть загружен из файла, памяти или сетевого ресурса. Это позволяет использовать встроенные или пользовательские шрифты. - Из платформенного шрифта: в macOS и iOS существуют функции для получения CGFontRef из NSFont или UIFont соответственно. Например, в iOS:
CGFontRef cgFont = CTFontCopyGraphicsFont((CTFontRef)uiFont, NULL);, где используется промежуточный тип CTFontRef из Core Text. - Системные шрифты: функция
CGFontGetLastReservedFontвозвращает шрифт, используемый системой по умолчанию для экстренных случаев, когда запрошенный шрифт недоступен.
Основные функции и свойства
CGFontRef предоставляет ряд функций для работы со шрифтом:
- Получение имени:
CGFontCopyFullNameвозвращает полное имя шрифта (например, «Helvetica Regular»), аCGFontCopyPostScriptName— PostScript-имя (например, «Helvetica»). - Получение метрик:
CGFontGetAscent,CGFontGetDescent,CGFontGetLeadingвозвращают значения подъёма, спуска и межстрочного интервала в единицах шрифта (em units). Для перевода в пиксели используется масштабирование. - Получение количества глифов:
CGFontGetNumberOfGlyphsвозвращает общее число глифов в шрифте. - Работа с глифами:
CGFontGetGlyphWithGlyphNameиCGFontCopyGlyphNameForGlyphпозволяют преобразовывать имена глифов в индексы и обратно.CGFontGetGlyphAdvancesвозвращает ширину (advance) для каждого глифа. - Преобразование единиц:
CGFontGetUnitsPerEmвозвращает количество единиц шрифта на один em-квадрат, что необходимо для масштабирования метрик. - Векторные контуры:
CGFontCreatePathForGlyphсоздаёт объект CGPathRef, представляющий векторный контур (outline) заданного глифа. Это позволяет рисовать буквы как произвольные фигуры, а не только через текст.
Использование в контексте Core Graphics
CGFontRef используется совместно с графическим контекстом (CGContextRef) для рендеринга текста. Основные шаги:
- Установка шрифта в контексте:
CGContextSetFont(context, font). - Установка размера шрифта:
CGContextSetFontSize(context, size). - Установка цвета текста:
CGContextSetFillColorWithColorилиCGContextSetStrokeColorWithColor. - Вывод текста:
CGContextShowTextAtPointилиCGContextShowGlyphsAtPoint(устаревшие в macOS 10.13 и iOS 11, но всё ещё доступны для совместимости). В современных версиях рекомендуется использовать Core Text или Text Kit.
Однако, поскольку CGFontRef не содержит информации о кодировке символов (например, Unicode), для правильного отображения текста обычно требуется использование CTFontRef из Core Text, который является надстройкой над CGFontRef и добавляет поддержку кодировок, лигатур, кернинга и других типографских функций.
Отличия от CTFontRef
CGFontRef и CTFontRef (Core Text) — это два разных уровня абстракции:
- CGFontRef — низкоуровневый, ориентирован на работу с глифами и метриками, не поддерживает Unicode напрямую. Требует ручного преобразования символов в индексы глифов.
- CTFontRef — высокоуровневый, построен на CGFontRef, добавляет поддержку Unicode, кернинга, лигатур, атрибутов шрифта (жирность, курсив) и автоматическое преобразование строк в глифы.
На практике для большинства задач рекомендуется использовать CTFontRef, а CGFontRef — для специализированных случаев, например, когда требуется прямой доступ к векторным контурам глифов или работа с кастомными шрифтами без кодировки.
Пример использования (псевдокод)
```objc // Создание шрифта CGFontRef font = CGFontCreateWithFontName(CFSTR("Helvetica")); if (font) { // Получение метрик int unitsPerEm = CGFontGetUnitsPerEm(font); int ascent = CGFontGetAscent(font);
// Получение контура глифа 'A' CGGlyph glyph = CGFontGetGlyphWithGlyphName(font, CFSTR("A")); CGPathRef path = CGFontCreatePathForGlyph(font, glyph, NULL);
// Освобождение ресурсов CGPathRelease(path); CFRelease(font); } ```
Применение
CGFontRef используется в разработке приложений для macOS и iOS, где требуется низкоуровневый контроль над отображением текста:
- Создание кастомных текстовых движков — например, для игр или специализированных редакторов.
- Генерация векторных изображений текста — для печати, SVG или других форматов.
- Работа с нестандартными шрифтами — например, шрифтами, содержащими символы для пиктограмм или математических обозначений.
- Встраивание шрифтов в PDF — Core Graphics используется для создания PDF-документов, и CGFontRef позволяет контролировать, какие шрифты будут включены.
Ограничения
CGFontRef не поддерживает автоматическое преобразование строк в глифы, не учитывает кернинг и лигатуры, не работает с атрибутами шрифта (жирность, наклон) — для этого необходимо использовать CTFontRef. Также CGFontRef не предназначен для работы с текстом, содержащим символы из разных языковых систем (например, кириллица и латиница в одной строке), так как требует ручного задания кодировки.
Источники
- Apple Developer Documentation: Core Graphics — CGFontRef
- Apple Developer Documentation: Quartz 2D Programming Guide
- Apple Developer Documentation: Core Text Programming Guide
- «Programming with Quartz: 2D and PDF Graphics in Mac OS X» by David Gelphman, Bunny Laden
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →