Finish up title rendering for CoreText
This commit is contained in:
parent
90dfabc644
commit
2a842e36a1
@ -541,19 +541,35 @@ render_simple_text_impl(PyObject *s, const char *text, unsigned int baseline) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
ensure_ui_font(void) {
|
ensure_ui_font(size_t in_height) {
|
||||||
if (!window_title_font) window_title_font = CTFontCreateUIFontForLanguage(kCTFontUIFontWindowTitle, 0.f, NULL);
|
static size_t for_height = 0;
|
||||||
return !!window_title_font;
|
if (window_title_font) {
|
||||||
|
if (for_height == in_height) return true;
|
||||||
|
CFRelease(window_title_font);
|
||||||
|
}
|
||||||
|
window_title_font = CTFontCreateUIFontForLanguage(kCTFontUIFontWindowTitle, 0.f, NULL);
|
||||||
|
if (!window_title_font) return false;
|
||||||
|
CGFloat line_height = MAX(1, floor(CTFontGetAscent(window_title_font) + CTFontGetDescent(window_title_font) + MAX(0, CTFontGetLeading(window_title_font)) + 0.5));
|
||||||
|
CGFloat pts_per_px = CTFontGetSize(window_title_font) / line_height;
|
||||||
|
CGFloat desired_size = in_height * pts_per_px;
|
||||||
|
if (desired_size != CTFontGetSize(window_title_font)) {
|
||||||
|
CTFontRef sized = CTFontCreateCopyWithAttributes(window_title_font, desired_size, NULL, NULL);
|
||||||
|
CFRelease(window_title_font);
|
||||||
|
window_title_font = sized;
|
||||||
|
if (!window_title_font) return false;
|
||||||
|
}
|
||||||
|
for_height = in_height;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
cocoa_render_line_of_text(const char *text, const color_type fg, const color_type bg, uint8_t *rgba_output, const size_t width, const size_t height) {
|
cocoa_render_line_of_text(const char *text, const color_type fg, const color_type bg, uint8_t *rgba_output, const size_t width, const size_t height) {
|
||||||
if (!ensure_ui_font()) return false;
|
|
||||||
CGColorSpaceRef color_space = CGColorSpaceCreateDeviceRGB();
|
CGColorSpaceRef color_space = CGColorSpaceCreateDeviceRGB();
|
||||||
if (color_space == NULL) return false;
|
if (color_space == NULL) return false;
|
||||||
CGContextRef ctx = CGBitmapContextCreate(rgba_output, width, height, 8, 4 * width, color_space, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
|
CGContextRef ctx = CGBitmapContextCreate(rgba_output, width, height, 8, 4 * width, color_space, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
|
||||||
CGColorSpaceRelease(color_space);
|
CGColorSpaceRelease(color_space);
|
||||||
if (ctx == NULL) return false;
|
if (ctx == NULL) return false;
|
||||||
|
if (!ensure_ui_font(height)) return false;
|
||||||
|
|
||||||
CGContextSetShouldAntialias(ctx, true);
|
CGContextSetShouldAntialias(ctx, true);
|
||||||
CGContextSetShouldSmoothFonts(ctx, true); // sub-pixel antialias
|
CGContextSetShouldSmoothFonts(ctx, true); // sub-pixel antialias
|
||||||
@ -565,7 +581,16 @@ cocoa_render_line_of_text(const char *text, const color_type fg, const color_typ
|
|||||||
CGContextSetRGBFillColor(ctx, ((fg >> 16) & 0xff) / 255.f, ((fg >> 8) & 0xff) / 255.f, (fg & 0xff) / 255.f, 1.f);
|
CGContextSetRGBFillColor(ctx, ((fg >> 16) & 0xff) / 255.f, ((fg >> 8) & 0xff) / 255.f, (fg & 0xff) / 255.f, 1.f);
|
||||||
CGContextSetRGBStrokeColor(ctx, ((fg >> 16) & 0xff) / 255.f, ((fg >> 8) & 0xff) / 255.f, (fg & 0xff) / 255.f, 1.f);
|
CGContextSetRGBStrokeColor(ctx, ((fg >> 16) & 0xff) / 255.f, ((fg >> 8) & 0xff) / 255.f, (fg & 0xff) / 255.f, 1.f);
|
||||||
|
|
||||||
(void)text;
|
NSAttributedString *str = [[NSAttributedString alloc] initWithString:@(text) attributes:@{(NSString *)kCTFontAttributeName: (__bridge id)window_title_font}];
|
||||||
|
if (!str) { CGContextRelease(ctx); return false; }
|
||||||
|
CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)str);
|
||||||
|
[str release];
|
||||||
|
if (!line) { CGContextRelease(ctx); return false; }
|
||||||
|
CGFloat ascent, descent, leading;
|
||||||
|
CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
|
||||||
|
CGContextSetTextPosition(ctx, 0, descent);
|
||||||
|
CTLineDraw(line, ctx);
|
||||||
|
CFRelease(line);
|
||||||
CGContextRelease(ctx);
|
CGContextRelease(ctx);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user