Skip to content

Commit d1647c2

Browse files
Add runtime control for DirectWrite system font rendering params on Windows
1 parent 924e777 commit d1647c2

2 files changed

Lines changed: 60 additions & 1 deletion

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp
2+
index b9d69ab303204b68f97a1cae3bafbb1f77f0ac67..e434abba3b0c75dff4a48600e34c91ac6e9d766a 100644
3+
--- a/src/ports/SkTypeface_win_dw.cpp
4+
+++ b/src/ports/SkTypeface_win_dw.cpp
5+
@@ -543,6 +543,12 @@ std::unique_ptr<SkScalerContext> DWriteFontTypeface::onCreateScalerContext(
6+
sk_ref_sp(const_cast<DWriteFontTypeface*>(this)), effects, desc);
7+
}
8+
9+
+static std::atomic<int> gUseSystemRenderingParams{-1};
10+
+
11+
+extern "C" void DWriteTypeface_UseSystemRenderingParams(int value) {
12+
+ gUseSystemRenderingParams.store(value);
13+
+}
14+
+
15+
void DWriteFontTypeface::onFilterRec(SkScalerContextRec* rec) const {
16+
if (rec->fFlags & SkScalerContext::kLCD_Vertical_Flag) {
17+
rec->fMaskFormat = SkMask::kA8_Format;
18+
@@ -561,19 +567,31 @@ void DWriteFontTypeface::onFilterRec(SkScalerContextRec* rec) const {
19+
}
20+
rec->setHinting(h);
21+
22+
+ int setting = gUseSystemRenderingParams.load();
23+
+ bool useSystem;
24+
+ if (setting == -1) {
25+
#if defined(SK_FONT_HOST_USE_SYSTEM_SETTINGS)
26+
- IDWriteFactory* factory = sk_get_dwrite_factory();
27+
- if (factory != nullptr) {
28+
- SkTScopedComPtr<IDWriteRenderingParams> defaultRenderingParams;
29+
- if (SUCCEEDED(factory->CreateRenderingParams(&defaultRenderingParams))) {
30+
- float gamma = defaultRenderingParams->GetGamma();
31+
- rec->setDeviceGamma(gamma);
32+
- rec->setPaintGamma(gamma);
33+
-
34+
- rec->setContrast(defaultRenderingParams->GetEnhancedContrast());
35+
+ useSystem = true;
36+
+#else
37+
+ useSystem = false;
38+
+#endif
39+
+ } else {
40+
+ useSystem = (setting == 1);
41+
+ }
42+
+
43+
+ if (useSystem) {
44+
+ IDWriteFactory* factory = sk_get_dwrite_factory();
45+
+ if (factory != nullptr) {
46+
+ SkTScopedComPtr<IDWriteRenderingParams> defaultRenderingParams;
47+
+ if (SUCCEEDED(factory->CreateRenderingParams(&defaultRenderingParams))) {
48+
+ float gamma = defaultRenderingParams->GetGamma();
49+
+ rec->setDeviceGamma(gamma);
50+
+ rec->setPaintGamma(gamma);
51+
+
52+
+ rec->setContrast(defaultRenderingParams->GetEnhancedContrast());
53+
+ }
54+
}
55+
}
56+
-#endif
57+
}
58+
59+
///////////////////////////////////////////////////////////////////////////////

script/build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def main():
7070
'skia_use_system_freetype2=false',
7171
# 'skia_use_angle=true',
7272
'skia_use_direct3d=true',
73-
#'extra_cflags=["-DSK_FONT_HOST_USE_SYSTEM_SETTINGS"]',
73+
'extra_cflags=["-DSK_FONT_HOST_USE_SYSTEM_SETTINGS"]',
7474
]
7575
elif 'android' == system:
7676
args += [

0 commit comments

Comments
 (0)