Mutex protect SkFontMgr_DirectWrite cache.

SkFontMgr_DirectWrite is constant, except for its typeface cache.
Protect this cache in the face of multiple threads.

R=robertphillips@google.com

Review URL: https://codereview.chromium.org/26023002

git-svn-id: http://skia.googlecode.com/svn/trunk@11615 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
bungeman@google.com 2013-10-04 17:00:35 +00:00
parent 86490573b5
commit 86dd752bd5

View File

@ -113,6 +113,18 @@ protected:
unsigned styleBits) SK_OVERRIDE; unsigned styleBits) SK_OVERRIDE;
private: private:
SkMutex fTFCacheMutex;
void Add(SkTypeface* face, SkTypeface::Style requestedStyle, bool strong) {
SkAutoMutexAcquire ama(fTFCacheMutex);
fTFCache.add(face, requestedStyle, strong);
}
SkTypeface* FindByProcAndRef(SkTypefaceCache::FindProc proc, void* ctx) {
SkAutoMutexAcquire ama(fTFCacheMutex);
SkTypeface* typeface = fTFCache.findByProcAndRef(proc, ctx);
return typeface;
}
friend class SkFontStyleSet_DirectWrite; friend class SkFontStyleSet_DirectWrite;
SkTScopedComPtr<IDWriteFontCollection> fFontCollection; SkTScopedComPtr<IDWriteFontCollection> fFontCollection;
SkSMallocWCHAR fLocaleName; SkSMallocWCHAR fLocaleName;
@ -1710,12 +1722,12 @@ SkTypeface* SkFontMgr_DirectWrite::createTypefaceFromDWriteFont(
IDWriteFontFamily* fontFamily, IDWriteFontFamily* fontFamily,
StreamFontFileLoader* fontFileLoader, StreamFontFileLoader* fontFileLoader,
IDWriteFontCollectionLoader* fontCollectionLoader) { IDWriteFontCollectionLoader* fontCollectionLoader) {
SkTypeface* face = fTFCache.findByProcAndRef(FindByDWriteFont, font); SkTypeface* face = FindByProcAndRef(FindByDWriteFont, font);
if (NULL == face) { if (NULL == face) {
face = DWriteFontTypeface::Create(fontFace, font, fontFamily, face = DWriteFontTypeface::Create(fontFace, font, fontFamily,
fontFileLoader, fontCollectionLoader); fontFileLoader, fontCollectionLoader);
if (face) { if (face) {
fTFCache.add(face, get_style(font), fontCollectionLoader != NULL); Add(face, get_style(font), fontCollectionLoader != NULL);
} }
} }
return face; return face;