diff options
author | kulshin <kulshin@chromium.org> | 2016-04-15 08:20:46 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-15 08:20:46 -0700 |
commit | 82497f9300432375cb9fd0e0ceca011ea7dce847 (patch) | |
tree | 51a9b7d24fdda79cc86916ac10e47f51434b0ded /src/ports/SkFontMgr_win_dw.cpp | |
parent | 7a9b9aff1a7706abf5245008814e2e38a2c90f1f (diff) |
Add option to specify font fallback when creating the skia font manager
This originally existed as https://codereview.chromium.org/1740533003/,
but then got reverted for causing perf problems at startup. This change
avoids that by allowing callers to specify their own font fallback, and
only uses the system fallback if a fallback is needed and none was
provided.
This is part 1 of a three part change.
1: https://codereview.chromium.org/1878843002/
Adds support for specifying a font fallback in skia
2: https://codereview.chromium.org/1846433005/
Implements the fallback proxy in Chromium
3: https://codereview.chromium.org/1883483002/
Adds code to blink to call skia's fallback API
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1878843002
Review URL: https://codereview.chromium.org/1878843002
Diffstat (limited to 'src/ports/SkFontMgr_win_dw.cpp')
-rw-r--r-- | src/ports/SkFontMgr_win_dw.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/ports/SkFontMgr_win_dw.cpp b/src/ports/SkFontMgr_win_dw.cpp index e178598a55..fc86bad2cd 100644 --- a/src/ports/SkFontMgr_win_dw.cpp +++ b/src/ports/SkFontMgr_win_dw.cpp @@ -264,8 +264,11 @@ class SkFontMgr_DirectWrite : public SkFontMgr { public: /** localeNameLength must include the null terminator. */ SkFontMgr_DirectWrite(IDWriteFactory* factory, IDWriteFontCollection* fontCollection, - WCHAR* localeName, int localeNameLength) + IDWriteFontFallback* fallback, WCHAR* localeName, int localeNameLength) : fFactory(SkRefComPtr(factory)) +#if SK_HAS_DWRITE_2_H + , fFontFallback(SkSafeRefComPtr(fallback)) +#endif , fFontCollection(SkRefComPtr(fontCollection)) , fLocaleName(localeNameLength) { @@ -275,6 +278,10 @@ public: // http://blogs.msdn.com/b/oldnewthing/archive/2004/03/26/96777.aspx SkASSERT_RELEASE(nullptr == fFactory2.get()); } + if (fFontFallback.get()) { + // factory must be provied if fallback is non-null, else the fallback will not be used. + SkASSERT(fFactory2.get()); + } #endif memcpy(fLocaleName.get(), localeName, localeNameLength * sizeof(WCHAR)); } @@ -308,6 +315,7 @@ private: SkTScopedComPtr<IDWriteFactory> fFactory; #if SK_HAS_DWRITE_2_H SkTScopedComPtr<IDWriteFactory2> fFactory2; + SkTScopedComPtr<IDWriteFontFallback> fFontFallback; #endif SkTScopedComPtr<IDWriteFontCollection> fFontCollection; SkSMallocWCHAR fLocaleName; @@ -762,8 +770,13 @@ SkTypeface* SkFontMgr_DirectWrite::onMatchFamilyStyleCharacter(const char family #if SK_HAS_DWRITE_2_H if (fFactory2.get()) { - SkTScopedComPtr<IDWriteFontFallback> fontFallback; - HRNM(fFactory2->GetSystemFontFallback(&fontFallback), "Could not get system fallback."); + SkTScopedComPtr<IDWriteFontFallback> systemFontFallback; + IDWriteFontFallback* fontFallback = fFontFallback.get(); + if (!fontFallback) { + HRNM(fFactory2->GetSystemFontFallback(&systemFontFallback), + "Could not get system fallback."); + fontFallback = systemFontFallback.get(); + } SkTScopedComPtr<IDWriteNumberSubstitution> numberSubstitution; HRNM(fFactory2->CreateNumberSubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE, nullptr, TRUE, @@ -1065,6 +1078,12 @@ SkTypeface* SkFontStyleSet_DirectWrite::matchStyle(const SkFontStyle& pattern) { SK_API SkFontMgr* SkFontMgr_New_DirectWrite(IDWriteFactory* factory, IDWriteFontCollection* collection) { + return SkFontMgr_New_DirectWrite(factory, collection, nullptr); +} + +SK_API SkFontMgr* SkFontMgr_New_DirectWrite(IDWriteFactory* factory, + IDWriteFontCollection* collection, + IDWriteFontFallback* fallback) { if (nullptr == factory) { factory = sk_get_dwrite_factory(); if (nullptr == factory) { @@ -1095,7 +1114,7 @@ SK_API SkFontMgr* SkFontMgr_New_DirectWrite(IDWriteFactory* factory, }; } - return new SkFontMgr_DirectWrite(factory, collection, localeName, localeNameLen); + return new SkFontMgr_DirectWrite(factory, collection, fallback, localeName, localeNameLen); } #include "SkFontMgr_indirect.h" |