CGFont: расчет глифов границ - PullRequest
1 голос
/ 18 апреля 2011

Как я могу получить размеры каждого символа строки в пикселях?Я использую CGFontGetGlyphBBoxes, чтобы получить ограничивающую рамку для каждого глифа в строке и получить следующие значения:

2011-04-18 15:34:56.809 TextSize[3604:207] bbox['d'] = {{56, -38}, {949, 1512}}
2011-04-18 15:34:56.811 TextSize[3604:207] bbox['e'] = {{72, -38}, {978, 1135}}
2011-04-18 15:34:56.811 TextSize[3604:207] bbox['m'] = {{132, 0}, {1441, 1095}}
2011-04-18 15:34:56.812 TextSize[3604:207] bbox['o'] = {{59, -39}, {998, 1141}}

Если я правильно понимаю эти значения, представленные в единицах шрифта.Что именно означают эти значения и как я могу перевести их в пиксели?В чем разница между значениями, возвращаемыми CGFontGetGlyphAdvances и CGFontGetGlyphBBoxes?Используя CGFontGetGlyphAdvances, я получаю следующее:

2011-04-18 15:34:56.809 TextSize[3604:207] advance['d'] = 1139, bbox = {{56, -38}, {949, 1512}}
2011-04-18 15:34:56.811 TextSize[3604:207] advance['e'] = 1139, bbox = {{72, -38}, {978, 1135}}
2011-04-18 15:34:56.811 TextSize[3604:207] advance['m'] = 1706, bbox = {{132, 0}, {1441, 1095}}
2011-04-18 15:34:56.812 TextSize[3604:207] advance['o'] = 1139, bbox = {{59, -39}, {998, 1141}}

Если, например, я хочу вычислить всю ширину строки (в моем случае 'demo'), какие значения (bbox.size.width или advance) должныЯ пользуюсь?

1 Ответ

0 голосов
/ 25 декабря 2013

Что сработало для меня, так это сложить предварительные значения для каждого глифа.Я не думаю, что ограничивающий прямоугольник будет содержать правильный интервал между глифами.

Вы можете получить значение для преобразования аванса в em, вызвав:

CGFontGetUnitsPerEm(cgfont);

Из этого вы можетеполучить пиксели путем умножения на размер шрифта.Но возьмите это с крошкой соли, поскольку я не совсем уверен, сработает ли это во всех возможных случаях.

...