summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-08-23 18:34:26 +0300
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2019-08-26 17:06:43 +0300
commit0bd797fa51f8ac00143c034291a1593201646e74 (patch)
tree4b303a77df74283475e05abab6e0870bb038f197
parent2a8359b0280e861450f9bdf390a01e0363202b3a (diff)
downloadqtlocation-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.cpp24
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());