Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6e20139 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Move test only initialization to each test setup.

Global default typeface initialization is only used by test code.
It is good to do in test and remove from production.

Test: ran hwuimicro hwui_unit_tests hwuimacro
Change-Id: I7090b1794828072112540b4e357a6d24bf8f664a
parent d1b6feee
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
}

///////////////////////////////////////////////////////////////////////////////
+25 −52
Original line number Diff line number Diff line
@@ -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) {
@@ -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);
}

}
+3 −0
Original line number Diff line number Diff line
@@ -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();
};

}
+3 −0
Original line number Diff line number Diff line
@@ -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"

@@ -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());
+3 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#include "debug/GlesDriver.h"
#include "debug/NullGlesDriver.h"

#include "hwui/Typeface.h"

#include <benchmark/benchmark.h>

#include <memory>
@@ -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