diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-08-23 18:34:26 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-08-26 17:06:43 +0300 |
commit | 0bd797fa51f8ac00143c034291a1593201646e74 (patch) | |
tree | 4b303a77df74283475e05abab6e0870bb038f197 | |
parent | 2a8359b0280e861450f9bdf390a01e0363202b3a (diff) | |
download | qtlocation-mapboxgl-0bd797fa51f8ac00143c034291a1593201646e74.tar.gz |
[core][qt] Check if QFont supports glyph and adjust backing image width
- Don't rasterize glyphs if font does not support requested code point
- Render symbols at hardcoded baseline, so that locally rasterized glyphs
align better with server side generated fonts.
- Resize backing QImage width to be at least 24px
-rw-r--r-- | platform/qt/src/local_glyph_rasterizer.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/platform/qt/src/local_glyph_rasterizer.cpp b/platform/qt/src/local_glyph_rasterizer.cpp index 3f8df5d876..0e31265c5e 100644 --- a/platform/qt/src/local_glyph_rasterizer.cpp +++ b/platform/qt/src/local_glyph_rasterizer.cpp @@ -1,5 +1,6 @@ #include <mbgl/text/local_glyph_rasterizer.hpp> #include <mbgl/util/i18n.hpp> +#include <mbgl/util/constants.hpp> #include <QtCore/QFile> #include <QtGui/QFont> @@ -17,6 +18,7 @@ public: optional<std::string> fontFamily; QFont font; + optional<QFontMetrics> metrics; }; LocalGlyphRasterizer::Impl::Impl(const optional<std::string> fontFamily_) @@ -24,6 +26,7 @@ LocalGlyphRasterizer::Impl::Impl(const optional<std::string> fontFamily_) if (isConfigured()) { font.setFamily(QString::fromStdString(*fontFamily)); font.setPixelSize(24); + metrics = QFontMetrics(font); } } @@ -39,29 +42,34 @@ LocalGlyphRasterizer::~LocalGlyphRasterizer() { } bool LocalGlyphRasterizer::canRasterizeGlyph(const FontStack&, GlyphID glyphID) { - return util::i18n::allowsFixedWidthGlyphGeneration(glyphID) && impl->isConfigured(); + return impl->isConfigured() && impl->metrics->inFont(glyphID) && util::i18n::allowsFixedWidthGlyphGeneration(glyphID); } Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { Glyph glyph; glyph.id = glyphID; - QFontMetrics metrics(impl->font); - Size size(metrics.width(glyphID), metrics.height()); + if (!impl->isConfigured()) { + assert(false); + return glyph; + } - glyph.metrics.width = size.width; - glyph.metrics.height = size.height; + glyph.metrics.width = impl->metrics->width(glyphID); + glyph.metrics.height = impl->metrics->height(); glyph.metrics.left = 3; glyph.metrics.top = -8; - glyph.metrics.advance = metrics.width(glyphID); + glyph.metrics.advance = glyph.metrics.width; + // Adjust width of a glyph's image. + float adjustedWidth = glyph.metrics.width + util::ONE_EM - glyph.metrics.width; + Size size(adjustedWidth, glyph.metrics.height); 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); - painter.drawText(QPointF(0, metrics.ascent()), QString(QChar(glyphID))); + // Render at constant baseline, to align with glyphs that are rendered by node-fontnik. + painter.drawText(QPointF(0, 20), QString(QChar(glyphID))); auto img = std::make_unique<uint8_t[]>(image.byteCount()); memcpy(img.get(), image.constBits(), image.byteCount()); |