Рисование текста с помощью CGContextShowGlyphsAtPoint - как получить размеры шрифта? - PullRequest
0 голосов
/ 31 января 2011

Надеюсь, это довольно просто. По сути, я рисую некоторый текст в NSView, и мне нужно знать «физическую» высоту и ширину нарисованных глифов.

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

Это не настоящий код, но я переписал его так, чтобы было легче понять, чего я пытаюсь достичь.

CGFontRef myFontRef = CGFontCreateWithDataProvider(myFontDataProvider);
CGContextSetFont(thisContext, myFontRef);
CGFloat fontSize = 1.0; //will be changeable later
CGContextSetFontSize(thisContext, fontSize);
CGRect charBounds = CGRectMake(x, y, widthPerChar, heightPerChar);
//paint charBounds with background colour
CGFloat textX = x + 2;
CGFloat textY = y + 5;
CGContextShowGlyphsAtPoint(thisContext, textX, textY, (CGGlyph *)displayedString, 1);

Если бы мне удалось вычислить ширину отображаемого глифа, было бы легко понять, какими должны быть textX и textY.

Заранее спасибо всем, кто хочет помочь.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете рассчитать ширину одного глифа следующим образом:

CGRect units;
 CGFontGetGlyphBBoxes(font, &glyph, 1, &units);
 float width = units.size.width/CGFontGetUnitsPerEm(font)*fontSize;
0 голосов
/ 31 января 2011

Частично проработано из этого кода - вот что я придумал:

CGContextSetTextDrawingMode(thisContext, kCGTextInvisible);            
CGContextShowGlyphsAtPoint(thisContext, 1, 1, (const CGGlyph *)"x", 1);
CGPoint postPosition = CGContextGetTextPosition(thisContext);
CGFloat textOffsetX = ((postPosition.x - 1) / 2);
CGFloat textOffsetY = (fontSize * 5);
CGContextSetTextDrawingMode(thisContext, kCGTextFillStroke);

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

Спасибо за помощь, хотя!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...