From 513b50eee80cb72fe38fd42dd99527c3b6ef7800 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Thu, 3 Jan 2019 09:54:13 -0400 Subject: [Qt] Implement LocalGlyphRasterizer --- platform/qt/qt.cmake | 2 +- platform/qt/src/local_glyph_rasterizer.cpp | 74 +++++++++++++++++++++ .../local_glyphs/ping_fang_qt/expected.png | Bin 0 -> 25026 bytes test/text/local_glyph_rasterizer.test.cpp | 9 ++- 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 platform/qt/src/local_glyph_rasterizer.cpp create mode 100644 test/fixtures/local_glyphs/ping_fang_qt/expected.png diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index a7b48ac4b1..e651b8c0c7 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -29,6 +29,7 @@ set(MBGL_QT_CORE_FILES # Platform integration PRIVATE platform/qt/src/async_task.cpp PRIVATE platform/qt/src/async_task_impl.hpp + PRIVATE platform/qt/src/local_glyph_rasterizer.cpp PRIVATE platform/qt/src/qt_logging.cpp PRIVATE platform/qt/src/qt_image.cpp PRIVATE platform/qt/src/run_loop.cpp @@ -38,7 +39,6 @@ set(MBGL_QT_CORE_FILES PRIVATE platform/qt/src/timer_impl.hpp PRIVATE platform/qt/src/utf.cpp - PRIVATE platform/default/src/mbgl/text/local_glyph_rasterizer.cpp PRIVATE platform/default/src/mbgl/text/collator.cpp PRIVATE platform/default/src/mbgl/text/unaccent.cpp PRIVATE platform/default/include/mbgl/text/unaccent.hpp diff --git a/platform/qt/src/local_glyph_rasterizer.cpp b/platform/qt/src/local_glyph_rasterizer.cpp new file mode 100644 index 0000000000..3f8df5d876 --- /dev/null +++ b/platform/qt/src/local_glyph_rasterizer.cpp @@ -0,0 +1,74 @@ +#include +#include + +#include +#include +#include +#include +#include + +namespace mbgl { + +class LocalGlyphRasterizer::Impl { +public: + Impl(const optional fontFamily_); + + bool isConfigured() const; + + optional fontFamily; + QFont font; +}; + +LocalGlyphRasterizer::Impl::Impl(const optional fontFamily_) + : fontFamily(fontFamily_) { + if (isConfigured()) { + font.setFamily(QString::fromStdString(*fontFamily)); + font.setPixelSize(24); + } +} + +bool LocalGlyphRasterizer::Impl::isConfigured() const { + return fontFamily.operator bool(); +} + +LocalGlyphRasterizer::LocalGlyphRasterizer(const optional fontFamily) + : impl(std::make_unique(fontFamily)) { +} + +LocalGlyphRasterizer::~LocalGlyphRasterizer() { +} + +bool LocalGlyphRasterizer::canRasterizeGlyph(const FontStack&, GlyphID glyphID) { + return util::i18n::allowsFixedWidthGlyphGeneration(glyphID) && impl->isConfigured(); +} + +Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { + Glyph glyph; + glyph.id = glyphID; + + QFontMetrics metrics(impl->font); + Size size(metrics.width(glyphID), metrics.height()); + + glyph.metrics.width = size.width; + glyph.metrics.height = size.height; + glyph.metrics.left = 3; + glyph.metrics.top = -8; + glyph.metrics.advance = metrics.width(glyphID); + + 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))); + + auto img = std::make_unique(image.byteCount()); + memcpy(img.get(), image.constBits(), image.byteCount()); + + glyph.bitmap = AlphaImage { size, std::move(img) }; + + return glyph; +} + +} // namespace mbgl diff --git a/test/fixtures/local_glyphs/ping_fang_qt/expected.png b/test/fixtures/local_glyphs/ping_fang_qt/expected.png new file mode 100644 index 0000000000..465bce5b77 Binary files /dev/null and b/test/fixtures/local_glyphs/ping_fang_qt/expected.png differ diff --git a/test/text/local_glyph_rasterizer.test.cpp b/test/text/local_glyph_rasterizer.test.cpp index 84c685d66f..0dfec1689a 100644 --- a/test/text/local_glyph_rasterizer.test.cpp +++ b/test/text/local_glyph_rasterizer.test.cpp @@ -52,7 +52,8 @@ public: } // end namespace -#ifdef __APPLE__ +// Enabling Qt requires adding a CJK-compatible font in the CI image. +#if defined(__APPLE__) TEST(LocalGlyphRasterizer, PingFang) { LocalGlyphRasterizerTest test(std::string("PingFang")); @@ -64,10 +65,14 @@ TEST(LocalGlyphRasterizer, PingFang) { return response; }; test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); +#if defined(__APPLE__) test.checkRendering("ping_fang"); +#elif defined(__QT__) + test.checkRendering("ping_fang_qt"); +#endif // defined(__APPLE__) } -#endif +#endif // defined(__APPLE__) TEST(LocalGlyphRasterizer, NoLocal) { // Expectation: without any local fonts set, and without any CJK glyphs provided, -- cgit v1.2.1