aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Ben Wagner <bungeman@google.com>2018-07-19 08:55:10 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-19 15:59:45 +0000
commit297c3c8e85bdb7ed79aaa6a596f52874d79e7a25 (patch)
treed3b3f5a80e0f79dd8b5a8bb810c2dced4ecef55d /src
parent30301c48f73f80f99d651a077821d2e7c7469f31 (diff)
Ignore NTDDI_VERSION with DirectWrite.
Some builds set NTDDI_VERSION to a very old version of Windows to ensure they run on those older versions of Windows. The dwrite_3.h header uses NTDDI_VERSION in an odd manner, hiding immutable declarations of enums, structs, and interfaces. NTDDI_VERSION was indended to hide functions and extensions to structs. DWrite has one function (to create the factory) and no structs which will be extended. Skia is already tested to run on the oldest supported Windows platform (Windows 7), so an external build building Skia with NTDDI_VERSION as a build define should have no issues at runtime if Skia ignores it. If Skia doesn't ignore NTDDI_VERSION in this case the DWrite backend will be runtime limited to interfaces in very old versions of Windows, instead of using newer interfaces which become available at runtime. Change-Id: I3e9ac2c4116d75588bfff391928d3cd446d6363a Reviewed-on: https://skia-review.googlesource.com/142324 Commit-Queue: Ben Wagner <bungeman@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Reviewed-by: Herb Derby <herb@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/ports/SkFontMgr_win_dw.cpp1
-rw-r--r--src/ports/SkRemotableFontMgr_win_dw.cpp2
-rw-r--r--src/ports/SkScalerContext_win_dw.cpp2
-rw-r--r--src/ports/SkTypeface_win_dw.cpp1
-rw-r--r--src/utils/win/SkDWriteNTDDI_VERSION.h31
5 files changed, 37 insertions, 0 deletions
diff --git a/src/ports/SkFontMgr_win_dw.cpp b/src/ports/SkFontMgr_win_dw.cpp
index c6f15d5ce8..6830d82e03 100644
--- a/src/ports/SkFontMgr_win_dw.cpp
+++ b/src/ports/SkFontMgr_win_dw.cpp
@@ -4,6 +4,7 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
+#include "SkDWriteNTDDI_VERSION.h"
#include "SkTypes.h"
#if defined(SK_BUILD_FOR_WIN)
diff --git a/src/ports/SkRemotableFontMgr_win_dw.cpp b/src/ports/SkRemotableFontMgr_win_dw.cpp
index 864e488622..6c6613ea37 100644
--- a/src/ports/SkRemotableFontMgr_win_dw.cpp
+++ b/src/ports/SkRemotableFontMgr_win_dw.cpp
@@ -4,6 +4,8 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
+#include "SkDWriteNTDDI_VERSION.h"
+
#include "SkTypes.h"
#if defined(SK_BUILD_FOR_WIN)
diff --git a/src/ports/SkScalerContext_win_dw.cpp b/src/ports/SkScalerContext_win_dw.cpp
index 10153023d3..8f9a761614 100644
--- a/src/ports/SkScalerContext_win_dw.cpp
+++ b/src/ports/SkScalerContext_win_dw.cpp
@@ -4,6 +4,7 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
+#include "SkDWriteNTDDI_VERSION.h"
#include "SkTypes.h"
#if defined(SK_BUILD_FOR_WIN)
@@ -35,6 +36,7 @@
#include <dwrite.h>
#include <dwrite_1.h>
+#include <dwrite_3.h>
/* Note:
* In versions 8 and 8.1 of Windows, some calls in DWrite are not thread safe.
diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp
index b419ae985f..e6a812fbd7 100644
--- a/src/ports/SkTypeface_win_dw.cpp
+++ b/src/ports/SkTypeface_win_dw.cpp
@@ -4,6 +4,7 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
+#include "SkDWriteNTDDI_VERSION.h"
#include "SkTypes.h"
#if defined(SK_BUILD_FOR_WIN)
diff --git a/src/utils/win/SkDWriteNTDDI_VERSION.h b/src/utils/win/SkDWriteNTDDI_VERSION.h
new file mode 100644
index 0000000000..7196639b97
--- /dev/null
+++ b/src/utils/win/SkDWriteNTDDI_VERSION.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkDWriteNTDDI_VERSION_DEFINED
+#define SkDWriteNTDDI_VERSION_DEFINED
+
+// More strictly, this header should be the first thing in a translation unit,
+// since it is effectively negating build flags.
+#if defined(_WINDOWS_) || defined(DWRITE_3_H_INCLUDED)
+#error Must include SkDWriteNTDDI_VERSION.h before any Windows or DWrite headers.
+#endif
+
+// If the build defines NTDDI_VERSION, pretend it didn't.
+// This also requires resetting _WIN32_WINNT and WINVER.
+// dwrite_3.h guards enum, macro, and interface declarations behind NTDDI_VERSION,
+// but it is not clear this is correct since these are all immutable.
+#if defined(NTDDI_VERSION)
+# undef NTDDI_VERSION
+# if defined(_WIN32_WINNT)
+# undef _WIN32_WINNT_WIN10
+# endif
+# if defined(WINVER)
+# undef WINVER
+# endif
+#endif
+
+#endif