From 5d823dd6f5913a88d48840650ed89038f011c5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 19 Mar 2020 17:46:13 -0700 Subject: [PATCH] [ios, macos] Get glyph metrics from font Get glyph metrics from the font in the process of drawing each glyph into a bitmap context. These metrics result in more accurate kerning and better aligned baselines than the previous hard-coded values. Align iOS/macOS local glyph rasterization test fixture to Qt. --- CHANGELOG.md | 2 + platform/darwin/src/local_glyph_rasterizer.mm | 89 +++++++++++------- .../local_glyphs/ping_fang/expected.png | Bin 18202 -> 18292 bytes 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0f0a265ca5..62972c0d842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,8 @@ By default, CJK characters are now set in the font specified by the `text-font` layout property. If the named font is not installed on the device or bundled with the application, the characters are set in one of the fallback fonts passed into the `localFontFamily` parameter of `mbgl::Renderer::Renderer()` and `mbgl::MapSnapshotter::MapSnapshotter()`. This parameter can now contain a list of font family names, font display names, and font PostScript names, each name separated by a newline. + CJK characters are now laid out according to the font, so fonts with nonsquare glyphs have the correct kerning. This also fixes an issue where the baseline for CJK characters was too low compared to non-CJK characters. + ## maps-v1.6.0-rc.1 ### ✨ New features diff --git a/platform/darwin/src/local_glyph_rasterizer.mm b/platform/darwin/src/local_glyph_rasterizer.mm index d34dbc1167f..b324184ba10 100644 --- a/platform/darwin/src/local_glyph_rasterizer.mm +++ b/platform/darwin/src/local_glyph_rasterizer.mm @@ -148,11 +148,39 @@ CTFontRef createFont(const FontStack& fontStack) { return util::i18n::allowsFixedWidthGlyphGeneration(glyphID) && impl->isEnabled(); } -PremultipliedImage drawGlyphBitmap(GlyphID glyphID, CTFontRef font, Size size) { - PremultipliedImage rgbaBitmap(size); - +PremultipliedImage drawGlyphBitmap(GlyphID glyphID, CTFontRef font, GlyphMetrics& metrics) { CFStringRefHandle string(CFStringCreateWithCharacters(NULL, reinterpret_cast(&glyphID), 1)); + if (!string) { + throw std::runtime_error("Unable to create string from codepoint"); + } + + CFStringRef keys[] = { kCTFontAttributeName }; + CFTypeRef values[] = { font }; + CFDictionaryRefHandle attributes( + CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys, + (const void**)&values, sizeof(keys) / sizeof(keys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)); + if (!attributes) { + throw std::runtime_error("Unable to create attributed string attributes dictionary"); + } + + CFAttributedStringRefHandle attrString(CFAttributedStringCreate(kCFAllocatorDefault, *string, *attributes)); + if (!attrString) { + throw std::runtime_error("Unable to create attributed string"); + } + CTLineRefHandle line(CTLineCreateWithAttributedString(*attrString)); + if (!line) { + throw std::runtime_error("Unable to create line from attributed string"); + } + + Size size(35, 35); + metrics.width = size.width; + metrics.height = size.height; + + PremultipliedImage rgbaBitmap(size); + CGColorSpaceHandle colorSpace(CGColorSpaceCreateDeviceRGB()); if (!colorSpace) { throw std::runtime_error("CGColorSpaceCreateDeviceRGB failed"); @@ -173,52 +201,47 @@ CGContextHandle context(CGBitmapContextCreate( if (!context) { throw std::runtime_error("CGBitmapContextCreate failed"); } - - CFStringRef keys[] = { kCTFontAttributeName }; - CFTypeRef values[] = { font }; - - CFDictionaryRefHandle attributes( - CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys, - (const void**)&values, sizeof(keys) / sizeof(keys[0]), - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks)); - - CFAttributedStringRefHandle attrString(CFAttributedStringCreate(kCFAllocatorDefault, *string, *attributes)); - CTLineRefHandle line(CTLineCreateWithAttributedString(*attrString)); - // Start drawing a little bit below the top of the bitmap - CGContextSetTextPosition(*context, 0.0, 5.0); + CFArrayRef glyphRuns = CTLineGetGlyphRuns(*line); + CTRunRef glyphRun = (CTRunRef)CFArrayGetValueAtIndex(glyphRuns, 0); + CFRange wholeRunRange = CFRangeMake(0, CTRunGetGlyphCount(glyphRun)); + CGSize advances[wholeRunRange.length]; + CTRunGetAdvances(glyphRun, wholeRunRange, advances); + metrics.advance = std::round(advances[0].width); + + // Mimic glyph PBF metrics. + metrics.left = Glyph::borderSize; + metrics.top = -1; + + // Move the text upward to avoid clipping off descenders. + CGFloat descent; + CTRunGetTypographicBounds(glyphRun, wholeRunRange, NULL, &descent, NULL); + CGContextSetTextPosition(*context, 0.0, descent); + CTLineDraw(*line, *context); return rgbaBitmap; } Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack& fontStack, GlyphID glyphID) { - Glyph fixedMetrics; - CTFontRef font = impl->createFont(fontStack); + Glyph manufacturedGlyph; + CTFontRefHandle font(impl->createFont(fontStack)); if (!font) { - return fixedMetrics; + return manufacturedGlyph; } - fixedMetrics.id = glyphID; + manufacturedGlyph.id = glyphID; - Size size(35, 35); + PremultipliedImage rgbaBitmap = drawGlyphBitmap(glyphID, *font, manufacturedGlyph.metrics); - fixedMetrics.metrics.width = size.width; - fixedMetrics.metrics.height = size.height; - fixedMetrics.metrics.left = 3; - fixedMetrics.metrics.top = -1; - fixedMetrics.metrics.advance = 24; - - PremultipliedImage rgbaBitmap = drawGlyphBitmap(glyphID, font, size); - + Size size(manufacturedGlyph.metrics.width, manufacturedGlyph.metrics.height); // Copy alpha values from RGBA bitmap into the AlphaImage output - fixedMetrics.bitmap = AlphaImage(size); + manufacturedGlyph.bitmap = AlphaImage(size); for (uint32_t i = 0; i < size.width * size.height; i++) { - fixedMetrics.bitmap.data[i] = rgbaBitmap.data[4 * i + 3]; + manufacturedGlyph.bitmap.data[i] = rgbaBitmap.data[4 * i + 3]; } - return fixedMetrics; + return manufacturedGlyph; } } // namespace mbgl diff --git a/test/fixtures/local_glyphs/ping_fang/expected.png b/test/fixtures/local_glyphs/ping_fang/expected.png index c769fd19f9ee8d70d213f8b3d77988275e093189..6e7e5c80b9c7cca2f323e350e375668641f7c704 100644 GIT binary patch literal 18292 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 literal 18202 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 z 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