CGFontGetGlyphBBox неверный результат - PullRequest
0 голосов
/ 16 мая 2018

Я пытался точно измерить границы глифов, но этот код выводит 916 !!! Реальная ширина составляет 69.

- (void)drawRect:(NSRect)dirtyRect {
        CGContextRef main = [[NSGraphicsContext currentContext] graphicsPort];
        CGContextSetTextMatrix(main, CGAffineTransformIdentity);
        CGGlyph g;
        CGPoint p  = CGPointMake(100, 100);
        CGRect rect = CGRectMake(0, 0, 0, 0);
        CGFontRef font = CGFontCreateWithFontName((CFStringRef)@"Arial");
        g = CGFontGetGlyphWithGlyphName(font, CFSTR("L"));
        CGContextSetFont(main, font);
        CGContextSetTextPosition(main, 0, 0);
        CGContextSetFontSize(main, 200);
        CGContextSetRGBFillColor(main, 0, 0, 1, 1);
        CGContextShowGlyphsAtPositions(main, &g, &p, 1);
        CGFontGetGlyphBBoxes(font, &g, 1, &rect);
        printf("%f", rect.size.width);
    }

1 Ответ

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

Вы используете CGFontGetGlyphBBoxes, который возвращает размер в глиф пробелах .Чтобы использовать это, вам нужно масштабировать его с единицами измерения на единицу и размером шрифта.

CGRect rect;
CGFontRef font = CGFontCreateWithFontName((CFStringRef)@"Arial");
CGFloat fontSize = 200.0;
CGGlyph g = CGFontGetGlyphWithGlyphName(font, CFSTR("L"));
CGFontGetGlyphBBoxes(font, &g, 1, &rect);
CGFloat width = rect.size.Width / CGFontGetUnitsPerEm(font) * fontSize;

Альтернативный способ сделать это - использовать [NSFont boundingRectForCGGlyph:].

NSFont *font = [NSFont fontWithName:@"Arial" size:200];
NSRect rect = [font boundingRectForCGGlyph:g];

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

...