Chromium Code Reviews| Index: src/ports/SkFontConfigInterface_android.cpp |
| diff --git a/src/ports/SkFontConfigInterface_android.cpp b/src/ports/SkFontConfigInterface_android.cpp |
| index 2e2d88d689bbdfaf80cb4d6e221ac5ab291012e5..206f194477689cbeda3fe09cfaad2d6a423ae713 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<FontRec> fFonts; |
| @@ -118,6 +119,11 @@ private: |
| SkTDict<FallbackFontList*> fFallbackFontDict; |
| SkTDict<FallbackFontList*> fFallbackFontAliasDict; |
| FallbackFontList fDefaultFallbackList; |
| + |
| + // fallback info for current locale |
| + SkMutex fLocaleMutex; |
| + SkString fCachedLocale; |
| + FallbackFontList* fLocaleFallbackFontList; |
| }; |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -193,7 +199,8 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArray<FontFamily* |
| fFamilyNameDict(1024), |
| fDefaultFamilyRecID(INVALID_FAMILY_REC_ID), |
| fFallbackFontDict(128), |
| - fFallbackFontAliasDict(128) { |
| + fFallbackFontAliasDict(128), |
| + fLocaleFallbackFontList(NULL) { |
| for (int i = 0; i < fontFamilies.count(); ++i) { |
| FontFamily* family = fontFamilies[i]; |
| @@ -489,8 +496,9 @@ SkTypeface* SkFontConfigInterfaceAndroid::getTypefaceForFontRec(FontRecID fontRe |
| } |
| bool SkFontConfigInterfaceAndroid::getFallbackFamilyNameForChar(SkUnichar uni, SkString* name) { |
| - for (int i = 0; i < fDefaultFallbackList.count(); i++) { |
| - FontRecID fontRecID = fDefaultFallbackList[i]; |
| + FallbackFontList* fallbackFontList = this->getCurrentLocaleFallbackFontList(); |
| + for (int i = 0; i < fallbackFontList->count(); i++) { |
| + FontRecID fontRecID = fallbackFontList->getAt(i); |
| SkTypeface* face = this->getTypefaceForFontRec(fontRecID); |
| SkPaint paint; |
| @@ -533,6 +541,18 @@ SkTypeface* SkFontConfigInterfaceAndroid::getTypefaceForChar(SkUnichar uni, |
| return NULL; |
| } |
| +FallbackFontList* SkFontConfigInterfaceAndroid::getCurrentLocaleFallbackFontList() { |
| + SkAutoMutexAcquire mutex(&fLocaleMutex); |
| + |
| + SkString locale = SkFontConfigParser::GetLocale(); |
| + if (NULL == fLocaleFallbackFontList || locale != fCachedLocale) { |
| + fCachedLocale = locale; |
| + fLocaleFallbackFontList = this->findFallbackFontList(locale); |
|
reed1
2013/06/25 16:28:45
Does this leak the old fontlist?
djsollen
2013/06/25 16:38:20
The short answer is no. The fallbackfontlist is p
reed1
2013/06/25 16:48:24
In line 550 we assign into fLocalFallbackFontList.
|
| + } |
| + |
| + return fLocaleFallbackFontList; |
|
reed1
2013/06/25 16:28:45
the caller can manipulate this object outside of t
djsollen
2013/06/25 16:38:20
removed the mutex in the next patch set.
On 2013/
|
| +} |
| + |
| FallbackFontList* SkFontConfigInterfaceAndroid::findFallbackFontList(const SkLanguage& lang, |
| bool isOriginal) { |
| const SkString& langTag = lang.getTag(); |