diff options
Diffstat (limited to 'platform/android/src/text/local_glyph_rasterizer.cpp')
-rw-r--r-- | platform/android/src/text/local_glyph_rasterizer.cpp | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/platform/android/src/text/local_glyph_rasterizer.cpp b/platform/android/src/text/local_glyph_rasterizer.cpp deleted file mode 100644 index c65c3ae439..0000000000 --- a/platform/android/src/text/local_glyph_rasterizer.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include <mbgl/text/local_glyph_rasterizer.hpp> -#include <mbgl/util/i18n.hpp> -#include <mbgl/util/platform.hpp> - -#include <jni/jni.hpp> - -#include "../attach_env.hpp" -#include "../bitmap.hpp" - -#include "local_glyph_rasterizer_jni.hpp" - -/* - Android implementation of LocalGlyphRasterizer: - Draws CJK glyphs using locally available fonts. - - Follows pattern of GL JS implementation in that: - - Only CJK glyphs are drawn locally (because we can guess their metrics effectively) - * Render size/metrics determined experimentally using Noto Sans - - Configuration is done at map creation time by setting a "font family" - * JS uses a CSS font-family, this uses android.graphics.Typeface - https://developer.android.com/reference/android/graphics/Typeface.html - - We use heuristics to extract a font-weight based on the incoming font stack - * JS tries to extract multiple weights, this implementation only looks for - "bold" - - mbgl::LocalGlyphRasterizer is the portable interface - mbgl::LocalGlyphRasterizer::Impl stores platform-specific configuration data - mbgl::android::LocalGlyphRasterizer is the JNI wrapper - com.mapbox.mapboxsdk.text.LocalGlyphRasterizer is the Java implementation that - actually does the drawing - */ - -namespace mbgl { -namespace android { - -LocalGlyphRasterizer::LocalGlyphRasterizer() { - UniqueEnv env { AttachEnv() }; - - static auto& javaClass = jni::Class<LocalGlyphRasterizer>::Singleton(*env); - static auto constructor = javaClass.GetConstructor(*env); - - javaObject = jni::NewGlobal(*env, javaClass.New(*env, constructor)); -} - -PremultipliedImage LocalGlyphRasterizer::drawGlyphBitmap(const std::string& fontFamily, const bool bold, const GlyphID glyphID) { - UniqueEnv env { AttachEnv() }; - - static auto& javaClass = jni::Class<LocalGlyphRasterizer>::Singleton(*env); - static auto drawGlyphBitmap = javaClass.GetMethod<jni::Object<Bitmap> (jni::String, jni::jboolean, jni::jchar)>(*env, "drawGlyphBitmap"); - - return Bitmap::GetImage(*env, - javaObject.Call(*env, - drawGlyphBitmap, - jni::Make<jni::String>(*env, fontFamily), - static_cast<jni::jboolean>(bold), - static_cast<jni::jchar>(glyphID))); -} - -void LocalGlyphRasterizer::registerNative(jni::JNIEnv& env) { - jni::Class<LocalGlyphRasterizer>::Singleton(env); -} - -} // namespace android - -class LocalGlyphRasterizer::Impl { -public: - Impl(const optional<std::string> fontFamily_) - : fontFamily(fontFamily_) - {} - - bool isConfigured() const { - return bool(fontFamily); - } - - PremultipliedImage drawGlyphBitmap(const FontStack& fontStack, GlyphID glyphID) { - bool bold = false; - for (auto font : fontStack) { - std::string lowercaseFont = platform::lowercase(font); - if (lowercaseFont.find("bold") != std::string::npos) { - bold = true; - break; - } - } - return androidLocalGlyphRasterizer.drawGlyphBitmap(*fontFamily, bold, glyphID); - } - -private: - optional<std::string> fontFamily; - android::LocalGlyphRasterizer androidLocalGlyphRasterizer; -}; - -LocalGlyphRasterizer::LocalGlyphRasterizer(const optional<std::string>& fontFamily) - : impl(std::make_unique<Impl>(fontFamily)) {} - -LocalGlyphRasterizer::~LocalGlyphRasterizer() -{} - -bool LocalGlyphRasterizer::canRasterizeGlyph(const FontStack&, GlyphID glyphID) { - return util::i18n::allowsFixedWidthGlyphGeneration(glyphID) && impl->isConfigured(); -} - -Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack& fontStack, GlyphID glyphID) { - Glyph fixedMetrics; - if (!impl->isConfigured()) { - return fixedMetrics; - } - - fixedMetrics.id = glyphID; - - Size size(35, 35); - - fixedMetrics.metrics.width = size.width; - fixedMetrics.metrics.height = size.height; - fixedMetrics.metrics.left = 3; - fixedMetrics.metrics.top = -10; - fixedMetrics.metrics.advance = 24; - - PremultipliedImage rgbaBitmap = impl->drawGlyphBitmap(fontStack, glyphID); - - // 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++) { - 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]); - } - - return fixedMetrics; -} - -} // namespace mbgl |