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

Commit 4f0064fa authored by Raph Levien's avatar Raph Levien
Browse files

Fix for Typeface.create(Typeface, style) semantics changed in KK

This is a fix for bug 11553661. The "closest match" heuristic for
resolving a typeface when an exact match was not found changed between
JB MR2 and KK, resulting in loss of custom typeface when StyleSpan was
applied. This patch reinstates the logic that had been present. Also
reported externally as:
https://code.google.com/p/android/issues/detail?id=61771

Change-Id: Ia432fca07c4bf3b830ee2487cd8f5267a9cfb7ff
parent a80d6424
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -34,6 +34,13 @@ static SkTypeface* Typeface_create(JNIEnv* env, jobject, jstring name,
    if (NULL != name) {
        AutoJavaStringToUTF8    str(env, name);
        face = SkTypeface::CreateFromName(str.c_str(), style);
        // Try to find the closest matching font, using the standard heuristic
        if (NULL == face) {
            face = SkTypeface::CreateFromName(str.c_str(), (SkTypeface::Style)(style ^ SkTypeface::kItalic));
        }
        for (int i = 0; NULL == face && i < 4; i++) {
            face = SkTypeface::CreateFromName(str.c_str(), (SkTypeface::Style)i);
        }
    }

    // return the default font at the best style if no exact match exists
@@ -45,8 +52,13 @@ static SkTypeface* Typeface_create(JNIEnv* env, jobject, jstring name,

static SkTypeface* Typeface_createFromTypeface(JNIEnv* env, jobject, SkTypeface* family, int style) {
    SkTypeface* face = SkTypeface::CreateFromTypeface(family, (SkTypeface::Style)style);
    // return the default font at the best style if the requested style does not
    // exist in the provided family
    // Try to find the closest matching font, using the standard heuristic
    if (NULL == face) {
        face = SkTypeface::CreateFromTypeface(family, (SkTypeface::Style)(style ^ SkTypeface::kItalic));
    }
    for (int i = 0; NULL == face && i < 4; i++) {
        face = SkTypeface::CreateFromTypeface(family, (SkTypeface::Style)i);
    }
    if (NULL == face) {
        face = SkTypeface::CreateFromName(NULL, (SkTypeface::Style)style);
    }