Почему Core Text возвращает Myriad Pro Semibold при запросе жирной версии Myriad Pro - PullRequest
0 голосов
/ 26 июля 2011

У меня установлены общие шрифты Adobe Myriad Pro.К ним относятся Myriad Pro Regular, Myriad Pro Bold и Myriad Pro Semibold.Предположим, у меня есть CTFontRef baseFont, который указывает на Myriad Pro Regular, и что размер шрифта, который я желаю, равен size.Я запускаю следующий код:

CTFontRef boldFont = CTFontCreateCopyWithSymbolicTraits(baseFont, size, NULL, kCTFontBoldTrait, kCTFontBoldTrait);

Возвращенный шрифт Myriad Pro Semibold, а не Myriad Pro Bold.

Есть ли способ заставить это вернуть Myriad Pro Bold вместо, кромезапрашивает именованный стиль «Bold»?Я хотел, чтобы этот код был полностью универсальным без использования жестких имен стилей.

Я пробовал это в различных перестановках, включая передачу черты жирным шрифтом как части словаря атрибутов при первоначальном создании шрифта, избегая двух-шаговый процесс, описанный здесь, но он по-прежнему возвращает полужирный шрифт по сравнению с обычным жирным шрифтом.Я тоже немного обшарил сами шрифты.Полужирный шрифт имеет вес 700 в своей таблице <OS/2>, а полужирный шрифт имеет вес 600. Веса PANOSE соответствуют этому.Однако поля macStyle в таблице <head> полужирного и полужирного шрифтов оба имеют установленный флаг полужирного шрифта, поэтому, вероятно, это то, что использует Базовый текст.Но есть ли способ сделать его более разборчивым?

Ответы [ 2 ]

0 голосов
/ 03 мая 2013

Для CTFontDescriptor вы можете указать атрибут kCTFontTraitsAttribute, который должен быть CFDictionaryRef, где вы можете указать kCTFontWeightTrait, который принимает CFNumberRef, представляющий число с плавающей запятой между -1 и 1, давая вамспектр весов, 1 - наиболее жирный вариант, а 0 - обычный / средний.

0 голосов
/ 04 февраля 2012

Основываясь на прочтении документации, подкрепленной некоторыми знаниями об обработке шрифтов в целом, но не Core Text, я бы сказал, что это возможно, но это не так просто.

Документация CTFontCreateCopyWithSymbolicTraits() указывает, что параметры symTraitValue и symTraitMask имеют тип CTFontSymbolicTraits. Документация CTFontDescriptor() определяет значение "Bold", которое вы используете как

kCTFontBoldTrait = (1 << 1)

Так что это явно булева черта. Однако, как вы видели, вес шрифта является спектром, а не булевой характеристикой, хотя десятилетия «жирных» кнопок в пользовательском интерфейсе текстового процессора представляли его как булеву характеристику. CTFontCreateCopyWithSymbolicTraits() не обладает необходимой вам выразительной силой.

Еще один подход, который может сработать, это попытаться позвонить CTFontDescriptorCreateMatchingFontDescriptors(). Вы передаете эту функцию CTFontDescriptorRef исходному шрифту и CFSetRef с атрибутами, которые должны присутствовать. Эта функция возвращает массив дескрипторов шрифтов, каждый из которых соответствует запрашиваемым атрибутам.

Таким образом, вы можете передать ему CTFontDescriptorRef для Myriad Pro Regular и, возможно, CFSetRef, заявив, что вы хотите выделить жирным шрифтом, а затем просмотреть каждый дескриптор шрифта в возвращенном массиве, чтобы найти тот, который имеет наибольший вес.

Я не написал этот код, и мое незнание основного текста означает, что я могу что-то упустить, но это выглядит как правдоподобный подход.

...