diff options
| author | 2016-11-07 05:22:48 +0000 | |
|---|---|---|
| committer | 2016-11-07 05:22:52 +0000 | |
| commit | 4b5617742903aeec0c924c298bc42fe0ffa9e5bc (patch) | |
| tree | 417b8969ecc77bc881951d64a15b714a673e1b49 | |
| parent | 3bbe9ab6b8978b0b5648c847e7afdbc512231643 (diff) | |
| parent | e2179925df2ce174d81dd6f7abae626cc859ce00 (diff) | |
Merge "Make sure the Typeface is loaded before calling measureText."
| -rw-r--r-- | core/java/android/widget/TextView.java | 5 | ||||
| -rw-r--r-- | libs/hwui/hwui/Typeface.cpp | 56 |
2 files changed, 7 insertions, 54 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 2f9c97b38afa..9c48cf8e8806 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -672,6 +672,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public static void preloadFontCache() { Paint p = new Paint(); p.setAntiAlias(true); + // Ensure that the Typeface is loaded here. + // Typically, Typeface is preloaded by zygote but not on all devices, e.g. Android Auto. + // So, sets Typeface.DEFAULT explicitly here for ensuring that the Typeface is loaded here + // since Paint.measureText can not be called without Typeface static initializer. + p.setTypeface(Typeface.DEFAULT); // We don't care about the result, just the side-effect of measuring. p.measureText("H"); } diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp index 33ee108430e0..50bc6c383a0f 100644 --- a/libs/hwui/hwui/Typeface.cpp +++ b/libs/hwui/hwui/Typeface.cpp @@ -49,62 +49,10 @@ static void resolveStyle(Typeface* typeface) { } Typeface* gDefaultTypeface = NULL; -pthread_once_t gDefaultTypefaceOnce = PTHREAD_ONCE_INIT; - -// This installs a default typeface (from a hardcoded path) that allows -// layouts to work (not crash on null pointer) before the default -// typeface is set. -// TODO: investigate why layouts are being created before Typeface.java -// class initialization. -static minikin::FontCollection *makeFontCollection() { - std::vector<minikin::FontFamily *>typefaces; - const char *fns[] = { - "/system/fonts/Roboto-Regular.ttf", - }; - - minikin::FontFamily *family = new minikin::FontFamily(); - for (size_t i = 0; i < sizeof(fns)/sizeof(fns[0]); i++) { - const char *fn = fns[i]; - ALOGD("makeFontCollection adding %s", fn); - sk_sp<SkTypeface> skFace = SkTypeface::MakeFromFile(fn); - if (skFace != NULL) { - // TODO: might be a nice optimization to get access to the underlying font - // data, but would require us opening the file ourselves and passing that - // to the appropriate Create method of SkTypeface. - minikin::MinikinFont *font = new MinikinFontSkia(std::move(skFace), NULL, 0, 0); - family->addFont(font); - font->Unref(); - } else { - ALOGE("failed to create font %s", fn); - } - } - typefaces.push_back(family); - - minikin::FontCollection *result = new minikin::FontCollection(typefaces); - family->Unref(); - return result; -} - -static void getDefaultTypefaceOnce() { - minikin::Layout::init(); - if (gDefaultTypeface == NULL) { - // We expect the client to set a default typeface, but provide a - // default so we can make progress before that happens. - gDefaultTypeface = new Typeface; - gDefaultTypeface->fFontCollection = makeFontCollection(); - gDefaultTypeface->fSkiaStyle = SkTypeface::kNormal; - gDefaultTypeface->fBaseWeight = 400; - resolveStyle(gDefaultTypeface); - } -} Typeface* Typeface::resolveDefault(Typeface* src) { - if (src == NULL) { - pthread_once(&gDefaultTypefaceOnce, getDefaultTypefaceOnce); - return gDefaultTypeface; - } else { - return src; - } + LOG_ALWAYS_FATAL_IF(gDefaultTypeface == nullptr); + return src == nullptr ? gDefaultTypeface : src; } Typeface* Typeface::createFromTypeface(Typeface* src, SkTypeface::Style style) { |