From 9a70f347c9f279bf7b4ad8f24e78e3e524767ed5 Mon Sep 17 00:00:00 2001 From: "djsollen@google.com" Date: Tue, 25 Jun 2013 18:07:45 +0000 Subject: [PATCH] Ensure we use the current locale when looking up fallback fonts per character http://crbug.com/183830 R=scroggo@google.com Review URL: https://codereview.chromium.org/17691002 git-svn-id: http://skia.googlecode.com/svn/trunk@9751 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/ports/SkFontConfigInterface_android.cpp | 22 +++++++++++++++++++--- src/ports/SkFontConfigParser_android.cpp | 16 +++++++++++----- src/ports/SkFontConfigParser_android.h | 8 ++------ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/ports/SkFontConfigInterface_android.cpp b/src/ports/SkFontConfigInterface_android.cpp index 2e2d88d..738b114 100644 --- a/src/ports/SkFontConfigInterface_android.cpp +++ b/src/ports/SkFontConfigInterface_android.cpp @@ -107,6 +107,7 @@ public: private: void addFallbackFont(FontRecID fontRecID); SkTypeface* getTypefaceForFontRec(FontRecID fontRecID); + FallbackFontList* getCurrentLocaleFallbackFontList(); FallbackFontList* findFallbackFontList(const SkLanguage& lang, bool isOriginal = true); SkTArray fFonts; @@ -118,6 +119,10 @@ private: SkTDict fFallbackFontDict; SkTDict fFallbackFontAliasDict; FallbackFontList fDefaultFallbackList; + + // fallback info for current locale + SkString fCachedLocale; + FallbackFontList* fLocaleFallbackFontList; }; /////////////////////////////////////////////////////////////////////////////// @@ -193,7 +198,8 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArraygetCurrentLocaleFallbackFontList(); + for (int i = 0; i < fallbackFontList->count(); i++) { + FontRecID fontRecID = fallbackFontList->getAt(i); SkTypeface* face = this->getTypefaceForFontRec(fontRecID); SkPaint paint; @@ -533,6 +540,15 @@ SkTypeface* SkFontConfigInterfaceAndroid::getTypefaceForChar(SkUnichar uni, return NULL; } +FallbackFontList* SkFontConfigInterfaceAndroid::getCurrentLocaleFallbackFontList() { + SkString locale = SkFontConfigParser::GetLocale(); + if (NULL == fLocaleFallbackFontList || locale != fCachedLocale) { + fCachedLocale = locale; + fLocaleFallbackFontList = this->findFallbackFontList(locale); + } + return fLocaleFallbackFontList; +} + FallbackFontList* SkFontConfigInterfaceAndroid::findFallbackFontList(const SkLanguage& lang, bool isOriginal) { const SkString& langTag = lang.getTag(); diff --git a/src/ports/SkFontConfigParser_android.cpp b/src/ports/SkFontConfigParser_android.cpp index 9214d1b..b1c8159 100644 --- a/src/ports/SkFontConfigParser_android.cpp +++ b/src/ports/SkFontConfigParser_android.cpp @@ -254,7 +254,7 @@ void SkFontConfigParser::GetTestFontFamilies(SkTDArray &fontFamilie /** * Read the persistent locale. */ -void SkFontConfigParser::GetLocale(AndroidLocale &locale) +SkString SkFontConfigParser::GetLocale() { char propLang[PROP_VALUE_MAX], propRegn[PROP_VALUE_MAX]; __system_property_get("persist.sys.language", propLang); @@ -269,8 +269,14 @@ void SkFontConfigParser::GetLocale(AndroidLocale &locale) strcpy(propRegn, "US"); } } - strncpy(locale.language, propLang, 2); - locale.language[2] = '\0'; - strncpy(locale.region, propRegn, 2); - locale.region[2] = '\0'; + + SkString locale(6); + char* localeCStr = locale.writable_str(); + + strncpy(localeCStr, propLang, 2); + localeCStr[2] = '-'; + strncpy(&localeCStr[3], propRegn, 2); + localeCStr[5] = '\0'; + + return locale; } diff --git a/src/ports/SkFontConfigParser_android.h b/src/ports/SkFontConfigParser_android.h index c5cd3eb..fd64496 100644 --- a/src/ports/SkFontConfigParser_android.h +++ b/src/ports/SkFontConfigParser_android.h @@ -11,6 +11,7 @@ #include "SkTypes.h" #include "SkPaintOptionsAndroid.h" +#include "SkString.h" #include "SkTDArray.h" struct FontFileInfo { @@ -53,12 +54,7 @@ void GetTestFontFamilies(SkTDArray &fontFamilies, const char* testMainConfigFile, const char* testFallbackConfigFile); -struct AndroidLocale { - char language[3]; - char region[3]; -}; - -void GetLocale(AndroidLocale &locale); +SkString GetLocale(); } // SkFontConfigParser namespace -- 2.7.4