aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports/SkFontMgr_win_dw.cpp
diff options
context:
space:
mode:
authorGravatar kulshin <kulshin@chromium.org>2016-04-15 08:20:46 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-15 08:20:46 -0700
commit82497f9300432375cb9fd0e0ceca011ea7dce847 (patch)
tree51a9b7d24fdda79cc86916ac10e47f51434b0ded /src/ports/SkFontMgr_win_dw.cpp
parent7a9b9aff1a7706abf5245008814e2e38a2c90f1f (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.cpp27
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"