Chromium Code Reviews| Index: Source/core/platform/graphics/FontCache.cpp |
| diff --git a/Source/core/platform/graphics/FontCache.cpp b/Source/core/platform/graphics/FontCache.cpp |
| index 2d7403c9c82e1b4d366b50fdb8fc640de8654177..ebb97981d061296192e32c119d4ffc6418d813df 100644 |
| --- a/Source/core/platform/graphics/FontCache.cpp |
| +++ b/Source/core/platform/graphics/FontCache.cpp |
| @@ -65,7 +65,8 @@ struct FontPlatformDataCacheKey { |
| WTF_MAKE_FAST_ALLOCATED; |
| public: |
| FontPlatformDataCacheKey(const AtomicString& family = AtomicString(), float size = 0, unsigned weight = 0, bool italic = false, |
| - bool isPrinterFont = false, FontOrientation orientation = Horizontal, FontWidthVariant widthVariant = RegularWidth) |
| + bool isPrinterFont = false, FontOrientation orientation = Horizontal, FontWidthVariant widthVariant = RegularWidth, |
| + const AtomicString& locale = AtomicString()) |
| : m_size(size * s_fontSizePrecisionMultiplier) |
| , m_weight(weight) |
| , m_family(family) |
| @@ -73,6 +74,7 @@ public: |
| , m_printerFont(isPrinterFont) |
| , m_orientation(orientation) |
| , m_widthVariant(widthVariant) |
| + , m_locale(locale) |
| { |
| } |
| @@ -83,7 +85,8 @@ public: |
| { |
| return equalIgnoringCase(m_family, other.m_family) && m_size == other.m_size |
| && m_weight == other.m_weight && m_italic == other.m_italic && m_printerFont == other.m_printerFont |
| - && m_orientation == other.m_orientation && m_widthVariant == other.m_widthVariant; |
| + && m_orientation == other.m_orientation && m_widthVariant == other.m_widthVariant |
| + && m_locale == other.m_locale; |
| } |
| unsigned m_size; |
| @@ -93,6 +96,9 @@ public: |
| bool m_printerFont; |
| FontOrientation m_orientation; |
| FontWidthVariant m_widthVariant; |
| + // Only set for platforms (e.g. Android) that FontCache::getFontDataForCharacter() may return different FontData |
| + // for different locales of FontDescriptions. |
|
falken
2013/09/25 08:11:51
So eventually all platforms will want this? It see
|
| + AtomicString m_locale; |
|
eseidel
2013/09/25 15:51:13
So WebKit doesn't seem to key based on locale. I'
|
| private: |
| // Multiplying the floating point size by 100 gives two decimal |
| @@ -104,12 +110,13 @@ private: |
| inline unsigned computeHash(const FontPlatformDataCacheKey& fontKey) |
|
eseidel
2013/09/25 15:49:52
This is webkit's impl:
http://trac.webkit.org/brow
|
| { |
| - unsigned hashCodes[5] = { |
| - CaseFoldingHash::hash(fontKey.m_family), |
| + unsigned hashCodes[6] = { |
| + fontKey.m_family.isNull() ? 0 : CaseFoldingHash::hash(fontKey.m_family), |
| fontKey.m_size, |
| fontKey.m_weight, |
| fontKey.m_widthVariant, |
| - static_cast<unsigned>(fontKey.m_orientation) << 2 | static_cast<unsigned>(fontKey.m_italic) << 1 | static_cast<unsigned>(fontKey.m_printerFont) |
| + static_cast<unsigned>(fontKey.m_orientation) << 2 | static_cast<unsigned>(fontKey.m_italic) << 1 | static_cast<unsigned>(fontKey.m_printerFont), |
| + fontKey.m_locale.isNull() ? 0 : CaseFoldingHash::hash(fontKey.m_locale) |
| }; |
| return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes); |
| } |
| @@ -207,9 +214,16 @@ FontPlatformData* FontCache::getFontResourcePlatformData(const FontDescription& |
| fontSize = fontDescription.computedSize(); |
| else |
| fontSize = fontDescription.computedPixelSize(); |
| - FontPlatformDataCacheKey key(familyName, fontSize, fontDescription.weight(), fontDescription.italic(), |
| - fontDescription.usePrinterFont(), fontDescription.orientation(), fontDescription.widthVariant()); |
| + FontPlatformDataCacheKey key(familyName, fontSize, fontDescription.weight(), fontDescription.italic(), |
| + fontDescription.usePrinterFont(), fontDescription.orientation(), fontDescription.widthVariant(), |
| +#if OS(ANDROID) |
| + // On Android FontPlatformData from different locales need to be distinguished |
| + // to avoid conflict of glyphs from different locale-perferred fallback fonts. |
|
falken
2013/09/25 08:11:51
s/perferred/preferred
I think comment can use ela
|
| + fontDescription.locale()); |
| +#else |
| + AtomicString()); |
| +#endif |
| FontPlatformData* result = 0; |
| bool foundResult; |
| FontPlatformDataCache::iterator it = gFontPlatformDataCache->find(key); |