From 887e6021e661b7586798311ccba2c8a6ded1a56e Mon Sep 17 00:00:00 2001 From: Taku Fukada Date: Wed, 1 Jul 2026 20:52:01 +0900 Subject: [PATCH] feat(core): render local CJK glyphs at 2x texture resolution (#4304) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bart Louwers --- CHANGELOG.md | 1 + include/mbgl/text/glyph.hpp | 9 ++- include/mbgl/text/glyph_range.hpp | 5 +- .../src/cpp/text/local_glyph_rasterizer.cpp | 36 +++++++--- .../cpp/text/local_glyph_rasterizer_jni.hpp | 3 + .../android/text/LocalGlyphRasterizer.java | 60 +++++++++++++++-- .../darwin/core/local_glyph_rasterizer.mm | 57 +++++++++++----- .../src/mbgl/storage/offline_download.cpp | 7 +- .../qt/src/mbgl/local_glyph_rasterizer.cpp | 44 ++++++++---- src/mbgl/text/glyph_manager.cpp | 3 +- src/mbgl/text/local_glyph_rasterizer.hpp | 18 ++--- src/mbgl/text/quads.cpp | 8 ++- src/mbgl/util/i18n.cpp | 59 +++++++++++++++- src/mbgl/util/i18n.hpp | 4 ++ .../noto_sans_cjk_kr_regular_qt/expected.png | Bin 27980 -> 27039 bytes .../local_glyphs/ping_fang/expected.png | Bin 17747 -> 18191 bytes .../ping_fang_semibold/expected.png | Bin 18279 -> 18585 bytes .../ping_fang_with_bold_in_style/expected.png | Bin 17875 -> 18526 bytes test/storage/offline_download.test.cpp | 9 +-- test/text/glyph_manager.test.cpp | 63 ++++++++++++++++-- test/text/local_glyph_rasterizer.test.cpp | 6 +- test/text/quads.test.cpp | 49 ++++++++++++++ 22 files changed, 357 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 788be0840..e0ebd68c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### ✨ New features - *...Add new stuff here...* +- [core] Locally rasterized CJK glyphs now render at 2x texture resolution, preserving fine strokes. Mirrors [maplibre-gl-js#3006](https://github.com/maplibre/maplibre-gl-js/pull/3006). - [core] Added new map observer events: onPreCompileShader, onPostCompileShader, onShaderCompileFailed, onGlyphsLoaded, onGlyphsError, onGlyphsRequested, onTileAction, onSpriteLoaded, onSpriteError, onSpriteRequested ([#2694](https://github.com/maplibre/maplibre-native/pull/2694)). - [core] Add WebP image decoding support to default platform (Linux, Windows) - [core] All CMake properties are now prefixed `MLN_*` [1054](https://github.com/maplibre/maplibre-native/pull/1054). diff --git a/include/mbgl/text/glyph.hpp b/include/mbgl/text/glyph.hpp index f5a67be55..7694ca3a2 100644 --- a/include/mbgl/text/glyph.hpp +++ b/include/mbgl/text/glyph.hpp @@ -60,14 +60,17 @@ GlyphRange getGlyphRange(GlyphID glyph); struct GlyphMetrics { uint32_t width = 0; uint32_t height = 0; - int32_t left = 0; - int32_t top = 0; + float left = 0; + float top = 0; uint32_t advance = 0; + // True when the glyph bitmap is rendered at 2x texture resolution + // (e.g. local CJK glyphs). + bool isDoubleResolution = false; }; inline bool operator==(const GlyphMetrics &lhs, const GlyphMetrics &rhs) { return lhs.width == rhs.width && lhs.height == rhs.height && lhs.left == rhs.left && lhs.top == rhs.top && - lhs.advance == rhs.advance; + lhs.advance == rhs.advance && lhs.isDoubleResolution == rhs.isDoubleResolution; } class Glyph { diff --git a/include/mbgl/text/glyph_range.hpp b/include/mbgl/text/glyph_range.hpp index 461496a85..6f4f65db4 100644 --- a/include/mbgl/text/glyph_range.hpp +++ b/include/mbgl/text/glyph_range.hpp @@ -31,8 +31,9 @@ public: constexpr uint32_t GLYPHS_PER_GLYPH_RANGE = 256; constexpr uint32_t GLYPH_RANGES_PER_FONT_STACK = 256; -// 256 - 126 ranges skipped w/ i18n::allowsFixedWidthGlyphGeneration -constexpr uint32_t NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK = 130; +// Verified against i18n::glyphRangeIsEntirelyLocallyGenerated by +// i18n.GlyphRangeLocalGenerationCountMatchesConstant. +constexpr uint32_t NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK = 97; } // end namespace mbgl diff --git a/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer.cpp b/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer.cpp index f313a2d32..e529b5dc0 100644 --- a/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer.cpp @@ -59,6 +59,15 @@ PremultipliedImage LocalGlyphRasterizer::drawGlyphBitmap(const std::string& font static_cast(glyphID))); } +float LocalGlyphRasterizer::getLastGlyphTop() { + UniqueEnv env{AttachEnv()}; + + static auto& javaClass = jni::Class::Singleton(*env); + static auto getLastGlyphTop = javaClass.GetMethod(*env, "getLastGlyphTop"); + + return javaObject.Call(*env, getLastGlyphTop); +} + void LocalGlyphRasterizer::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } @@ -84,6 +93,8 @@ public: return androidLocalGlyphRasterizer.drawGlyphBitmap(*fontFamily, bold, glyphID); } + float getLastGlyphTop() { return androidLocalGlyphRasterizer.getLastGlyphTop(); } + private: std::optional fontFamily; android::LocalGlyphRasterizer androidLocalGlyphRasterizer; @@ -98,6 +109,11 @@ bool LocalGlyphRasterizer::canRasterizeGlyph(const FontStack&, GlyphID glyphID) return util::i18n::allowsFixedWidthGlyphGeneration(glyphID) && impl->isConfigured(); } +// 2x bitmap with 1x logical metrics. +constexpr uint32_t kLocalGlyphTextureScale = 2; +constexpr uint32_t kLocalGlyphLogicalSize = 30; +constexpr uint32_t kLocalGlyphBitmapSize = kLocalGlyphLogicalSize * kLocalGlyphTextureScale; + Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack& fontStack, GlyphID glyphID) { Glyph fixedMetrics; if (!impl->isConfigured()) { @@ -106,19 +122,21 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack& fontStack, GlyphID g fixedMetrics.id = glyphID; - Size size(35, 35); - - fixedMetrics.metrics.width = size.width; - fixedMetrics.metrics.height = size.height; - fixedMetrics.metrics.left = -2; - fixedMetrics.metrics.top = -5; + // Metrics are reported in 1x logical units; the bitmap is allocated at 2x. + fixedMetrics.metrics.width = kLocalGlyphLogicalSize; + fixedMetrics.metrics.height = kLocalGlyphLogicalSize; + fixedMetrics.metrics.left = -1.5f; fixedMetrics.metrics.advance = 24; + fixedMetrics.metrics.isDoubleResolution = true; PremultipliedImage rgbaBitmap = impl->drawGlyphBitmap(fontStack, glyphID); + fixedMetrics.metrics.top = impl->getLastGlyphTop(); - // Copy alpha values from RGBA bitmap into the AlphaImage output - fixedMetrics.bitmap = AlphaImage(size); - for (uint32_t i = 0; i < size.width * size.height; i++) { + // Copy alpha values from RGBA bitmap into the AlphaImage output. The Java side + // produces a kLocalGlyphBitmapSize x kLocalGlyphBitmapSize bitmap. + const Size bitmapSize(kLocalGlyphBitmapSize, kLocalGlyphBitmapSize); + fixedMetrics.bitmap = AlphaImage(bitmapSize); + for (uint32_t i = 0; i < bitmapSize.width * bitmapSize.height; i++) { fixedMetrics.bitmap.data[i] = 0xff - round(0.2126 * rgbaBitmap.data[4 * i] + 0.7152 * rgbaBitmap.data[4 * i + 1] + 0.0722 * rgbaBitmap.data[4 * i + 2]); diff --git a/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer_jni.hpp b/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer_jni.hpp index d48a69d5e..4aa9375df 100644 --- a/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer_jni.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/text/local_glyph_rasterizer_jni.hpp @@ -4,6 +4,8 @@ #include +#include + /* android::LocalGlyphRasterizer is the JNI wrapper of org/maplibre/android/text/LocalGlyphRasterizer @@ -24,6 +26,7 @@ public: LocalGlyphRasterizer(); PremultipliedImage drawGlyphBitmap(const std::string& fontFamily, const bool bold, const char16_t glyphID); + float getLastGlyphTop(); private: jni::Global, jni::EnvAttachingDeleter> javaObject; diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/text/LocalGlyphRasterizer.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/text/LocalGlyphRasterizer.java index e0fd02d13..0c05cd5d9 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/text/LocalGlyphRasterizer.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/text/LocalGlyphRasterizer.java @@ -4,38 +4,76 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Rect; import android.graphics.Typeface; import androidx.annotation.Keep; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; +import java.util.HashMap; +import java.util.Map; + /** * LocalGlyphRasterizer is the Android-specific platform implementation used * by the portable local_glyph_rasterizer.hpp */ @Keep public class LocalGlyphRasterizer { + private static final int TEXTURE_SCALE = 2; + private static final int BITMAP_SIZE = 60; + private static final int TEXT_SIZE = 48; + private static final int RASTER_BUFFER = 3 * TEXTURE_SCALE; + private static final float TOP_ADJUSTMENT = 26.5f; + private static final float BASELINE_X = 10; + private final Bitmap bitmap; @NonNull private final Paint paint; @NonNull private final Canvas canvas; + @NonNull + private final Rect textBounds; + @NonNull + // Tiny cache (font stacks × 2 for bold/regular) so glyphs don't + // pay Typeface.create's cache lookup and internal lock per call. + private final Map typefaceCache; + // Updated by drawGlyphBitmap so native code can read the measured top without + // allocating a per-glyph result object. + private float glyphTop; LocalGlyphRasterizer() { /* - 35x35px dimensions are hardwired to match local_glyph_rasterizer.cpp - These dimensions are large enough to draw a 24 point character in the middle - of the bitmap (y: 20) with some buffer around the edge + 60x60px dimensions are hardwired to match local_glyph_rasterizer.cpp. + Glyphs are drawn at 2x texture resolution, while logical metrics stay at 1x. + These dimensions are large enough to draw a 48 px character in the middle + of the bitmap with some buffer around the edge. */ - bitmap = Bitmap.createBitmap(35, 35, Bitmap.Config.ARGB_8888); + bitmap = Bitmap.createBitmap(BITMAP_SIZE, BITMAP_SIZE, Bitmap.Config.ARGB_8888); paint = new Paint(); paint.setAntiAlias(true); - paint.setTextSize(24); + paint.setTextSize(TEXT_SIZE); canvas = new Canvas(); canvas.setBitmap(bitmap); + textBounds = new Rect(); + typefaceCache = new HashMap<>(); + } + + private void setTypeface(String fontFamily, boolean bold) { + String key = (bold ? "bold:" : "regular:") + fontFamily; + Typeface typeface = typefaceCache.get(key); + if (typeface == null) { + typeface = Typeface.create(fontFamily, bold ? Typeface.BOLD : Typeface.NORMAL); + typefaceCache.put(key, typeface); + } + paint.setTypeface(typeface); + } + + private int measureGlyphTop(String glyph) { + paint.getTextBounds(glyph, 0, glyph.length(), textBounds); + return Math.max(0, -textBounds.top); } /*** @@ -51,9 +89,17 @@ public class LocalGlyphRasterizer { */ @WorkerThread protected Bitmap drawGlyphBitmap(String fontFamily, boolean bold, char glyphID) { - paint.setTypeface(Typeface.create(fontFamily, bold ? Typeface.BOLD : Typeface.NORMAL)); + setTypeface(fontFamily, bold); + String glyph = String.valueOf(glyphID); + int glyphTopPx = measureGlyphTop(glyph); + glyphTop = glyphTopPx / (float) TEXTURE_SCALE - TOP_ADJUSTMENT; canvas.drawColor(Color.WHITE); - canvas.drawText(String.valueOf(glyphID), 5, 25, paint); + canvas.drawText(glyph, BASELINE_X, RASTER_BUFFER + glyphTopPx, paint); return bitmap; } + + @WorkerThread + protected float getLastGlyphTop() { + return glyphTop; + } } diff --git a/platform/darwin/core/local_glyph_rasterizer.mm b/platform/darwin/core/local_glyph_rasterizer.mm index 931bf2dfb..8c558e61e 100644 --- a/platform/darwin/core/local_glyph_rasterizer.mm +++ b/platform/darwin/core/local_glyph_rasterizer.mm @@ -6,6 +6,7 @@ #include +#include #include #import @@ -19,6 +20,14 @@ namespace mbgl { +// 2x bitmap with 1x logical metrics. +constexpr uint32_t kLocalGlyphTextureScale = 2; +constexpr CGFloat kLocalGlyphFontSize = util::ONE_EM * kLocalGlyphTextureScale; +constexpr uint32_t kLocalGlyphLogicalSize = 30; +constexpr uint32_t kLocalGlyphBitmapSize = kLocalGlyphLogicalSize * kLocalGlyphTextureScale; +constexpr CGFloat kLocalGlyphRasterBuffer = Glyph::borderSize * kLocalGlyphTextureScale; +constexpr CGFloat kLocalGlyphTopAdjustment = 26.5; + using CGColorSpaceHandle = CFHandle; using CGContextHandle = CFHandle; using CFStringRefHandle = CFHandle; @@ -35,7 +44,7 @@ using CTLineRefHandle = CFHandle; typesetting text using glyph sheets downloaded from a server. This implementation is similar to the local glyph rasterization in GL JS: - - Only CJK glyphs are drawn locally, because it’s much more noticeable when a + - Only CJK-related BMP ranges are drawn locally, because it’s much more noticeable when a non-CJK font mismatches the style than when a CJK font mismatches the style. (Unlike GL JS, this implementation does respect the font’s metrics, so it does work with variable-width fonts.) @@ -44,8 +53,6 @@ using CTLineRefHandle = CFHandle; This is a first step toward fully local font rendering: . Further improvements: - - Make sure the font size is 24 points (`util::ONE_EM`) at all times, not the - system default of 12 points, to avoid blobbiness after rasterization. - Sniff an appropriate font weight and style from the font stack’s font names, as GL JS and the Android map SDK do. - Enable local glyph rasterization for all writing systems, not just CJK. This @@ -124,7 +131,7 @@ public: if (!fontNames.count) { NSDictionary *fontAttributes = @{ - (NSString *)kCTFontSizeAttribute : @(util::ONE_EM), + (NSString *)kCTFontSizeAttribute : @(kLocalGlyphFontSize), }; return CTFontDescriptorCreateWithAttributes((CFDictionaryRef)fontAttributes); } @@ -136,7 +143,7 @@ public: CFArrayCreateMutable(kCFAllocatorDefault, fontNames.count, &kCFTypeArrayCallBacks)); for (NSString *name in [fontNames subarrayWithRange:NSMakeRange(1, fontNames.count - 1)]) { NSDictionary *fontAttributes = @{ - (NSString *)kCTFontSizeAttribute : @(util::ONE_EM), + (NSString *)kCTFontSizeAttribute : @(kLocalGlyphFontSize), // This attribute is technically supposed to be a font’s // PostScript name, but Core Text will fall back to matching // font display names and font family names. @@ -154,7 +161,7 @@ public: kCTFontCascadeListAttribute, }; CFTypeRef values[] = { - (__bridge CFNumberRef) @(util::ONE_EM), + (__bridge CFNumberRef) @(kLocalGlyphFontSize), mainFontName, *fallbackDescriptors, }; @@ -241,9 +248,11 @@ PremultipliedImage drawGlyphBitmap(GlyphID glyphID, CTFontRef font, GlyphMetrics throw std::runtime_error("Unable to create line from attributed string"); } - Size size(35, 35); - metrics.width = size.width; - metrics.height = size.height; + // Bitmap is allocated at 2x texture resolution; metrics report 1x logical size. + Size size(kLocalGlyphBitmapSize, kLocalGlyphBitmapSize); + metrics.width = kLocalGlyphLogicalSize; + metrics.height = kLocalGlyphLogicalSize; + metrics.isDoubleResolution = true; PremultipliedImage rgbaBitmap(size); @@ -270,16 +279,27 @@ PremultipliedImage drawGlyphBitmap(GlyphID glyphID, CTFontRef font, GlyphMetrics CFRange wholeRunRange = CFRangeMake(0, CTRunGetGlyphCount(glyphRun)); std::vector advances(wholeRunRange.length); CTRunGetAdvances(glyphRun, wholeRunRange, advances.data()); - metrics.advance = std::round(advances[0].width); + // CTRunGetAdvances returns advances measured at the rasterization (2x) font + // size; report the logical 1x value using the historical integer metric. + metrics.advance = std::round(advances[0].width / static_cast(kLocalGlyphTextureScale)); - // Mimic glyph PBF metrics. - metrics.left = Glyph::borderSize; - metrics.top = -Glyph::borderSize; + const CGRect glyphBounds = CTRunGetImageBounds(glyphRun, *context, wholeRunRange); + CGFloat glyphTop = 0.0; + if (!CGRectIsNull(glyphBounds)) { + const CGFloat maxY = CGRectGetMaxY(glyphBounds); + if (std::isfinite(maxY)) { + glyphTop = maxY; + } + } - // Move the text upward to avoid clipping off descenders. - CGFloat descent; - CTRunGetTypographicBounds(glyphRun, wholeRunRange, NULL, &descent, NULL); - CGContextSetTextPosition(*context, 0.0, descent); + // GL JS/TinySDF records glyphTop per character and applies a calibrated + // topAdjustment. Keep the same model here so fallback fonts do not inherit a + // platform-wide fixed top value. + metrics.left = Glyph::borderSize + 0.5f; + metrics.top = glyphTop / kLocalGlyphTextureScale - kLocalGlyphTopAdjustment; + + const CGFloat textBaselineY = size.height - kLocalGlyphRasterBuffer - glyphTop; + CGContextSetTextPosition(*context, 0.0, textBaselineY); CTLineDraw(*line, *context); @@ -318,8 +338,9 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack &fontStack, GlyphID g PremultipliedImage rgbaBitmap = drawGlyphBitmap(glyphID, *font, manufacturedGlyph.metrics, isBold); - Size size(manufacturedGlyph.metrics.width, manufacturedGlyph.metrics.height); + const Size size = rgbaBitmap.size; // Copy alpha values from RGBA bitmap into the AlphaImage output + // The bitmap may be larger than the logical metrics (2x texture resolution). manufacturedGlyph.bitmap = AlphaImage(size); for (uint32_t i = 0; i < size.width * size.height; i++) { manufacturedGlyph.bitmap.data[i] = rgbaBitmap.data[4 * i + 3]; diff --git a/platform/default/src/mbgl/storage/offline_download.cpp b/platform/default/src/mbgl/storage/offline_download.cpp index 4a48c584c..6e840715c 100644 --- a/platform/default/src/mbgl/storage/offline_download.cpp +++ b/platform/default/src/mbgl/storage/offline_download.cpp @@ -341,9 +341,10 @@ void OfflineDownload::activateDownload() { const bool includeIdeographs = std::visit([](auto& reg) { return reg.includeIdeographs; }, definition); for (const auto& fontStack : parser.fontStacks()) { for (char16_t i = 0; i < GLYPH_RANGES_PER_FONT_STACK; i++) { - // Assumes that if a glyph range starts with fixed width/ideographic - // characters, the entire range will be fixed width. - if (includeIdeographs || !util::i18n::allowsFixedWidthGlyphGeneration(i * GLYPHS_PER_GLYPH_RANGE)) { + // Only skip a range when every codepoint in it can be + // generated locally; some ranges (e.g. 0xFF00) are mixed. + if (includeIdeographs || + !util::i18n::glyphRangeIsEntirelyLocallyGenerated(i * GLYPHS_PER_GLYPH_RANGE)) { auto range = getGlyphRange(i * GLYPHS_PER_GLYPH_RANGE); queueResource(Resource::glyphs( parser.glyphURL, fontStack, std::pair{range.first, range.second})); diff --git a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp index bbae70a72..61ecd7ee4 100644 --- a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp +++ b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp @@ -7,9 +7,15 @@ #include #include #include - namespace mbgl { +// 2x bitmap with 1x logical metrics. +constexpr int kLocalGlyphTextureScale = 2; +constexpr uint32_t kLocalGlyphLogicalSize = 30; +constexpr uint32_t kLocalGlyphBitmapSize = kLocalGlyphLogicalSize * kLocalGlyphTextureScale; +constexpr int kLocalGlyphRasterBuffer = Glyph::borderSize * kLocalGlyphTextureScale; +constexpr double kLocalGlyphTopAdjustment = 26.5; + class LocalGlyphRasterizer::Impl { public: Impl(const std::optional& fontFamily_); @@ -25,7 +31,7 @@ LocalGlyphRasterizer::Impl::Impl(const std::optional& fontFamily_) : fontFamily(fontFamily_) { if (isConfigured()) { font.setFamily(QString::fromStdString(*fontFamily)); - font.setPixelSize(util::ONE_EM); + font.setPixelSize(util::ONE_EM * kLocalGlyphTextureScale); metrics = QFontMetrics(font); } } @@ -53,25 +59,39 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { return glyph; } - glyph.metrics.width = impl->metrics->horizontalAdvance(glyphID.complex.code); - glyph.metrics.height = impl->metrics->height(); - glyph.metrics.left = 3; - glyph.metrics.top = -8; + // QFontMetrics returns measurements at the 2x rasterization pixel size; the + // glyph's metrics are reported in 1x logical units. + const QString text(QChar(glyphID.complex.code)); + const int advance2x = impl->metrics->horizontalAdvance(glyphID.complex.code); + const int height2x = impl->metrics->height(); + const QRect glyphBounds = impl->metrics->tightBoundingRect(text); + const int glyphTop2x = std::max(0, -glyphBounds.top()); + glyph.metrics.width = advance2x / kLocalGlyphTextureScale; + glyph.metrics.height = height2x / kLocalGlyphTextureScale; + glyph.metrics.left = 3.5f; + glyph.metrics.top = glyphTop2x / static_cast(kLocalGlyphTextureScale) - kLocalGlyphTopAdjustment; glyph.metrics.advance = glyph.metrics.width; + glyph.metrics.isDoubleResolution = true; - // Set width of a glyph's backing image to be util::ONE_EM. - Size size(util::ONE_EM, glyph.metrics.height); + // The backing image is drawn at 2x texture resolution. + Size size(kLocalGlyphBitmapSize, kLocalGlyphBitmapSize); QImage image(QSize(size.width, size.height), QImage::Format_Alpha8); image.fill(qRgba(0, 0, 0, 0)); QPainter painter(&image); painter.setFont(impl->font); painter.setRenderHints(QPainter::TextAntialiasing); - // Render at constant baseline, to align with glyphs that are rendered by node-fontnik. - painter.drawText(QPointF(0, 20), QString(QChar(glyphID.complex.code))); + // Align the glyph using its measured top, matching the local TinySDF path + // in GL JS rather than relying on a platform-wide fixed top value. + const double baselineY = kLocalGlyphRasterBuffer + glyphTop2x; + painter.drawText(QPointF(0, baselineY), text); - auto img = std::make_unique(image.sizeInBytes()); - memcpy(img.get(), image.constBits(), image.sizeInBytes()); + // QImage::Format_Alpha8 may pad each row for alignment. Copy row-by-row + // using the unpadded width so AlphaImage's tight layout matches. + auto img = std::make_unique(static_cast(size.width) * size.height); + for (uint32_t y = 0; y < size.height; ++y) { + std::memcpy(img.get() + static_cast(y) * size.width, image.constScanLine(y), size.width); + } glyph.bitmap = AlphaImage{size, std::move(img)}; diff --git a/src/mbgl/text/glyph_manager.cpp b/src/mbgl/text/glyph_manager.cpp index a617e9e56..59e6eae48 100644 --- a/src/mbgl/text/glyph_manager.cpp +++ b/src/mbgl/text/glyph_manager.cpp @@ -71,7 +71,8 @@ void GlyphManager::getGlyphs(GlyphRequestor& requestor, GlyphDependencies glyphD Glyph GlyphManager::generateLocalSDF(const FontStack& fontStack, GlyphID glyphID) { Glyph local = localGlyphRasterizer->rasterizeGlyph(fontStack, glyphID); - local.bitmap = util::transformRasterToSDF(local.bitmap, 8, .25); + const double radius = local.metrics.isDoubleResolution ? 16.0 : 8.0; + local.bitmap = util::transformRasterToSDF(local.bitmap, radius, .25); return local; } diff --git a/src/mbgl/text/local_glyph_rasterizer.hpp b/src/mbgl/text/local_glyph_rasterizer.hpp index 69550b3ed..fa931c34e 100644 --- a/src/mbgl/text/local_glyph_rasterizer.hpp +++ b/src/mbgl/text/local_glyph_rasterizer.hpp @@ -11,21 +11,13 @@ namespace mbgl { the glyph and appropriate metrics. GlyphManager will then use TinySDF to transform the rasterized bitmap into an SDF. - The JS equivalent of this functionality will only generate glyphs in the - 'CJK Unified Ideographs' and 'Hangul Syllables' ranges, for which it can - get away with rendering a fixed 30px square image and GlyphMetrics of: - - width: 24, - height: 24, - left: 0, - top: -8, - advance: 24 - - The JS equivalent also uses heuristic evaluation of the font stack name - to control the font-weight it uses during rasterization. + The shared default codepoint filter is + util::i18n::allowsFixedWidthGlyphGeneration. + Following maplibre-gl-js, platform implementations use 2x bitmaps with + 1x metrics via GlyphMetrics::isDoubleResolution. It is left to platform-specific implementation to decide how best to - map a FontStack to a particular rasterization. + map a FontStack to a particular rasterization (font, weight, style). The default implementation simply refuses to rasterize any glyphs. */ diff --git a/src/mbgl/text/quads.cpp b/src/mbgl/text/quads.cpp index 800121af4..e5e7fde68 100644 --- a/src/mbgl/text/quads.cpp +++ b/src/mbgl/text/quads.cpp @@ -267,11 +267,15 @@ SymbolQuads getGlyphQuads(const Shaping& shapedText, builtInOffset = {0.0f, 0.0f}; } + // rectBuffer is in 1x logical units; only rect.w/h carry the texture + // scale. GL JS keeps 2x glyphs centered by storing fractional + // left/top metrics, so native local glyphs do the same. + const float textureScale = positionedGlyph.metrics.isDoubleResolution ? 2.0f : 1.0f; const float x1 = (positionedGlyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset.x; const float y1 = (-positionedGlyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset.y; - const float x2 = x1 + rect.w * positionedGlyph.scale / pixelRatio; - const float y2 = y1 + rect.h * positionedGlyph.scale / pixelRatio; + const float x2 = x1 + rect.w / textureScale * positionedGlyph.scale / pixelRatio; + const float y2 = y1 + rect.h / textureScale * positionedGlyph.scale / pixelRatio; Point tl{x1, y1}; Point tr{x2, y1}; diff --git a/src/mbgl/util/i18n.cpp b/src/mbgl/util/i18n.cpp index b2b35ddb9..8926a110f 100644 --- a/src/mbgl/util/i18n.cpp +++ b/src/mbgl/util/i18n.cpp @@ -18,6 +18,10 @@ namespace { return codepoint >= (first) && codepoint <= (last); \ } +inline bool isInRange(char16_t codepoint, char16_t first, char16_t last) { + return codepoint >= first && codepoint <= last; +} + // The following table comes from . // Keep it synchronized with . @@ -411,8 +415,59 @@ bool allowsIdeographicBreaking(char16_t chr) { } bool allowsFixedWidthGlyphGeneration(char16_t chr) { - // Mirrors conservative set of characters used in glyph_manager.js/_tinySDF - return isInCJKUnifiedIdeographs(chr) || isInHangulSyllables(chr) || isInKatakana(chr) || isInHiragana(chr); + // Mirrors the BMP ranges in GL JS's codePointUsesLocalIdeographFontFamily. + // Astral-plane ranges are not included because GlyphID only carries BMP + // codepoints for local glyph generation. + return + // Bopomofo tone marks. + isInRange(chr, 0x02EA, 0x02EB) || + // Hangul Jamo. + isInHangulJamo(chr) || + // CJK Radicals Supplement, Kangxi Radicals. + isInCJKRadicalsSupplement(chr) || isInKangxiRadicals(chr) || + // CJK Symbols and Punctuation, Hiragana, Katakana. + isInCJKSymbolsandPunctuation(chr) || isInHiragana(chr) || isInKatakana(chr) || + // Bopomofo. + isInRange(chr, 0x3105, 0x312F) || + // Hangul Compatibility Jamo. + isInRange(chr, 0x3131, 0x318E) || + // Bopomofo Extended through CJK Unified Ideographs Extension A. + isInBopomofoExtended(chr) || isInCJKStrokes(chr) || isInKatakanaPhoneticExtensions(chr) || + isInEnclosedCJKLettersandMonths(chr) || isInCJKCompatibility(chr) || isInCJKUnifiedIdeographsExtensionA(chr) || + // CJK Unified Ideographs and Yi Syllables. + isInCJKUnifiedIdeographs(chr) || isInRange(chr, 0xA000, 0xA48C) || + // Yi Radicals. + isInRange(chr, 0xA490, 0xA4C6) || + // Hangul Jamo Extended-A. + isInRange(chr, 0xA960, 0xA97C) || + // Hangul Syllables and Hangul Jamo Extended-B. + isInHangulSyllables(chr) || isInRange(chr, 0xD7B0, 0xD7C6) || + // Hangul Jamo Extended-B. + isInRange(chr, 0xD7CB, 0xD7FB) || + // CJK Compatibility Ideographs. + isInRange(chr, 0xF900, 0xFA6D) || + // CJK Compatibility Ideographs. + isInRange(chr, 0xFA70, 0xFAD9) || + // Vertical Forms. + isInVerticalForms(chr) || + // CJK Compatibility Forms. + isInCJKCompatibilityForms(chr) || + // Halfwidth and Fullwidth Forms. + isInHalfwidthandFullwidthForms(chr); +} + +bool glyphRangeIsEntirelyLocallyGenerated(char16_t rangeStart) { + // Some ranges (notably 0xFF00, where Halfwidth/Fullwidth Forms ends at + // 0xFFEF and the Specials block continues to 0xFFFD) mix locally-rendered + // and non-local codepoints, so it is not safe to infer the whole range + // from the first codepoint alone. + constexpr uint32_t glyphsPerRange = 256; + for (uint32_t offset = 0; offset < glyphsPerRange; ++offset) { + if (!allowsFixedWidthGlyphGeneration(static_cast(rangeStart + offset))) { + return false; + } + } + return true; } bool allowsVerticalWritingMode(const std::u16string& string) { diff --git a/src/mbgl/util/i18n.hpp b/src/mbgl/util/i18n.hpp index 6d53aa371..0367b800f 100644 --- a/src/mbgl/util/i18n.hpp +++ b/src/mbgl/util/i18n.hpp @@ -27,6 +27,10 @@ bool allowsIdeographicBreaking(char16_t chr); advances */ bool allowsFixedWidthGlyphGeneration(char16_t chr); +/** Returns whether the whole 256-codepoint glyph range can be generated + locally. Use this for range-level decisions because some ranges are mixed. */ +bool glyphRangeIsEntirelyLocallyGenerated(char16_t rangeStart); + /** Returns whether any substring of the given string can be drawn as vertical text with upright glyphs. */ bool allowsVerticalWritingMode(const std::u16string& string); diff --git a/test/fixtures/local_glyphs/noto_sans_cjk_kr_regular_qt/expected.png b/test/fixtures/local_glyphs/noto_sans_cjk_kr_regular_qt/expected.png index 0d69075172f3d260e4e61592e3be349718969752..34b17688124ca17bfd432fc6930172d35fa52bf2 100644 GIT binary patch literal 27039 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 literal 27980 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 diff --git a/test/fixtures/local_glyphs/ping_fang/expected.png b/test/fixtures/local_glyphs/ping_fang/expected.png index 9bb78c9f756cb0175d9ff7b98c154ff53428ab80..a4e34459b25034e73d225aa4dc7f9a366c9bebab 100644 GIT binary patch literal 18191 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

M^zT*@yI3VWN7 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 H3oY+IsM`fP literal 18279 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 TUG6am(80EcL~gAK=H~tfKYAAZ diff --git a/test/fixtures/local_glyphs/ping_fang_with_bold_in_style/expected.png b/test/fixtures/local_glyphs/ping_fang_with_bold_in_style/expected.png index 8665da2ea6e855dfb283199cd507a0b0d18c5cac..11b1fee9be2cbbd792f2cc1ca4f47c44cda2e91b 100644 GIT binary patch literal 18526 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 bPJ!My|G*pi!tNpk3Ty#ecKDVvIKqDcCbtU2 literal 17875 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 #include #include +#include #include #include #include @@ -346,10 +347,10 @@ TEST(OfflineDownload, ExcludeIdeographs) { observer->statusChangedFn = [&](OfflineRegionStatus status) { if (status.complete()) { EXPECT_EQ(status.completedTileCount, status.requiredTileCount); - EXPECT_EQ(138u, - status.completedResourceCount); // 130 glyphs, 2 sprite images, - // 2 sprite jsons, 1 tile, 1 - // style, source, image + EXPECT_EQ(NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK + 8u, + status.completedResourceCount); // glyph ranges, 2 sprite images, + // 2 sprite jsons, 1 tile, 1 style, + // source, image EXPECT_EQ(test.size, status.completedResourceSize); download.setState(OfflineRegionDownloadState::Inactive); diff --git a/test/text/glyph_manager.test.cpp b/test/text/glyph_manager.test.cpp index eea738737..176894225 100644 --- a/test/text/glyph_manager.test.cpp +++ b/test/text/glyph_manager.test.cpp @@ -119,6 +119,13 @@ public: } }; +class KatakanaOnlyLocalGlyphRasterizer : public StubLocalGlyphRasterizer { +public: + bool canRasterizeGlyph(const FontStack&, GlyphID glyphID) override { + return static_cast(glyphID) == u'テ'; + } +}; + class StubGlyphManagerObserver : public GlyphManagerObserver { public: void onGlyphsLoaded(const FontStack& fontStack, const GlyphRange& glyphRange) override { @@ -148,7 +155,11 @@ public: StubFileSource fileSource; StubGlyphManagerObserver observer; StubGlyphRequestor requestor; - GlyphManager glyphManager{std::make_unique()}; + GlyphManager glyphManager; + + GlyphManagerTest( + std::unique_ptr localGlyphRasterizer = std::make_unique()) + : glyphManager(std::move(localGlyphRasterizer)) {} void run(const std::string& url, GlyphDependencies dependencies) { // Squelch logging. @@ -317,8 +328,40 @@ TEST(GlyphManager, LoadLocalCJKGlyph) { GlyphDependencies{.glyphs = {{{{"Test Stack"}}, {u'中'}}}, .shapes = {}}); } -TEST(GlyphManager, LoadLocalCJKGlyphAfterLoadingRangeFromURL) { +TEST(GlyphManager, LoadLocalCJKSymbols) { GlyphManagerTest test; + int glyphResponses = 0; + + test.fileSource.glyphsResponse = [&](const Resource&) { + glyphResponses++; + return std::optional(); + }; + + test.observer.glyphsLoaded = [&](const FontStack&, const GlyphRange&) { + glyphResponses++; + }; + + test.requestor.glyphsAvailable = [&](GlyphMap glyphs) { + EXPECT_EQ(glyphResponses, 0); // Local generation should prevent requesting any glyphs. + + const auto& testPositions = glyphs.at(FontStackHasher()({{"Test Stack"}})); + + ASSERT_EQ(testPositions.size(), 2u); + ASSERT_EQ(testPositions.count(u'〒'), 1u); + ASSERT_EQ(testPositions.count(u'!'), 1u); + + test.end(); + }; + + test.run("test/fixtures/resources/glyphs.pbf", + GlyphDependencies{.glyphs = {{{{"Test Stack"}}, {u'〒', u'!'}}}, .shapes = {}}); +} + +TEST(GlyphManager, LocalCJKGlyphPrefersLocalRasterizationOverRange) { + // Verifies that locally-rasterized glyphs (like テ) are produced by the + // local rasterizer instead of using a glyph from an already-loaded PBF + // range. + GlyphManagerTest test(std::make_unique()); bool firstGlyphResponse = false; test.fileSource.glyphsResponse = [&](const Resource&) { @@ -337,9 +380,6 @@ TEST(GlyphManager, LoadLocalCJKGlyphAfterLoadingRangeFromURL) { ASSERT_EQ(testPositions.size(), 1u); ASSERT_EQ(testPositions.count(u'々'), 1u); - // Katakana letter te, should be locally rasterized - // instead of using the glyph recieved from the range - // for the ideagraphic mark test.glyphManager.getGlyphs(test.requestor, GlyphDependencies{.glyphs = {{{{"Test Stack"}}, {u'テ'}}}, // 0x30c6 .shapes = {}}, @@ -443,3 +483,16 @@ TEST(GlyphManager, ImmediateFileSource) { test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{.glyphs = {{{{"Test Stack"}}, {u'a', u'å', u' '}}}, .shapes = {}}); } + +// Guards against silent drift between allowsFixedWidthGlyphGeneration's range +// coverage and the precomputed NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK used +// for offline download progress estimation. +TEST(i18n, GlyphRangeLocalGenerationCountMatchesConstant) { + uint32_t locallyGeneratedRanges = 0; + for (uint32_t i = 0; i < GLYPH_RANGES_PER_FONT_STACK; ++i) { + if (util::i18n::glyphRangeIsEntirelyLocallyGenerated(static_cast(i * GLYPHS_PER_GLYPH_RANGE))) { + ++locallyGeneratedRanges; + } + } + EXPECT_EQ(GLYPH_RANGES_PER_FONT_STACK - locallyGeneratedRanges, NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK); +} diff --git a/test/text/local_glyph_rasterizer.test.cpp b/test/text/local_glyph_rasterizer.test.cpp index 1922aacd9..94929a12a 100644 --- a/test/text/local_glyph_rasterizer.test.cpp +++ b/test/text/local_glyph_rasterizer.test.cpp @@ -65,7 +65,7 @@ TEST(LocalGlyphRasterizer, PingFang) { test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); #if defined(__APPLE__) && !defined(__QT__) - test.checkRendering("ping_fang", 0.0161); + test.checkRendering("ping_fang", 0.025); #elif defined(__QT__) test.checkRendering("ping_fang_qt"); #endif // defined(__APPLE__) @@ -77,7 +77,7 @@ TEST(LocalGlyphRasterizer, PingFangWithBoldInStyle) { ss << std::regex_replace( util::read_file("test/fixtures/local_glyphs/mixed.json"), std::regex("NotoCJK"), "NotoCJK Bold"); test.map.getStyle().loadJSON(ss.str()); - test.checkRendering("ping_fang_with_bold_in_style"); + test.checkRendering("ping_fang_with_bold_in_style", 0.05); } #if !defined(__QT__) @@ -85,7 +85,7 @@ TEST(LocalGlyphRasterizer, PingFangSemibold) { LocalGlyphRasterizerTest test(std::string("PingFang TC Semibold")); test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); - test.checkRendering("ping_fang_semibold", 0.0161); + test.checkRendering("ping_fang_semibold", 0.025); } #endif // !defined(__QT__) diff --git a/test/text/quads.test.cpp b/test/text/quads.test.cpp index af88238b0..424cef718 100644 --- a/test/text/quads.test.cpp +++ b/test/text/quads.test.cpp @@ -10,6 +10,55 @@ using namespace mbgl; using namespace mbgl::style; +// Atlas padding is not scaled with textureScale, so a 2x glyph quad is 1 +// logical pixel smaller than its 1x equivalent. GL JS-style fractional metrics +// keep its center aligned with the 1x quad. +TEST(getGlyphQuads, DoubleResolutionGlyphPreservesLogicalQuadSize) { + GlyphMetrics metrics1x; + metrics1x.width = 24; + metrics1x.height = 24; + metrics1x.left = 0; + metrics1x.top = -8; + metrics1x.advance = 24; + metrics1x.isDoubleResolution = false; + + GlyphMetrics metrics2x = metrics1x; + metrics2x.left += 0.5f; + metrics2x.top -= 0.5f; + metrics2x.isDoubleResolution = true; + + // Rects reflect the real DynamicTextureAtlas output: bitmap.size + 2 * + // ImagePosition::padding (= 2). 1x bitmap 30 -> rect 32; 2x bitmap 60 -> rect 62. + Shaping shapedText1x; + shapedText1x.positionedLines.emplace_back(); + shapedText1x.positionedLines.back().positionedGlyphs.emplace_back( + PositionedGlyph(u'A', 0.0f, 0.0f, false, 0, 1.0f, Rect(0, 0, 32, 32), metrics1x, std::nullopt)); + + Shaping shapedText2x; + shapedText2x.positionedLines.emplace_back(); + shapedText2x.positionedLines.back().positionedGlyphs.emplace_back( + PositionedGlyph(u'A', 0.0f, 0.0f, false, 0, 1.0f, Rect(0, 0, 62, 62), metrics2x, std::nullopt)); + + SymbolLayoutProperties::Evaluated layout; + SymbolQuads quads1x = getGlyphQuads(shapedText1x, {{0, 0}}, layout, SymbolPlacementType::Point, {}, false); + SymbolQuads quads2x = getGlyphQuads(shapedText2x, {{0, 0}}, layout, SymbolPlacementType::Point, {}, false); + + ASSERT_EQ(quads1x.size(), 1u); + ASSERT_EQ(quads2x.size(), 1u); + + // The 2x quad is 1 logical pixel smaller, and shifted by 0.5px to keep the + // same center as the 1x quad. + EXPECT_FLOAT_EQ(quads1x[0].tl.x + 0.5f, quads2x[0].tl.x); + EXPECT_FLOAT_EQ(quads1x[0].tl.y + 0.5f, quads2x[0].tl.y); + EXPECT_FLOAT_EQ(quads1x[0].br.x - 0.5f, quads2x[0].br.x); + EXPECT_FLOAT_EQ(quads1x[0].br.y - 0.5f, quads2x[0].br.y); + + EXPECT_FLOAT_EQ(quads1x[0].br.x - quads1x[0].tl.x, 32.0f); + EXPECT_FLOAT_EQ(quads2x[0].br.x - quads2x[0].tl.x, 31.0f); + EXPECT_FLOAT_EQ(quads1x[0].br.y - quads1x[0].tl.y, 32.0f); + EXPECT_FLOAT_EQ(quads2x[0].br.y - quads2x[0].tl.y, 31.0f); +} + TEST(getIconQuads, normal) { SymbolLayoutProperties::Evaluated layout; Anchor anchor(2.0, 3.0, 0.0, 0);