From 1633caef58ebd0bc3b0c5da15dde2fb425b77c43 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 4 Jun 2014 13:46:35 -0700 Subject: [PATCH] Query style from asset-created font (Minikin) This patch sets fStyle on the TypefaceImpl based on querying the font, which is important in the Typeface.createFromAsset path. This fixes both the style returned from getStyle() and also selects fallback fonts to best match the style of the main font. Fixes bug 15429916: "Typeface.getStyle always returning 0 in some L devices". Change-Id: I1992ba1e65e7f488d331e175f5f12843f67c2faa --- core/jni/android/graphics/TypefaceImpl.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/core/jni/android/graphics/TypefaceImpl.cpp b/core/jni/android/graphics/TypefaceImpl.cpp index ff52b07740efd..786d19c494861 100644 --- a/core/jni/android/graphics/TypefaceImpl.cpp +++ b/core/jni/android/graphics/TypefaceImpl.cpp @@ -134,18 +134,19 @@ static TypefaceImpl* createFromSkTypeface(SkTypeface* typeface) { return result; } +// Delete when removing USE_MINIKIN ifdef TypefaceImpl* TypefaceImpl_createFromName(const char* name, SkTypeface::Style style) { - // TODO: should create a font collection with all styles corresponding to - // the name SkTypeface* face = SkTypeface::CreateFromName(name, style); return createFromSkTypeface(face); } +// Delete when removing USE_MINIKIN ifdef TypefaceImpl* TypefaceImpl_createFromFile(const char* filename) { SkTypeface* face = SkTypeface::CreateFromFile(filename); return createFromSkTypeface(face); } +// Delete when removing USE_MINIKIN ifdef TypefaceImpl* TypefaceImpl_createFromAsset(Asset* asset) { SkStream* stream = new AssetStreamAdaptor(asset, AssetStreamAdaptor::kYes_OwnAsset, @@ -158,7 +159,6 @@ TypefaceImpl* TypefaceImpl_createFromAsset(Asset* asset) { } TypefaceImpl* TypefaceImpl_createFromFamilies(const jlong* families, size_t size) { - ALOGD("createFromFamilies size=%d", size); std::vectorfamilyVec; for (size_t i = 0; i < size; i++) { FontFamily* family = reinterpret_cast(families[i]); @@ -166,7 +166,18 @@ TypefaceImpl* TypefaceImpl_createFromFamilies(const jlong* families, size_t size } TypefaceImpl* result = new TypefaceImpl; result->fFontCollection = new FontCollection(familyVec); - result->fStyle = FontStyle(); // TODO: improve + if (size == 0) { + ALOGW("createFromFamilies creating empty collection"); + result->fStyle = FontStyle(); + } else { + const FontStyle defaultStyle; + FontFamily* firstFamily = reinterpret_cast(families[0]); + MinikinFont* mf = firstFamily->getClosestMatch(defaultStyle); + SkTypeface* skTypeface = reinterpret_cast(mf)->GetSkTypeface(); + // TODO: probably better to query more precise style from family, will be important + // when we open up API to access 100..900 weights + result->fStyle = styleFromSkiaStyle(skTypeface->style()); + } return result; }