Loading core/jni/android/graphics/Typeface.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -70,7 +70,7 @@ static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArr static void Typeface_setDefault(JNIEnv *env, jobject, jlong faceHandle) { Typeface* face = reinterpret_cast<Typeface*>(faceHandle); return Typeface::setDefault(face); Typeface::setDefault(face); } /////////////////////////////////////////////////////////////////////////////// Loading libs/hwui/hwui/Typeface.cpp +25 −52 Original line number Diff line number Diff line Loading @@ -49,60 +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. This happens if HWUI is used outside of zygote/app_process. 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) { Loading Loading @@ -164,4 +114,27 @@ void Typeface::setDefault(Typeface* face) { gDefaultTypeface = face; } void Typeface::setRobotoTypefaceForTest() { const char* kRobotoFont = "/system/fonts/Roboto-Regular.ttf"; sk_sp<SkTypeface> typeface = SkTypeface::MakeFromFile(kRobotoFont); LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", kRobotoFont); minikin::FontFamily* family = new minikin::FontFamily(); minikin::MinikinFont* font = new MinikinFontSkia(std::move(typeface), nullptr, 0, 0); family->addFont(font); font->Unref(); std::vector<minikin::FontFamily*> typefaces = { family }; minikin::FontCollection *collection = new minikin::FontCollection(typefaces); family->Unref(); Typeface* hwTypeface = new Typeface(); hwTypeface->fFontCollection = collection; hwTypeface->fSkiaStyle = SkTypeface::kNormal; hwTypeface->fBaseWeight = 400; hwTypeface->fStyle = minikin::FontStyle(4 /* weight */, false /* italic */); Typeface::setDefault(hwTypeface); } } libs/hwui/hwui/Typeface.h +3 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,9 @@ struct ANDROID_API Typeface { static Typeface* createFromFamilies(const std::vector<minikin::FontFamily*>& families); static void setDefault(Typeface* face); // Sets roboto font as the default typeface for testing purpose. static void setRobotoTypefaceForTest(); }; } Loading libs/hwui/tests/macrobench/main.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include "tests/common/LeakChecker.h" #include "tests/common/TestScene.h" #include "hwui/Typeface.h" #include "protos/hwui.pb.h" #include "Properties.h" Loading Loading @@ -303,6 +304,8 @@ int main(int argc, char* argv[]) { // set defaults gOpts.count = 150; Typeface::setRobotoTypefaceForTest(); parseOptions(argc, argv); if (!gBenchmarkReporter && gOpts.renderOffscreen) { gBenchmarkReporter.reset(new benchmark::ConsoleReporter()); Loading libs/hwui/tests/microbench/main.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #include "debug/GlesDriver.h" #include "debug/NullGlesDriver.h" #include "hwui/Typeface.h" #include <benchmark/benchmark.h> #include <memory> Loading @@ -27,6 +29,7 @@ using namespace android::uirenderer; int main(int argc, char** argv) { debug::GlesDriver::replace(std::make_unique<debug::NullGlesDriver>()); benchmark::Initialize(&argc, argv); Typeface::setRobotoTypefaceForTest(); benchmark::RunSpecifiedBenchmarks(); return 0; } Loading
core/jni/android/graphics/Typeface.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -70,7 +70,7 @@ static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArr static void Typeface_setDefault(JNIEnv *env, jobject, jlong faceHandle) { Typeface* face = reinterpret_cast<Typeface*>(faceHandle); return Typeface::setDefault(face); Typeface::setDefault(face); } /////////////////////////////////////////////////////////////////////////////// Loading
libs/hwui/hwui/Typeface.cpp +25 −52 Original line number Diff line number Diff line Loading @@ -49,60 +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. This happens if HWUI is used outside of zygote/app_process. 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) { Loading Loading @@ -164,4 +114,27 @@ void Typeface::setDefault(Typeface* face) { gDefaultTypeface = face; } void Typeface::setRobotoTypefaceForTest() { const char* kRobotoFont = "/system/fonts/Roboto-Regular.ttf"; sk_sp<SkTypeface> typeface = SkTypeface::MakeFromFile(kRobotoFont); LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", kRobotoFont); minikin::FontFamily* family = new minikin::FontFamily(); minikin::MinikinFont* font = new MinikinFontSkia(std::move(typeface), nullptr, 0, 0); family->addFont(font); font->Unref(); std::vector<minikin::FontFamily*> typefaces = { family }; minikin::FontCollection *collection = new minikin::FontCollection(typefaces); family->Unref(); Typeface* hwTypeface = new Typeface(); hwTypeface->fFontCollection = collection; hwTypeface->fSkiaStyle = SkTypeface::kNormal; hwTypeface->fBaseWeight = 400; hwTypeface->fStyle = minikin::FontStyle(4 /* weight */, false /* italic */); Typeface::setDefault(hwTypeface); } }
libs/hwui/hwui/Typeface.h +3 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,9 @@ struct ANDROID_API Typeface { static Typeface* createFromFamilies(const std::vector<minikin::FontFamily*>& families); static void setDefault(Typeface* face); // Sets roboto font as the default typeface for testing purpose. static void setRobotoTypefaceForTest(); }; } Loading
libs/hwui/tests/macrobench/main.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include "tests/common/LeakChecker.h" #include "tests/common/TestScene.h" #include "hwui/Typeface.h" #include "protos/hwui.pb.h" #include "Properties.h" Loading Loading @@ -303,6 +304,8 @@ int main(int argc, char* argv[]) { // set defaults gOpts.count = 150; Typeface::setRobotoTypefaceForTest(); parseOptions(argc, argv); if (!gBenchmarkReporter && gOpts.renderOffscreen) { gBenchmarkReporter.reset(new benchmark::ConsoleReporter()); Loading
libs/hwui/tests/microbench/main.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #include "debug/GlesDriver.h" #include "debug/NullGlesDriver.h" #include "hwui/Typeface.h" #include <benchmark/benchmark.h> #include <memory> Loading @@ -27,6 +29,7 @@ using namespace android::uirenderer; int main(int argc, char** argv) { debug::GlesDriver::replace(std::make_unique<debug::NullGlesDriver>()); benchmark::Initialize(&argc, argv); Typeface::setRobotoTypefaceForTest(); benchmark::RunSpecifiedBenchmarks(); return 0; }