diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index 6582d37..554d5b9 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -96,6 +96,7 @@
   include/d3d12shader.idl \
   include/d3dcommon.idl \
   include/dbgprop.idl \
+  include/dcommon.idl \
   include/dcompanimation.idl \
   include/ddstream.idl \
   include/dinputd.idl \
@@ -109,6 +110,10 @@
   include/downloadmgr.idl \
   include/drmexternals.idl \
   include/dvdif.idl \
+  include/dwrite.idl \
+  include/dwrite_1.idl \
+  include/dwrite_2.idl \
+  include/dwrite_3.idl \
   include/dxgi.idl \
   include/dxgi1_2.idl \
   include/dxgi1_3.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index be1fa0f..88e942f 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -396,6 +396,7 @@
 @HAVE_WIDL_TRUE@  include/d3d12shader.idl \
 @HAVE_WIDL_TRUE@  include/d3dcommon.idl \
 @HAVE_WIDL_TRUE@  include/dbgprop.idl \
+@HAVE_WIDL_TRUE@  include/dcommon.idl \
 @HAVE_WIDL_TRUE@  include/dcompanimation.idl \
 @HAVE_WIDL_TRUE@  include/ddstream.idl \
 @HAVE_WIDL_TRUE@  include/dinputd.idl \
@@ -409,6 +410,10 @@
 @HAVE_WIDL_TRUE@  include/downloadmgr.idl \
 @HAVE_WIDL_TRUE@  include/drmexternals.idl \
 @HAVE_WIDL_TRUE@  include/dvdif.idl \
+@HAVE_WIDL_TRUE@  include/dwrite.idl \
+@HAVE_WIDL_TRUE@  include/dwrite_1.idl \
+@HAVE_WIDL_TRUE@  include/dwrite_2.idl \
+@HAVE_WIDL_TRUE@  include/dwrite_3.idl \
 @HAVE_WIDL_TRUE@  include/dxgi.idl \
 @HAVE_WIDL_TRUE@  include/dxgi1_2.idl \
 @HAVE_WIDL_TRUE@  include/dxgi1_3.idl \
diff --git a/mingw-w64-headers/include/d2d1.h b/mingw-w64-headers/include/d2d1.h
index 8368cf4..66f3ee4 100644
--- a/mingw-w64-headers/include/d2d1.h
+++ b/mingw-w64-headers/include/d2d1.h
@@ -341,6 +341,14 @@
 typedef struct D2D1_STROKE_STYLE_PROPERTIES D2D1_STROKE_STYLE_PROPERTIES;
 typedef struct D2D1_TRIANGLE D2D1_TRIANGLE;
 
+typedef D2D_MATRIX_3X2_F D2D1_MATRIX_3X2_F;
+typedef D2D_RECT_F D2D1_RECT_F;
+typedef D2D_SIZE_F D2D1_SIZE_F;
+typedef UINT64 D2D1_TAG;
+typedef D2D_POINT_2U D2D1_POINT_2U;
+typedef D2D_RECT_U D2D1_RECT_U;
+typedef D2D_COLOR_F D2D1_COLOR_F;
+
 struct D2D1_ARC_SEGMENT {
   D2D1_POINT_2F        point;
   D2D1_SIZE_F          size;
diff --git a/mingw-w64-headers/include/d2dbasetypes.h b/mingw-w64-headers/include/d2dbasetypes.h
index 387d193..93c99fc 100644
--- a/mingw-w64-headers/include/d2dbasetypes.h
+++ b/mingw-w64-headers/include/d2dbasetypes.h
@@ -1,126 +1,63 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
-
- * d2dbasetypes.h - Header file for the Direct2D API
- * No original Microsoft headers were used in the creation of this
- * file.
- *API docs available at: http://msdn.microsoft.com/en-us/library/dd372349%28v=VS.85%29.aspx
+/*
+ * Copyright 2013 Nikolay Sivov for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#ifndef _D2DBASETYPES_H
-#define _D2DBASETYPES_H
+#ifndef _D2DBASETYPES_INCLUDED
+#define _D2DBASETYPES_INCLUDED
 
-#include <d3d9types.h>
+#ifndef D3DCOLORVALUE_DEFINED
+typedef struct D3DCOLORVALUE
+{
+    float r;
+    float g;
+    float b;
+    float a;
+} D3DCOLORVALUE;
+#define D3DCOLORVALUE_DEFINED
+#endif
 
 typedef D3DCOLORVALUE D2D_COLOR_F;
 
-struct D2D_MATRIX_3X2_F {
-  FLOAT _11;
-  FLOAT _12;
-  FLOAT _21;
-  FLOAT _22;
-  FLOAT _31;
-  FLOAT _32;
-};
+typedef struct D2D_RECT_F
+{
+    float left;
+    float top;
+    float right;
+    float bottom;
+} D2D_RECT_F;
 
-typedef struct D2D_MATRIX_4X3_F {
-    __C89_NAMELESS union {
-        __C89_NAMELESS struct {
-            FLOAT _11, _12, _13;
-            FLOAT _21, _22, _23;
-            FLOAT _31, _32, _33;
-            FLOAT _41, _42, _43;
-        };
-        FLOAT m[4][3];
-    };
-} D2D_MATRIX_4X3_F;
+typedef struct D2D_SIZE_F
+{
+    float width;
+    float height;
+} D2D_SIZE_F;
 
-typedef struct D2D_MATRIX_4X4_F {
-    __C89_NAMELESS union {
-        __C89_NAMELESS struct {
-            FLOAT _11, _12, _13, _14;
-            FLOAT _21, _22, _23, _24;
-            FLOAT _31, _32, _33, _34;
-            FLOAT _41, _42, _43, _44;
-        };
-        FLOAT m[4][4];
-    };
-} D2D_MATRIX_4X4_F;
+typedef struct D2D_POINT_2U
+{
+    UINT32 x;
+    UINT32 y;
+} D2D_POINT_2U;
 
-typedef struct D2D_MATRIX_5X4_F {
-    __C89_NAMELESS union {
-        __C89_NAMELESS struct {
-            FLOAT _11, _12, _13, _14;
-            FLOAT _21, _22, _23, _24;
-            FLOAT _31, _32, _33, _34;
-            FLOAT _41, _42, _43, _44;
-            FLOAT _51, _52, _53, _54;
-        };
-        FLOAT m[5][4];
-    };
-} D2D_MATRIX_5X4_F;
+typedef struct D2D_RECT_U
+{
+    UINT32 left;
+    UINT32 top;
+    UINT32 right;
+    UINT32 bottom;
+} D2D_RECT_U;
 
-struct D2D_POINT_2F {
-  FLOAT x;
-  FLOAT y;
-};
-
-struct D2D_POINT_2U {
-  UINT32 x;
-  UINT32 y;
-};
-
-struct D2D_RECT_F {
-  FLOAT left;
-  FLOAT top;
-  FLOAT right;
-  FLOAT bottom;
-};
-
-struct D2D_RECT_U {
-  UINT32 left;
-  UINT32 top;
-  UINT32 right;
-  UINT32 bottom;
-};
-
-typedef RECT D2D_RECT_L;
-
-struct D2D_SIZE_F {
-  FLOAT width;
-  FLOAT height;
-};
-
-typedef D2D_COLOR_F D2D1_COLOR_F;
-
-typedef struct D2D_POINT_2F D2D1_POINT_2F;
-
-typedef struct D2D_POINT_2U D2D1_POINT_2U;
-
-typedef struct D2D_RECT_F D2D1_RECT_F;
-
-typedef struct D2D_RECT_U D2D1_RECT_U;
-
-typedef struct D2D_SIZE_F D2D1_SIZE_F;
-
-typedef struct D2D_VECTOR_2F {
-    FLOAT x;
-    FLOAT y;
-} D2D_VECTOR_2F;
-
-typedef struct D2D_VECTOR_3F {
-    FLOAT x;
-    FLOAT y;
-    FLOAT z;
-} D2D_VECTOR_3F;
-
-typedef struct D2D_VECTOR_4F {
-    FLOAT x;
-    FLOAT y;
-    FLOAT z;
-    FLOAT w;
-} D2D_VECTOR_4F;
-
-#endif /* _D2DBASETYPES_H */
+#endif /* _D2DBASETYPES_INCLUDED */
diff --git a/mingw-w64-headers/include/dcommon.h b/mingw-w64-headers/include/dcommon.h
index 7babc82..d876955 100644
--- a/mingw-w64-headers/include/dcommon.h
+++ b/mingw-w64-headers/include/dcommon.h
@@ -1,52 +1,197 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#ifndef __INC_DCOMMON__
-#define __INC_DCOMMON__
+/*** Autogenerated by WIDL 5.13 from include/dcommon.idl - Do not edit ***/
+
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#endif
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __dcommon_h__
+#define __dcommon_h__
+
+/* Forward declarations */
+
+/* Headers for imported files */
 
 #include <dxgiformat.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if 0
+typedef struct __WIDL_dcommon_generated_name_00000000 {
+    LONG x;
+    LONG y;
+} POINT;
+typedef struct __WIDL_dcommon_generated_name_00000001 {
+    LONG left;
+    LONG top;
+    LONG right;
+    LONG bottom;
+} RECT;
+typedef unsigned int UINT32;
+#endif
 typedef enum DWRITE_MEASURING_MODE {
-  DWRITE_MEASURING_MODE_NATURAL = 0,
-  DWRITE_MEASURING_MODE_GDI_CLASSIC,
-  DWRITE_MEASURING_MODE_GDI_NATURAL 
+    DWRITE_MEASURING_MODE_NATURAL = 0,
+    DWRITE_MEASURING_MODE_GDI_CLASSIC = 1,
+    DWRITE_MEASURING_MODE_GDI_NATURAL = 2
 } DWRITE_MEASURING_MODE;
-
-enum DWRITE_GLYPH_IMAGE_FORMATS {
-    DWRITE_GLYPH_IMAGE_FORMATS_NONE      = 0x0000,
-    DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE  = 0x0001,
-    DWRITE_GLYPH_IMAGE_FORMATS_CFF       = 0x0002,
-    DWRITE_GLYPH_IMAGE_FORMATS_COLR      = 0x0004,
-    DWRITE_GLYPH_IMAGE_FORMATS_SVG       = 0x0008,
-    DWRITE_GLYPH_IMAGE_FORMATS_PNG       = 0x0010,
-    DWRITE_GLYPH_IMAGE_FORMATS_JPEG      = 0x0020,
-    DWRITE_GLYPH_IMAGE_FORMATS_TIFF      = 0x0040,
-    DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8 = 0x0080,
-};
-
+typedef enum DWRITE_GLYPH_IMAGE_FORMATS {
+    DWRITE_GLYPH_IMAGE_FORMATS_NONE = 0,
+    DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE = 1 << 0,
+    DWRITE_GLYPH_IMAGE_FORMATS_CFF = 1 << 1,
+    DWRITE_GLYPH_IMAGE_FORMATS_COLR = 1 << 2,
+    DWRITE_GLYPH_IMAGE_FORMATS_SVG = 1 << 3,
+    DWRITE_GLYPH_IMAGE_FORMATS_PNG = 1 << 4,
+    DWRITE_GLYPH_IMAGE_FORMATS_JPEG = 1 << 5,
+    DWRITE_GLYPH_IMAGE_FORMATS_TIFF = 1 << 6,
+    DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8 = 1 << 7
+} DWRITE_GLYPH_IMAGE_FORMATS;
 typedef enum D2D1_ALPHA_MODE {
-  D2D1_ALPHA_MODE_UNKNOWN = 0,
-  D2D1_ALPHA_MODE_PREMULTIPLIED = 1,
-  D2D1_ALPHA_MODE_STRAIGHT = 2,
-  D2D1_ALPHA_MODE_IGNORE = 3,
-  D2D1_ALPHA_MODE_FORCE_DWORD = 0xffffffff
+    D2D1_ALPHA_MODE_UNKNOWN = 0,
+    D2D1_ALPHA_MODE_PREMULTIPLIED = 1,
+    D2D1_ALPHA_MODE_STRAIGHT = 2,
+    D2D1_ALPHA_MODE_IGNORE = 3,
+    D2D1_ALPHA_MODE_FORCE_DWORD = 0xffffffff
 } D2D1_ALPHA_MODE;
-
 typedef struct D2D1_PIXEL_FORMAT {
-  DXGI_FORMAT format;
-  D2D1_ALPHA_MODE alphaMode;
+    DXGI_FORMAT format;
+    D2D1_ALPHA_MODE alphaMode;
 } D2D1_PIXEL_FORMAT;
-
+typedef struct D2D_POINT_2F {
+    float x;
+    float y;
+} D2D_POINT_2F;
+typedef struct D2D_POINT_2F D2D1_POINT_2F;
 typedef POINT D2D_POINT_2L;
-typedef D2D_POINT_2L D2D1_POINT_2L;
-
-struct D2D_SIZE_U {
-  UINT32 width;
-  UINT32 height;
-};
-
+typedef POINT D2D1_POINT_2L;
+typedef struct D2D_VECTOR_2F {
+    float x;
+    float y;
+} D2D_VECTOR_2F;
+typedef struct D2D_VECTOR_3F {
+    float x;
+    float y;
+    float z;
+} D2D_VECTOR_3F;
+typedef struct D2D_VECTOR_4F {
+    float x;
+    float y;
+    float z;
+    float w;
+} D2D_VECTOR_4F;
+typedef RECT D2D_RECT_L;
+typedef RECT D2D1_RECT_L;
+typedef struct D2D_SIZE_U {
+    UINT32 width;
+    UINT32 height;
+} D2D_SIZE_U;
 typedef struct D2D_SIZE_U D2D1_SIZE_U;
+typedef struct D2D_MATRIX_3X2_F {
+    __C89_NAMELESS union {
+        __C89_NAMELESS struct {
+            float m11;
+            float m12;
+            float m21;
+            float m22;
+            float dx;
+            float dy;
+        } __C89_NAMELESSSTRUCTNAME1;
+        __C89_NAMELESS struct {
+            float _11;
+            float _12;
+            float _21;
+            float _22;
+            float _31;
+            float _32;
+        } __C89_NAMELESSSTRUCTNAME2;
+        float m[3][2];
+    } __C89_NAMELESSUNIONNAME;
+} D2D_MATRIX_3X2_F;
+typedef struct D2D_MATRIX_4X3_F {
+    __C89_NAMELESS union {
+        __C89_NAMELESS struct {
+            float _11;
+            float _12;
+            float _13;
+            float _21;
+            float _22;
+            float _23;
+            float _31;
+            float _32;
+            float _33;
+            float _41;
+            float _42;
+            float _43;
+        } __C89_NAMELESSSTRUCTNAME;
+        float m[4][3];
+    } __C89_NAMELESSUNIONNAME;
+} D2D_MATRIX_4X3_F;
+typedef struct D2D_MATRIX_4X4_F {
+    __C89_NAMELESS union {
+        __C89_NAMELESS struct {
+            float _11;
+            float _12;
+            float _13;
+            float _14;
+            float _21;
+            float _22;
+            float _23;
+            float _24;
+            float _31;
+            float _32;
+            float _33;
+            float _34;
+            float _41;
+            float _42;
+            float _43;
+            float _44;
+        } __C89_NAMELESSSTRUCTNAME;
+        float m[4][4];
+    } __C89_NAMELESSUNIONNAME;
+} D2D_MATRIX_4X4_F;
+typedef struct D2D_MATRIX_5X4_F {
+    __C89_NAMELESS union {
+        __C89_NAMELESS struct {
+            float _11;
+            float _12;
+            float _13;
+            float _14;
+            float _21;
+            float _22;
+            float _23;
+            float _24;
+            float _31;
+            float _32;
+            float _33;
+            float _34;
+            float _41;
+            float _42;
+            float _43;
+            float _44;
+            float _51;
+            float _52;
+            float _53;
+            float _54;
+        } __C89_NAMELESSSTRUCTNAME;
+        float m[5][4];
+    } __C89_NAMELESSUNIONNAME;
+} D2D_MATRIX_5X4_F;
+/* Begin additional prototypes for all interfaces */
 
-#endif /*#define __INC_DCOMMON__*/
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __dcommon_h__ */
diff --git a/mingw-w64-headers/include/dcommon.idl b/mingw-w64-headers/include/dcommon.idl
new file mode 100644
index 0000000..43c82eb
--- /dev/null
+++ b/mingw-w64-headers/include/dcommon.idl
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2012 Nikolay Sivov for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "dxgiformat.idl";
+
+cpp_quote("#if 0")
+typedef struct
+{
+    long x, y;
+} POINT;
+
+typedef struct
+{
+    long left, top, right, bottom;
+} RECT;
+
+typedef unsigned int UINT32;
+cpp_quote("#endif")
+
+typedef enum DWRITE_MEASURING_MODE
+{
+    DWRITE_MEASURING_MODE_NATURAL,
+    DWRITE_MEASURING_MODE_GDI_CLASSIC,
+    DWRITE_MEASURING_MODE_GDI_NATURAL
+} DWRITE_MEASURING_MODE;
+
+typedef enum DWRITE_GLYPH_IMAGE_FORMATS
+{
+    DWRITE_GLYPH_IMAGE_FORMATS_NONE                   = 0,
+    DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE               = 1 << 0,
+    DWRITE_GLYPH_IMAGE_FORMATS_CFF                    = 1 << 1,
+    DWRITE_GLYPH_IMAGE_FORMATS_COLR                   = 1 << 2,
+    DWRITE_GLYPH_IMAGE_FORMATS_SVG                    = 1 << 3,
+    DWRITE_GLYPH_IMAGE_FORMATS_PNG                    = 1 << 4,
+    DWRITE_GLYPH_IMAGE_FORMATS_JPEG                   = 1 << 5,
+    DWRITE_GLYPH_IMAGE_FORMATS_TIFF                   = 1 << 6,
+    DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8 = 1 << 7
+} DWRITE_GLYPH_IMAGE_FORMATS;
+
+typedef enum D2D1_ALPHA_MODE
+{
+    D2D1_ALPHA_MODE_UNKNOWN = 0,
+    D2D1_ALPHA_MODE_PREMULTIPLIED = 1,
+    D2D1_ALPHA_MODE_STRAIGHT = 2,
+    D2D1_ALPHA_MODE_IGNORE = 3,
+    D2D1_ALPHA_MODE_FORCE_DWORD = 0xffffffff
+} D2D1_ALPHA_MODE;
+
+typedef struct D2D1_PIXEL_FORMAT
+{
+    DXGI_FORMAT format;
+    D2D1_ALPHA_MODE alphaMode;
+} D2D1_PIXEL_FORMAT;
+
+typedef struct D2D_POINT_2F
+{
+    float x;
+    float y;
+} D2D_POINT_2F, D2D1_POINT_2F;
+
+typedef POINT D2D_POINT_2L, D2D1_POINT_2L;
+
+typedef struct D2D_VECTOR_2F
+{
+    float x;
+    float y;
+} D2D_VECTOR_2F;
+
+typedef struct D2D_VECTOR_3F
+{
+    float x;
+    float y;
+    float z;
+} D2D_VECTOR_3F;
+
+typedef struct D2D_VECTOR_4F
+{
+    float x;
+    float y;
+    float z;
+    float w;
+} D2D_VECTOR_4F;
+
+typedef RECT D2D_RECT_L, D2D1_RECT_L;
+
+typedef struct D2D_SIZE_U
+{
+    UINT32 width;
+    UINT32 height;
+} D2D_SIZE_U, D2D1_SIZE_U;
+
+typedef struct D2D_MATRIX_3X2_F
+{
+    union
+    {
+        struct
+        {
+            float m11;
+            float m12;
+            float m21;
+            float m22;
+            float dx;
+            float dy;
+        };
+
+        struct
+        {
+            float _11, _12;
+            float _21, _22;
+            float _31, _32;
+        };
+
+        float m[3][2];
+    };
+} D2D_MATRIX_3X2_F;
+
+typedef struct D2D_MATRIX_4X3_F
+{
+    union
+    {
+        struct
+        {
+            float _11, _12, _13;
+            float _21, _22, _23;
+            float _31, _32, _33;
+            float _41, _42, _43;
+        };
+
+        float m[4][3];
+    };
+} D2D_MATRIX_4X3_F;
+
+typedef struct D2D_MATRIX_4X4_F
+{
+    union
+    {
+        struct
+        {
+            float _11, _12, _13, _14;
+            float _21, _22, _23, _24;
+            float _31, _32, _33, _34;
+            float _41, _42, _43, _44;
+        };
+
+        float m[4][4];
+    };
+} D2D_MATRIX_4X4_F;
+
+typedef struct D2D_MATRIX_5X4_F
+{
+    union
+    {
+        struct
+        {
+            float _11, _12, _13, _14;
+            float _21, _22, _23, _24;
+            float _31, _32, _33, _34;
+            float _41, _42, _43, _44;
+            float _51, _52, _53, _54;
+        };
+
+        float m[5][4];
+    };
+} D2D_MATRIX_5X4_F;
diff --git a/mingw-w64-headers/include/dwrite.h b/mingw-w64-headers/include/dwrite.h
index 96bbf55..3ab1503 100644
--- a/mingw-w64-headers/include/dwrite.h
+++ b/mingw-w64-headers/include/dwrite.h
@@ -1,2389 +1,5515 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#ifndef __INC_DWRITE__
-#define __INC_DWRITE__
+/*** Autogenerated by WIDL 5.13 from include/dwrite.idl - Do not edit ***/
 
-#define DWRITEAPI DECLSPEC_IMPORT
-
-#include <unknwn.h>
-
-#ifndef DWRITE_DECLARE_INTERFACE
-#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
 #endif
 
-#ifndef __IDWriteBitmapRenderTarget_FWD_DEFINED__
-#define __IDWriteBitmapRenderTarget_FWD_DEFINED__
-typedef struct IDWriteBitmapRenderTarget IDWriteBitmapRenderTarget;
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
 #endif
 
-#ifndef __IDWriteFactory_FWD_DEFINED__
-#define __IDWriteFactory_FWD_DEFINED__
-typedef struct IDWriteFactory IDWriteFactory;
-#endif
+#ifndef __dwrite_h__
+#define __dwrite_h__
 
-#ifndef __IDWriteFont_FWD_DEFINED__
-#define __IDWriteFont_FWD_DEFINED__
-typedef struct IDWriteFont IDWriteFont;
-#endif
+/* Forward declarations */
 
-#ifndef __IDWriteFontCollection_FWD_DEFINED__
-#define __IDWriteFontCollection_FWD_DEFINED__
-typedef struct IDWriteFontCollection IDWriteFontCollection;
-#endif
-
-#ifndef __IDWriteFontFace_FWD_DEFINED__
-#define __IDWriteFontFace_FWD_DEFINED__
-typedef struct IDWriteFontFace IDWriteFontFace;
-#endif
-
-#ifndef __IDWriteFontFamily_FWD_DEFINED__
-#define __IDWriteFontFamily_FWD_DEFINED__
-typedef struct IDWriteFontFamily IDWriteFontFamily;
-#endif
-
-#ifndef __IDWriteFontList_FWD_DEFINED__
-#define __IDWriteFontList_FWD_DEFINED__
-typedef struct IDWriteFontList IDWriteFontList;
-#endif
-
-#ifndef __IDWriteFontFile_FWD_DEFINED__
-#define __IDWriteFontFile_FWD_DEFINED__
-typedef struct IDWriteFontFile IDWriteFontFile;
+#ifndef __IDWriteFontFileStream_FWD_DEFINED__
+#define __IDWriteFontFileStream_FWD_DEFINED__
+typedef interface IDWriteFontFileStream IDWriteFontFileStream;
+#ifdef __cplusplus
+interface IDWriteFontFileStream;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteFontFileLoader_FWD_DEFINED__
 #define __IDWriteFontFileLoader_FWD_DEFINED__
-typedef struct IDWriteFontFileLoader IDWriteFontFileLoader;
-#endif
-
-#ifndef __IDWriteFontFileStream_FWD_DEFINED__
-#define __IDWriteFontFileStream_FWD_DEFINED__
-typedef struct IDWriteFontFileStream IDWriteFontFileStream;
-#endif
-
-#ifndef __IDWriteFontCollectionLoader_FWD_DEFINED__
-#define __IDWriteFontCollectionLoader_FWD_DEFINED__
-typedef struct IDWriteFontCollectionLoader IDWriteFontCollectionLoader;
-#endif
-
-#ifndef __IDWriteFontFileEnumerator_FWD_DEFINED__
-#define __IDWriteFontFileEnumerator_FWD_DEFINED__
-typedef struct IDWriteFontFileEnumerator IDWriteFontFileEnumerator;
-#endif
-
-#ifndef __IDWriteGdiInterop_FWD_DEFINED__
-#define __IDWriteGdiInterop_FWD_DEFINED__
-typedef struct IDWriteGdiInterop IDWriteGdiInterop;
-#endif
-
-/* Fixme: MSDN says its a typedef, needs verification */
-/* http://msdn.microsoft.com/en-us/library/dd756614%28v=VS.85%29.aspx */
-#ifndef __IDWriteGeometrySink_FWD_DEFINED__
-#define __IDWriteGeometrySink_FWD_DEFINED__
-typedef struct ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
-#endif
-
-#ifndef __IDWriteGlyphRunAnalysis_FWD_DEFINED__
-#define __IDWriteGlyphRunAnalysis_FWD_DEFINED__
-typedef struct IDWriteGlyphRunAnalysis IDWriteGlyphRunAnalysis;
-#endif
-
-#ifndef __IDWriteInlineObject_FWD_DEFINED__
-#define __IDWriteInlineObject_FWD_DEFINED__
-typedef struct IDWriteInlineObject IDWriteInlineObject;
+typedef interface IDWriteFontFileLoader IDWriteFontFileLoader;
+#ifdef __cplusplus
+interface IDWriteFontFileLoader;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteLocalFontFileLoader_FWD_DEFINED__
 #define __IDWriteLocalFontFileLoader_FWD_DEFINED__
-typedef struct IDWriteLocalFontFileLoader IDWriteLocalFontFileLoader;
+typedef interface IDWriteLocalFontFileLoader IDWriteLocalFontFileLoader;
+#ifdef __cplusplus
+interface IDWriteLocalFontFileLoader;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFile_FWD_DEFINED__
+#define __IDWriteFontFile_FWD_DEFINED__
+typedef interface IDWriteFontFile IDWriteFontFile;
+#ifdef __cplusplus
+interface IDWriteFontFile;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFileEnumerator_FWD_DEFINED__
+#define __IDWriteFontFileEnumerator_FWD_DEFINED__
+typedef interface IDWriteFontFileEnumerator IDWriteFontFileEnumerator;
+#ifdef __cplusplus
+interface IDWriteFontFileEnumerator;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontCollectionLoader_FWD_DEFINED__
+#define __IDWriteFontCollectionLoader_FWD_DEFINED__
+typedef interface IDWriteFontCollectionLoader IDWriteFontCollectionLoader;
+#ifdef __cplusplus
+interface IDWriteFontCollectionLoader;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteLocalizedStrings_FWD_DEFINED__
 #define __IDWriteLocalizedStrings_FWD_DEFINED__
-typedef struct IDWriteLocalizedStrings IDWriteLocalizedStrings;
-#endif
-
-#ifndef __IDWriteNumberSubstitution_FWD_DEFINED__
-#define __IDWriteNumberSubstitution_FWD_DEFINED__
-typedef struct IDWriteNumberSubstitution IDWriteNumberSubstitution;
-#endif
-
-#ifndef __IDWritePixelSnapping_FWD_DEFINED__
-#define __IDWritePixelSnapping_FWD_DEFINED__
-typedef struct IDWritePixelSnapping IDWritePixelSnapping;
+typedef interface IDWriteLocalizedStrings IDWriteLocalizedStrings;
+#ifdef __cplusplus
+interface IDWriteLocalizedStrings;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteRenderingParams_FWD_DEFINED__
 #define __IDWriteRenderingParams_FWD_DEFINED__
-typedef struct IDWriteRenderingParams IDWriteRenderingParams;
+typedef interface IDWriteRenderingParams IDWriteRenderingParams;
+#ifdef __cplusplus
+interface IDWriteRenderingParams;
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IDWriteTextAnalysisSink_FWD_DEFINED__
-#define __IDWriteTextAnalysisSink_FWD_DEFINED__
-typedef struct IDWriteTextAnalysisSink IDWriteTextAnalysisSink;
+#ifndef __IDWriteFontFace_FWD_DEFINED__
+#define __IDWriteFontFace_FWD_DEFINED__
+typedef interface IDWriteFontFace IDWriteFontFace;
+#ifdef __cplusplus
+interface IDWriteFontFace;
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IDWriteTextAnalysisSource_FWD_DEFINED__
-#define __IDWriteTextAnalysisSource_FWD_DEFINED__
-typedef struct IDWriteTextAnalysisSource IDWriteTextAnalysisSource;
+#ifndef __IDWriteFont_FWD_DEFINED__
+#define __IDWriteFont_FWD_DEFINED__
+typedef interface IDWriteFont IDWriteFont;
+#ifdef __cplusplus
+interface IDWriteFont;
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IDWriteTextAnalyzer_FWD_DEFINED__
-#define __IDWriteTextAnalyzer_FWD_DEFINED__
-typedef struct IDWriteTextAnalyzer IDWriteTextAnalyzer;
+#ifndef __IDWriteFontList_FWD_DEFINED__
+#define __IDWriteFontList_FWD_DEFINED__
+typedef interface IDWriteFontList IDWriteFontList;
+#ifdef __cplusplus
+interface IDWriteFontList;
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IDWriteTextFormat_FWD_DEFINED__
-#define __IDWriteTextFormat_FWD_DEFINED__
-typedef struct IDWriteTextFormat IDWriteTextFormat;
+#ifndef __IDWriteFontFamily_FWD_DEFINED__
+#define __IDWriteFontFamily_FWD_DEFINED__
+typedef interface IDWriteFontFamily IDWriteFontFamily;
+#ifdef __cplusplus
+interface IDWriteFontFamily;
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IDWriteTextLayout_FWD_DEFINED__
-#define __IDWriteTextLayout_FWD_DEFINED__
-typedef struct IDWriteTextLayout IDWriteTextLayout;
+#ifndef __IDWriteFontCollection_FWD_DEFINED__
+#define __IDWriteFontCollection_FWD_DEFINED__
+typedef interface IDWriteFontCollection IDWriteFontCollection;
+#ifdef __cplusplus
+interface IDWriteFontCollection;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWritePixelSnapping_FWD_DEFINED__
+#define __IDWritePixelSnapping_FWD_DEFINED__
+typedef interface IDWritePixelSnapping IDWritePixelSnapping;
+#ifdef __cplusplus
+interface IDWritePixelSnapping;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteTextRenderer_FWD_DEFINED__
 #define __IDWriteTextRenderer_FWD_DEFINED__
-typedef struct IDWriteTextRenderer IDWriteTextRenderer;
+typedef interface IDWriteTextRenderer IDWriteTextRenderer;
+#ifdef __cplusplus
+interface IDWriteTextRenderer;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteInlineObject_FWD_DEFINED__
+#define __IDWriteInlineObject_FWD_DEFINED__
+typedef interface IDWriteInlineObject IDWriteInlineObject;
+#ifdef __cplusplus
+interface IDWriteInlineObject;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextFormat_FWD_DEFINED__
+#define __IDWriteTextFormat_FWD_DEFINED__
+typedef interface IDWriteTextFormat IDWriteTextFormat;
+#ifdef __cplusplus
+interface IDWriteTextFormat;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteTypography_FWD_DEFINED__
 #define __IDWriteTypography_FWD_DEFINED__
-typedef struct IDWriteTypography IDWriteTypography;
-#endif
-
-#include <dcommon.h>
-
-typedef enum DWRITE_INFORMATIONAL_STRING_ID {
-  DWRITE_INFORMATIONAL_STRING_NONE = 0,
-  DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
-  DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
-  DWRITE_INFORMATIONAL_STRING_TRADEMARK,
-  DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
-  DWRITE_INFORMATIONAL_STRING_DESIGNER,
-  DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
-  DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
-  DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
-  DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
-  DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
-  DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
-  DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
-  DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
-  DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
-  DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT,
-  DWRITE_INFORMATIONAL_STRING_FULL_NAME,
-  DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME,
-  DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME
-} DWRITE_INFORMATIONAL_STRING_ID;
-
-typedef enum DWRITE_BREAK_CONDITION {
-  DWRITE_BREAK_CONDITION_NEUTRAL         = 0,
-  DWRITE_BREAK_CONDITION_CAN_BREAK       = 1,
-  DWRITE_BREAK_CONDITION_MAY_NOT_BREAK   = 2,
-  DWRITE_BREAK_CONDITION_MUST_BREAK      = 3 
-} DWRITE_BREAK_CONDITION;
-
-typedef enum DWRITE_FACTORY_TYPE {
-  DWRITE_FACTORY_TYPE_SHARED = 0,
-  DWRITE_FACTORY_TYPE_ISOLATED 
-} DWRITE_FACTORY_TYPE;
-
-typedef enum DWRITE_FLOW_DIRECTION {
-  DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM 
-} DWRITE_FLOW_DIRECTION;
-
-typedef enum DWRITE_FONT_FACE_TYPE {
-  DWRITE_FONT_FACE_TYPE_CFF = 0,
-  DWRITE_FONT_FACE_TYPE_TRUETYPE,
-  DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
-  DWRITE_FONT_FACE_TYPE_TYPE1,
-  DWRITE_FONT_FACE_TYPE_VECTOR,
-  DWRITE_FONT_FACE_TYPE_BITMAP,
-  DWRITE_FONT_FACE_TYPE_UNKNOWN 
-} DWRITE_FONT_FACE_TYPE;
-
-typedef enum DWRITE_FONT_FEATURE_TAG {
-  DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS             = 0x63726661,
-  DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS     = 0x63703263,
-  DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS      = 0x63733263,
-  DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES             = 0x746c6163,
-  DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS              = 0x65736163,
-  DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION   = 0x706d6363,
-  DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES              = 0x67696c63,
-  DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING                   = 0x70737063,
-  DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH                  = 0x68777363,
-  DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING               = 0x73727563,
-  DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES           = 0x67696c64,
-  DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS                      = 0x74707865,
-  DWRITE_FONT_FEATURE_TAG_FRACTIONS                         = 0x63617266,
-  DWRITE_FONT_FEATURE_TAG_FULL_WIDTH                        = 0x64697766,
-  DWRITE_FONT_FEATURE_TAG_HALF_FORMS                        = 0x666c6168,
-  DWRITE_FONT_FEATURE_TAG_HALANT_FORMS                      = 0x6e6c6168,
-  DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH              = 0x746c6168,
-  DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS                  = 0x74736968,
-  DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES        = 0x616e6b68,
-  DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES              = 0x67696c68,
-  DWRITE_FONT_FEATURE_TAG_HALF_WIDTH                        = 0x64697768,
-  DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS                  = 0x6f6a6f68,
-  DWRITE_FONT_FEATURE_TAG_JIS04_FORMS                       = 0x3430706a,
-  DWRITE_FONT_FEATURE_TAG_JIS78_FORMS                       = 0x3837706a,
-  DWRITE_FONT_FEATURE_TAG_JIS83_FORMS                       = 0x3338706a,
-  DWRITE_FONT_FEATURE_TAG_JIS90_FORMS                       = 0x3039706a,
-  DWRITE_FONT_FEATURE_TAG_KERNING                           = 0x6e72656b,
-  DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES                = 0x6167696c,
-  DWRITE_FONT_FEATURE_TAG_LINING_FIGURES                    = 0x6d756e6c,
-  DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS                   = 0x6c636f6c,
-  DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING                  = 0x6b72616d,
-  DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK                = 0x6b72676d,
-  DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING          = 0x6b6d6b6d,
-  DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS        = 0x746c616e,
-  DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS                   = 0x6b636c6e,
-  DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES                 = 0x6d756e6f,
-  DWRITE_FONT_FEATURE_TAG_ORDINALS                          = 0x6e64726f,
-  DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH      = 0x746c6170,
-  DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS                   = 0x70616370,
-  DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES              = 0x6d756e70,
-  DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS               = 0x64697770,
-  DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS                    = 0x64697771,
-  DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES                = 0x67696c72,
-  DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS               = 0x79627572,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES              = 0x746c6173,
-  DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS              = 0x666e6973,
-  DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS                    = 0x70636d73,
-  DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS                  = 0x6c706d73,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1                   = 0x31307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2                   = 0x32307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3                   = 0x33307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4                   = 0x34307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5                   = 0x35307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6                   = 0x36307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7                   = 0x37307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8                   = 0x38307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9                   = 0x39307373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10                  = 0x30317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11                  = 0x31317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12                  = 0x32317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13                  = 0x33317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14                  = 0x34317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15                  = 0x35317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16                  = 0x36317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17                  = 0x37317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18                  = 0x38317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19                  = 0x39317373,
-  DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20                  = 0x30327373,
-  DWRITE_FONT_FEATURE_TAG_SUBSCRIPT                         = 0x73627573,
-  DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT                       = 0x73707573,
-  DWRITE_FONT_FEATURE_TAG_SWASH                             = 0x68737773,
-  DWRITE_FONT_FEATURE_TAG_TITLING                           = 0x6c746974,
-  DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS            = 0x6d616e74,
-  DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES                   = 0x6d756e74,
-  DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS                 = 0x64617274,
-  DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS                      = 0x64697774,
-  DWRITE_FONT_FEATURE_TAG_UNICASE                           = 0x63696e75,
-  DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO                      = 0x6f72657a 
-} DWRITE_FONT_FEATURE_TAG;
-
-typedef enum DWRITE_FONT_FILE_TYPE {
-  DWRITE_FONT_FILE_TYPE_UNKNOWN = 0,
-  DWRITE_FONT_FILE_TYPE_CFF,
-  DWRITE_FONT_FILE_TYPE_TRUETYPE,
-  DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
-  DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
-  DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
-  DWRITE_FONT_FILE_TYPE_VECTOR,
-  DWRITE_FONT_FILE_TYPE_BITMAP 
-} DWRITE_FONT_FILE_TYPE;
-
-typedef enum DWRITE_FONT_SIMULATIONS {
-  DWRITE_FONT_SIMULATIONS_NONE      = 0x0000,
-  DWRITE_FONT_SIMULATIONS_BOLD      = 0x0001,
-  DWRITE_FONT_SIMULATIONS_OBLIQUE   = 0x0002 
-} DWRITE_FONT_SIMULATIONS;
-
-#ifdef DEFINE_ENUM_FLAG_OPERATORS
-DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
-#endif
-
-typedef enum DWRITE_FONT_STRETCH {
-  DWRITE_FONT_STRETCH_UNDEFINED         = 0,
-  DWRITE_FONT_STRETCH_ULTRA_CONDENSED   = 1,
-  DWRITE_FONT_STRETCH_EXTRA_CONDENSED   = 2,
-  DWRITE_FONT_STRETCH_CONDENSED         = 3,
-  DWRITE_FONT_STRETCH_SEMI_CONDENSED    = 4,
-  DWRITE_FONT_STRETCH_NORMAL            = 5,
-  DWRITE_FONT_STRETCH_MEDIUM            = 5,
-  DWRITE_FONT_STRETCH_SEMI_EXPANDED     = 6,
-  DWRITE_FONT_STRETCH_EXPANDED          = 7,
-  DWRITE_FONT_STRETCH_EXTRA_EXPANDED    = 8,
-  DWRITE_FONT_STRETCH_ULTRA_EXPANDED    = 9 
-} DWRITE_FONT_STRETCH;
-
-typedef enum DWRITE_FONT_STYLE {
-  DWRITE_FONT_STYLE_NORMAL = 0,
-  DWRITE_FONT_STYLE_OBLIQUE,
-  DWRITE_FONT_STYLE_ITALIC 
-} DWRITE_FONT_STYLE;
-
-typedef enum DWRITE_FONT_WEIGHT {
-  DWRITE_FONT_WEIGHT_THIN          = 100,
-  DWRITE_FONT_WEIGHT_EXTRA_LIGHT   = 200,
-  DWRITE_FONT_WEIGHT_ULTRA_LIGHT   = 200,
-  DWRITE_FONT_WEIGHT_LIGHT         = 300,
-  DWRITE_FONT_WEIGHT_NORMAL        = 400,
-  DWRITE_FONT_WEIGHT_REGULAR       = 400,
-  DWRITE_FONT_WEIGHT_MEDIUM        = 500,
-  DWRITE_FONT_WEIGHT_DEMI_BOLD     = 600,
-  DWRITE_FONT_WEIGHT_SEMI_BOLD     = 600,
-  DWRITE_FONT_WEIGHT_BOLD          = 700,
-  DWRITE_FONT_WEIGHT_EXTRA_BOLD    = 800,
-  DWRITE_FONT_WEIGHT_ULTRA_BOLD    = 800,
-  DWRITE_FONT_WEIGHT_BLACK         = 900,
-  DWRITE_FONT_WEIGHT_HEAVY         = 900,
-  DWRITE_FONT_WEIGHT_EXTRA_BLACK   = 950,
-  DWRITE_FONT_WEIGHT_ULTRA_BLACK   = 950 
-} DWRITE_FONT_WEIGHT;
-
-typedef enum DWRITE_LINE_SPACING_METHOD {
-  DWRITE_LINE_SPACING_METHOD_DEFAULT = 0,
-  DWRITE_LINE_SPACING_METHOD_UNIFORM 
-} DWRITE_LINE_SPACING_METHOD;
-
-typedef enum DWRITE_NUMBER_SUBSTITUTION_METHOD {
-  DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE = 0,
-  DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
-  DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
-  DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
-  DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL 
-} DWRITE_NUMBER_SUBSTITUTION_METHOD;
-
-typedef enum DWRITE_PARAGRAPH_ALIGNMENT {
-  DWRITE_PARAGRAPH_ALIGNMENT_NEAR = 0,
-  DWRITE_PARAGRAPH_ALIGNMENT_FAR,
-  DWRITE_PARAGRAPH_ALIGNMENT_CENTER 
-} DWRITE_PARAGRAPH_ALIGNMENT;
-
-typedef enum DWRITE_PIXEL_GEOMETRY {
-  DWRITE_PIXEL_GEOMETRY_FLAT = 0,
-  DWRITE_PIXEL_GEOMETRY_RGB,
-  DWRITE_PIXEL_GEOMETRY_BGR 
-} DWRITE_PIXEL_GEOMETRY;
-
-typedef enum DWRITE_READING_DIRECTION {
-  DWRITE_READING_DIRECTION_LEFT_TO_RIGHT = 0,
-  DWRITE_READING_DIRECTION_RIGHT_TO_LEFT 
-} DWRITE_READING_DIRECTION;
-
-typedef enum DWRITE_RENDERING_MODE {
-  DWRITE_RENDERING_MODE_DEFAULT = 0,
-  DWRITE_RENDERING_MODE_ALIASED,
-  DWRITE_RENDERING_MODE_GDI_CLASSIC,
-  DWRITE_RENDERING_MODE_GDI_NATURAL,
-  DWRITE_RENDERING_MODE_NATURAL,
-  DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
-  DWRITE_RENDERING_MODE_OUTLINE,
-  DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC       = DWRITE_RENDERING_MODE_GDI_CLASSIC,
-  DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL       = DWRITE_RENDERING_MODE_GDI_NATURAL,
-  DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL           = DWRITE_RENDERING_MODE_NATURAL,
-  DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC
-} DWRITE_RENDERING_MODE;
-
-typedef enum DWRITE_SCRIPT_SHAPES {
-  DWRITE_SCRIPT_SHAPES_DEFAULT     = 0,
-  DWRITE_SCRIPT_SHAPES_NO_VISUAL   = 1 
-} DWRITE_SCRIPT_SHAPES;
-
-typedef enum DWRITE_TEXT_ALIGNMENT {
-  DWRITE_TEXT_ALIGNMENT_LEADING = 0,
-  DWRITE_TEXT_ALIGNMENT_TRAILING,
-  DWRITE_TEXT_ALIGNMENT_CENTER 
-} DWRITE_TEXT_ALIGNMENT;
-
-typedef enum DWRITE_TEXTURE_TYPE {
-  DWRITE_TEXTURE_ALIASED_1x1 = 0,
-  DWRITE_TEXTURE_CLEARTYPE_3x1 
-} DWRITE_TEXTURE_TYPE;
-
-typedef enum DWRITE_TRIMMING_GRANULARITY {
-  DWRITE_TRIMMING_GRANULARITY_NONE,
-  DWRITE_TRIMMING_GRANULARITY_CHARACTER,
-  DWRITE_TRIMMING_GRANULARITY_WORD 
-} DWRITE_TRIMMING_GRANULARITY;
-
-typedef enum DWRITE_WORD_WRAPPING {
-  DWRITE_WORD_WRAPPING_WRAP,
-  DWRITE_WORD_WRAPPING_NO_WRAP 
-} DWRITE_WORD_WRAPPING;
-
-typedef struct _DWRITE_OVERHANG_METRICS {
-  FLOAT left;
-  FLOAT top;
-  FLOAT right;
-  FLOAT bottom;
-} DWRITE_OVERHANG_METRICS, *PDWRITE_OVERHANG_METRICS;
-
-typedef struct DWRITE_CLUSTER_METRICS {
-  FLOAT  width;
-  UINT16 length;
-  UINT16 canWrapLineAfter  :1;
-  UINT16 isWhitespace  :1;
-  UINT16 isNewline  :1;
-  UINT16 isSoftHyphen  :1;
-  UINT16 isRightToLeft  :1;
-  UINT16 padding  :11;
-} DWRITE_CLUSTER_METRICS;
-
-typedef struct DWRITE_FONT_FEATURE {
-  DWRITE_FONT_FEATURE_TAG nameTag;
-  UINT32                  parameter;
-} DWRITE_FONT_FEATURE;
-
-typedef struct DWRITE_FONT_METRICS {
-  UINT16 designUnitsPerEm;
-  UINT16 ascent;
-  UINT16 descent;
-  INT16  lineGap;
-  UINT16 capHeight;
-  UINT16 xHeight;
-  INT16  underlinePosition;
-  UINT16 underlineThickness;
-  INT16  strikethroughPosition;
-  UINT16 strikethroughThickness;
-} DWRITE_FONT_METRICS;
-
-typedef struct DWRITE_GLYPH_METRICS {
-  INT32  leftSideBearing;
-  UINT32 advanceWidth;
-  INT32  rightSideBearing;
-  INT32  topSideBearing;
-  UINT32 advanceHeight;
-  INT32  bottomSideBearing;
-  INT32  verticalOriginY;
-} DWRITE_GLYPH_METRICS;
-
-typedef struct DWRITE_GLYPH_OFFSET {
-  FLOAT advanceOffset;
-  FLOAT ascenderOffset;
-} DWRITE_GLYPH_OFFSET;
-
-typedef struct DWRITE_GLYPH_RUN {
-  IDWriteFontFace           *fontFace;
-  FLOAT                     fontEmSize;
-  UINT32                    glyphCount;
-  const UINT16              *glyphIndices;
-  const FLOAT               *glyphAdvances;
-  const DWRITE_GLYPH_OFFSET *glyphOffsets;
-  WINBOOL                   isSideways;
-  UINT32                    bidiLevel;
-} DWRITE_GLYPH_RUN;
-
-typedef struct DWRITE_GLYPH_RUN_DESCRIPTION {
-  const WCHAR  *localeName;
-  const WCHAR  *string;
-  UINT32       stringLength;
-  const UINT16 *clusterMap;
-  UINT32       textPosition;
-} DWRITE_GLYPH_RUN_DESCRIPTION;
-
-typedef struct DWRITE_HIT_TEST_METRICS {
-  UINT32  textPosition;
-  UINT32  length;
-  FLOAT   left;
-  FLOAT   top;
-  FLOAT   width;
-  FLOAT   height;
-  UINT32  bidiLevel;
-  WINBOOL isText;
-  WINBOOL isTrimmed;
-} DWRITE_HIT_TEST_METRICS;
-
-typedef struct DWRITE_INLINE_OBJECT_METRICS {
-  FLOAT   width;
-  FLOAT   height;
-  FLOAT   baseline;
-  WINBOOL supportsSideways;
-} DWRITE_INLINE_OBJECT_METRICS;
-
-typedef struct DWRITE_LINE_BREAKPOINT {
-  UINT8 breakConditionBefore  :2;
-  UINT8 breakConditionAfter  :2;
-  UINT8 isWhitespace  :1;
-  UINT8 isSoftHyphen  :1;
-  UINT8 padding  :2;
-} DWRITE_LINE_BREAKPOINT;
-
-typedef struct DWRITE_LINE_METRICS {
-  UINT32  length;
-  UINT32  trailingWhitespaceLength;
-  UINT32  newlineLength;
-  FLOAT   height;
-  FLOAT   baseline;
-  WINBOOL isTrimmed;
-} DWRITE_LINE_METRICS;
-
-typedef struct DWRITE_MATRIX {
-  FLOAT m11;
-  FLOAT m12;
-  FLOAT m21;
-  FLOAT m22;
-  FLOAT dx;
-  FLOAT dy;
-} DWRITE_MATRIX;
-
-typedef struct DWRITE_SCRIPT_ANALYSIS {
-  UINT16               script;
-  DWRITE_SCRIPT_SHAPES shapes;
-} DWRITE_SCRIPT_ANALYSIS;
-
-typedef struct DWRITE_SHAPING_GLYPH_PROPERTIES {
-  UINT16 justification  :4;
-  UINT16 isClusterStart  :1;
-  UINT16 isDiacritic  :1;
-  UINT16 isZeroWidthSpace  :1;
-  UINT16 reserved  :9;
-} DWRITE_SHAPING_GLYPH_PROPERTIES;
-
-typedef struct DWRITE_SHAPING_TEXT_PROPERTIES {
-  UINT16 isShapedAlone  :1;
-  UINT16 reserved  :15;
-} DWRITE_SHAPING_TEXT_PROPERTIES;
-
-typedef struct DWRITE_STRIKETHROUGH {
-  FLOAT                    width;
-  FLOAT                    thickness;
-  FLOAT                    offset;
-  DWRITE_READING_DIRECTION readingDirection;
-  DWRITE_FLOW_DIRECTION    flowDirection;
-  const WCHAR              *localeName;
-  DWRITE_MEASURING_MODE    measuringMode;
-} DWRITE_STRIKETHROUGH;
-
-typedef struct DWRITE_TEXT_METRICS {
-  FLOAT  left;
-  FLOAT  top;
-  FLOAT  width;
-  FLOAT  widthIncludingTrailingWhitespace;
-  FLOAT  height;
-  FLOAT  layoutWidth;
-  FLOAT  layoutHeight;
-  UINT32 maxBidiReorderingDepth;
-  UINT32 lineCount;
-} DWRITE_TEXT_METRICS;
-
-typedef struct DWRITE_TEXT_RANGE {
-  UINT32 startPosition;
-  UINT32 length;
-} DWRITE_TEXT_RANGE;
-
-typedef struct DWRITE_TRIMMING {
-  DWRITE_TRIMMING_GRANULARITY granularity;
-  UINT32                      delimiter;
-  UINT32                      delimiterCount;
-} DWRITE_TRIMMING;
-
-typedef struct DWRITE_TYPOGRAPHIC_FEATURES {
-  DWRITE_FONT_FEATURE *features;
-  UINT32              featureCount;
-} DWRITE_TYPOGRAPHIC_FEATURES;
-
-typedef struct DWRITE_UNDERLINE {
-  FLOAT                    width;
-  FLOAT                    thickness;
-  FLOAT                    offset;
-  FLOAT                    runHeight;
-  DWRITE_READING_DIRECTION readingDirection;
-  DWRITE_FLOW_DIRECTION    flowDirection;
-  const WCHAR              *localeName;
-  DWRITE_MEASURING_MODE    measuringMode;
-} DWRITE_UNDERLINE;
-
-#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
-    (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \
-    (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \
-    (static_cast<UINT32>(static_cast<UINT8>(b)) << 8) | \
-     static_cast<UINT32>(static_cast<UINT8>(a)))
-
-#ifndef __MINGW_DEF_ARG_VAL
+typedef interface IDWriteTypography IDWriteTypography;
 #ifdef __cplusplus
-#define __MINGW_DEF_ARG_VAL(x) = x
-#else
-#define __MINGW_DEF_ARG_VAL(x)
-#endif
+interface IDWriteTypography;
+#endif /* __cplusplus */
 #endif
 
-#undef  INTERFACE
-#define INTERFACE IDWriteBitmapRenderTarget
-DECLARE_INTERFACE_(IDWriteBitmapRenderTarget,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteBitmapRenderTarget_FWD_DEFINED__
+#define __IDWriteBitmapRenderTarget_FWD_DEFINED__
+typedef interface IDWriteBitmapRenderTarget IDWriteBitmapRenderTarget;
+#ifdef __cplusplus
+interface IDWriteBitmapRenderTarget;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteBitmapRenderTarget methods */
-    STDMETHOD(DrawGlyphRun)(THIS_
-        FLOAT baselineOriginX,
-        FLOAT baselineOriginY,
-        DWRITE_MEASURING_MODE measuringMode,
-        DWRITE_GLYPH_RUN const *glyphRun,
-        IDWriteRenderingParams *renderingParams,
-        COLORREF textColor,
-        RECT *blackBoxRect __MINGW_DEF_ARG_VAL(NULL)) PURE;
-
-    STDMETHOD_(HDC, GetMemoryDC)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetPixelsPerDip)(THIS) PURE;
-
-    STDMETHOD(SetPixelsPerDip)(THIS_
-        FLOAT pixelsPerDip) PURE;
-
-    STDMETHOD(GetCurrentTransform)(THIS_
-        DWRITE_MATRIX* transform) PURE;
-
-    STDMETHOD(SetCurrentTransform)(THIS_
-        DWRITE_MATRIX const *transform) PURE;
-
-    STDMETHOD(GetSize)(THIS_
-        SIZE *size) PURE;
-
-    STDMETHOD(Resize)(THIS_
-        UINT32 width,
-        UINT32 height) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteBitmapRenderTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteBitmapRenderTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteBitmapRenderTarget_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteBitmapRenderTarget_DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuringMode,glyphRun,renderingParams,textColor,blackBoxRect) (This)->lpVtbl->DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuringMode,glyphRun,renderingParams,textColor,blackBoxRect)
-#define IDWriteBitmapRenderTarget_GetCurrentTransform(This,transform) (This)->lpVtbl->GetCurrentTransform(This,transform)
-#define IDWriteBitmapRenderTarget_GetMemoryDC() (This)->lpVtbl->GetMemoryDC(This)
-#define IDWriteBitmapRenderTarget_GetPixelsPerDip() (This)->lpVtbl->GetPixelsPerDip(This)
-#define IDWriteBitmapRenderTarget_GetSize(This,size) (This)->lpVtbl->GetSize(This,size)
-#define IDWriteBitmapRenderTarget_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
-#define IDWriteBitmapRenderTarget_SetCurrentTransform(This,transform) (This)->lpVtbl->SetCurrentTransform(This,transform)
-#define IDWriteBitmapRenderTarget_SetPixelsPerDip(This,pixelsPerDip) (This)->lpVtbl->SetPixelsPerDip(This,pixelsPerDip)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFactory
-DECLARE_INTERFACE_(IDWriteFactory,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteGdiInterop_FWD_DEFINED__
+#define __IDWriteGdiInterop_FWD_DEFINED__
+typedef interface IDWriteGdiInterop IDWriteGdiInterop;
+#ifdef __cplusplus
+interface IDWriteGdiInterop;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFactory methods */
-    STDMETHOD(GetSystemFontCollection)(THIS_
-        IDWriteFontCollection **fontCollection,
-        WINBOOL checkForUpdates __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(CreateCustomFontCollection)(THIS_
-        IDWriteFontCollectionLoader *collectionLoader,
-        void const *collectionKey,
-        UINT32 collectionKeySize,
-        IDWriteFontCollection **fontCollection) PURE;
-
-    STDMETHOD(RegisterFontCollectionLoader)(THIS_
-        IDWriteFontCollectionLoader *fontCollectionLoader) PURE;
-
-    STDMETHOD(UnregisterFontCollectionLoader)(THIS_
-        IDWriteFontCollectionLoader *fontCollectionLoader) PURE;
-
-    STDMETHOD(CreateFontFileReference)(THIS_
-        WCHAR const *filePath,
-        FILETIME const *lastWriteTime,
-        IDWriteFontFile **fontFile) PURE;
-
-    STDMETHOD(CreateCustomFontFileReference)(THIS_
-        void const *fontFileReferenceKey,
-        UINT32 fontFileReferenceKeySize,
-        IDWriteFontFileLoader *fontFileLoader,
-        IDWriteFontFile **fontFile) PURE;
-
-    STDMETHOD(CreateFontFace)(THIS_
-        DWRITE_FONT_FACE_TYPE fontFaceType,
-        UINT32 numberOfFiles,
-        IDWriteFontFile *const *fontFiles,
-        UINT32 faceIndex,
-        DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
-        IDWriteFontFace **fontFace) PURE;
-
-    STDMETHOD(CreateRenderingParams)(THIS_
-        IDWriteRenderingParams **renderingParams) PURE;
-
-    STDMETHOD(CreateMonitorRenderingParams)(THIS_
-        HMONITOR monitor,
-        IDWriteRenderingParams **renderingParams) PURE;
-
-    STDMETHOD(CreateCustomRenderingParams)(THIS_
-        FLOAT gamma,
-        FLOAT enhancedContrast,
-        FLOAT clearTypeLevel,
-        DWRITE_PIXEL_GEOMETRY pixelGeometry,
-        DWRITE_RENDERING_MODE renderingMode,
-        IDWriteRenderingParams **renderingParams) PURE;
-
-    STDMETHOD(RegisterFontFileLoader)(THIS_
-        IDWriteFontFileLoader *fontFileLoader) PURE;
-
-    STDMETHOD(UnregisterFontFileLoader)(THIS_
-        IDWriteFontFileLoader *fontFileLoader) PURE;
-
-    STDMETHOD(CreateTextFormat)(THIS_
-        WCHAR const *fontFamilyName,
-        IDWriteFontCollection *fontCollection,
-        DWRITE_FONT_WEIGHT fontWeight,
-        DWRITE_FONT_STYLE fontStyle,
-        DWRITE_FONT_STRETCH fontStretch,
-        FLOAT fontSize,
-        WCHAR const *localeName,
-        IDWriteTextFormat **textFormat) PURE;
-
-    STDMETHOD(CreateTypography)(THIS_
-        IDWriteTypography **typography) PURE;
-
-    STDMETHOD(GetGdiInterop)(THIS_
-        IDWriteGdiInterop **gdiInterop) PURE;
-
-    STDMETHOD(CreateTextLayout)(THIS_
-        WCHAR const *string,
-        UINT32 stringLength,
-        IDWriteTextFormat *textFormat,
-        FLOAT maxWidth,
-        FLOAT maxHeight,
-        IDWriteTextLayout **textLayout) PURE;
-
-    STDMETHOD(CreateGdiCompatibleTextLayout)(THIS_
-        WCHAR const *string,
-        UINT32 stringLength,
-        IDWriteTextFormat *textFormat,
-        FLOAT layoutWidth,
-        FLOAT layoutHeight,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        IDWriteTextLayout **textLayout) PURE;
-
-    STDMETHOD(CreateEllipsisTrimmingSign)(THIS_
-        IDWriteTextFormat *textFormat,
-        IDWriteInlineObject **trimmingSign) PURE;
-
-    STDMETHOD(CreateTextAnalyzer)(THIS_
-        IDWriteTextAnalyzer **textAnalyzer) PURE;
-
-    STDMETHOD(CreateNumberSubstitution)(THIS_
-        DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
-        WCHAR const *localeName,
-        WINBOOL ignoreUserOverride,
-        IDWriteNumberSubstitution **numberSubstitution) PURE;
-
-    STDMETHOD(CreateGlyphRunAnalysis)(THIS_
-        DWRITE_GLYPH_RUN const *glyphRun,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_RENDERING_MODE renderingMode,
-        DWRITE_MEASURING_MODE measuringMode,
-        FLOAT baselineOriginX,
-        FLOAT baselineOriginY,
-        IDWriteGlyphRunAnalysis **glyphRunAnalysis) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFactory_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFactory_CreateCustomFontCollection(This,collectionLoader,collectionKey,collectionKeySize,fontCollection) (This)->lpVtbl->CreateCustomFontCollection(This,collectionLoader,collectionKey,collectionKeySize,fontCollection)
-#define IDWriteFactory_CreateCustomFontFileReference(This,fontFileReferenceKey,fontFileReferenceKeySize,fontFileLoader,fontFile) (This)->lpVtbl->CreateCustomFontFileReference(This,fontFileReferenceKey,fontFileReferenceKeySize,fontFileLoader,fontFile)
-#define IDWriteFactory_CreateCustomRenderingParams(This,gamma,enhancedContrast,clearTypeLevel,pixelGeometry,renderingMode,renderingParams) (This)->lpVtbl->CreateCustomRenderingParams(This,gamma,enhancedContrast,clearTypeLevel,pixelGeometry,renderingMode,renderingParams)
-#define IDWriteFactory_CreateGdiCompatibleTextLayout(This,string,stringLength,textFormat,layoutWidth,layoutHeight,pixelsPerDip,transform,useGdiNatural,textLayout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,stringLength,textFormat,layoutWidth,layoutHeight,pixelsPerDip,transform,useGdiNatural,textLayout)
-#define IDWriteFactory_CreateEllipsisTrimmingSign(This,textFormat,trimmingSign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,textFormat,trimmingSign)
-#define IDWriteFactory_CreateFontFace(This,fontFaceType,numberOfFiles,fontFiles,faceIndex,fontFaceSimulationFlags,fontFace) (This)->lpVtbl->CreateFontFace(This,fontFaceType,numberOfFiles,fontFiles,faceIndex,fontFaceSimulationFlags,fontFace)
-#define IDWriteFactory_CreateFontFileReference(This,filePath,lastWriteTime,fontFile) (This)->lpVtbl->CreateFontFileReference(This,filePath,lastWriteTime,fontFile)
-#define IDWriteFactory_CreateGlyphRunAnalysis(This,glyphRun,pixelsPerDip,transform,renderingMode,measuringMode,baselineOriginX,baselineOriginY,glyphRunAnalysis) (This)->lpVtbl->CreateGlyphRunAnalysis(This,glyphRun,pixelsPerDip,transform,renderingMode,measuringMode,baselineOriginX,baselineOriginY,glyphRunAnalysis)
-#define IDWriteFactory_CreateMonitorRenderingParams(This,monitor,renderingParams) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,renderingParams)
-#define IDWriteFactory_CreateNumberSubstitution(This,substitutionMethod,localeName,ignoreUserOverride,numberSubstitution) (This)->lpVtbl->CreateNumberSubstitution(This,substitutionMethod,localeName,ignoreUserOverride,numberSubstitution)
-#define IDWriteFactory_CreateRenderingParams(This,renderingParams) (This)->lpVtbl->CreateRenderingParams(This,renderingParams)
-#define IDWriteFactory_CreateTextAnalyzer(This,textAnalyzer) (This)->lpVtbl->CreateTextAnalyzer(This,textAnalyzer)
-#define IDWriteFactory_CreateTextFormat(This,fontFamilyName,fontCollection,fontWeight,fontStyle,fontStretch,fontSize,localeName,textFormat) (This)->lpVtbl->CreateTextFormat(This,fontFamilyName,fontCollection,fontWeight,fontStyle,fontStretch,fontSize,localeName,textFormat)
-#define IDWriteFactory_CreateTextLayout(This,string,stringLength,textFormat,maxWidth,maxHeight,textLayout) (This)->lpVtbl->CreateTextLayout(This,string,stringLength,textFormat,maxWidth,maxHeight,textLayout)
-#define IDWriteFactory_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
-#define IDWriteFactory_GetGdiInterop(This,gdiInterop) (This)->lpVtbl->GetGdiInterop(This,gdiInterop)
-#define IDWriteFactory_GetSystemFontCollection(This,fontCollection,checkForUpdates) (This)->lpVtbl->GetSystemFontCollection(This,fontCollection,checkForUpdates)
-#define IDWriteFactory_RegisterFontCollectionLoader(This,fontCollectionLoader) (This)->lpVtbl->RegisterFontCollectionLoader(This,fontCollectionLoader)
-#define IDWriteFactory_RegisterFontFileLoader(This,fontFileLoader) (This)->lpVtbl->RegisterFontFileLoader(This,fontFileLoader)
-#define IDWriteFactory_UnregisterFontCollectionLoader(This,fontCollectionLoader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,fontCollectionLoader)
-#define IDWriteFactory_UnregisterFontFileLoader(This,fontFileLoader) (This)->lpVtbl->UnregisterFontFileLoader(This,fontFileLoader)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFont
-DECLARE_INTERFACE_(IDWriteFont,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteTextLayout_FWD_DEFINED__
+#define __IDWriteTextLayout_FWD_DEFINED__
+typedef interface IDWriteTextLayout IDWriteTextLayout;
+#ifdef __cplusplus
+interface IDWriteTextLayout;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFont methods */
-    STDMETHOD(GetFontFamily)(THIS_
-        IDWriteFontFamily **fontFamily) PURE;
-
-    STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)(THIS) PURE;
-    STDMETHOD_(WINBOOL, IsSymbolFont)(THIS) PURE;
-
-    STDMETHOD(GetFaceNames)(THIS_
-        IDWriteLocalizedStrings **names) PURE;
-
-    STDMETHOD(GetInformationalStrings)(THIS_
-        DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
-        IDWriteLocalizedStrings **informationalStrings,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)(THIS) PURE;
-
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS *fontMetrics) PURE;
-
-    STDMETHOD(HasCharacter)(THIS_
-        UINT32 unicodeValue,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD(CreateFontFace)(THIS_
-        IDWriteFontFace **fontFace) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFont_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFont_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFont_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFont_CreateFontFace(This,fontFace) (This)->lpVtbl->CreateFontFace(This,fontFace)
-#define IDWriteFont_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
-#define IDWriteFont_GetFontFamily(This,fontFamily) (This)->lpVtbl->GetFontFamily(This,fontFamily)
-#define IDWriteFont_GetInformationalStrings(This,informationalStringID,informationalStrings,exists) (This)->lpVtbl->GetInformationalStrings(This,informationalStringID,informationalStrings,exists)
-#define IDWriteFont_GetMetrics(This,fontMetrics) (This)->lpVtbl->GetMetrics(This,fontMetrics)
-#define IDWriteFont_GetSimulations() (This)->lpVtbl->GetSimulations(This)
-#define IDWriteFont_GetStretch() (This)->lpVtbl->GetStretch(This)
-#define IDWriteFont_GetStyle() (This)->lpVtbl->GetStyle(This)
-#define IDWriteFont_GetWeight() (This)->lpVtbl->GetWeight(This)
-#define IDWriteFont_HasCharacter(This,unicodeValue,exists) (This)->lpVtbl->HasCharacter(This,unicodeValue,exists)
-#define IDWriteFont_IsSymbolFont() (This)->lpVtbl->IsSymbolFont(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontCollection
-DECLARE_INTERFACE_(IDWriteFontCollection,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteNumberSubstitution_FWD_DEFINED__
+#define __IDWriteNumberSubstitution_FWD_DEFINED__
+typedef interface IDWriteNumberSubstitution IDWriteNumberSubstitution;
+#ifdef __cplusplus
+interface IDWriteNumberSubstitution;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFontCollection methods */
-    STDMETHOD_(UINT32, GetFontFamilyCount)(THIS) PURE;
-
-    STDMETHOD(GetFontFamily)(THIS_
-        UINT32 index,
-        IDWriteFontFamily **fontFamily) PURE;
-
-    STDMETHOD(FindFamilyName)(THIS_
-        WCHAR const *familyName,
-        UINT32 *index,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD(GetFontFromFontFace)(THIS_
-        IDWriteFontFace* fontFace,
-        IDWriteFont **font) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontCollection_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontCollection_FindFamilyName(This,familyName,index,exists) (This)->lpVtbl->FindFamilyName(This,familyName,index,exists)
-#define IDWriteFontCollection_GetFontFamily(This,index,fontFamily) (This)->lpVtbl->GetFontFamily(This,index,fontFamily)
-#define IDWriteFontCollection_GetFontFamilyCount() (This)->lpVtbl->GetFontFamilyCount(This)
-#define IDWriteFontCollection_GetFontFromFontFace(This,fontFace,font) (This)->lpVtbl->GetFontFromFontFace(This,fontFace,font)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFace
-DECLARE_INTERFACE_(IDWriteFontFace,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteTextAnalysisSource_FWD_DEFINED__
+#define __IDWriteTextAnalysisSource_FWD_DEFINED__
+typedef interface IDWriteTextAnalysisSource IDWriteTextAnalysisSource;
+#ifdef __cplusplus
+interface IDWriteTextAnalysisSource;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFontFace methods */
-    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)(THIS) PURE;
-
-    STDMETHOD(GetFiles)(THIS_
-        UINT32 *numberOfFiles,
-        IDWriteFontFile **fontFiles) PURE;
-
-    STDMETHOD_(UINT32, GetIndex)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)(THIS) PURE;
-    STDMETHOD_(WINBOOL, IsSymbolFont)(THIS) PURE;
-
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-    STDMETHOD_(UINT16, GetGlyphCount)(THIS) PURE;
-
-    STDMETHOD(GetDesignGlyphMetrics)(THIS_
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(GetGlyphIndices)(THIS_
-        UINT32 const *codePoints,
-        UINT32 codePointCount,
-        UINT16 *glyphIndices) PURE;
-
-    STDMETHOD(TryGetFontTable)(THIS_
-        UINT32 openTypeTableTag,
-        const void **tableData,
-        UINT32 *tableSize,
-        void **tableContext,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD_(void, ReleaseFontTable)(THIS_
-        void *tableContext) PURE;
-
-    STDMETHOD(GetGlyphRunOutline)(THIS_
-        FLOAT emSize,
-        UINT16 const *glyphIndices,
-        FLOAT const *glyphAdvances,
-        DWRITE_GLYPH_OFFSET const *glyphOffsets,
-        UINT32 glyphCount,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        IDWriteGeometrySink *geometrySink) PURE;
-
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE *renderingMode) PURE;
-
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-
-    STDMETHOD(GetGdiCompatibleGlyphMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontFace_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontFace_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontFace_GetDesignGlyphMetrics(This,glyphIndices,glyphCount,glyphMetrics,isSideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyphIndices,glyphCount,glyphMetrics,isSideways)
-#define IDWriteFontFace_GetFiles(This,fontFiles) (This)->lpVtbl->GetFiles(This,fontFiles)
-#define IDWriteFontFace_GetGdiCompatibleMetrics(This,emSize,pixelsPerDip,transform,fontFaceMetrics) (This)->lpVtbl->GetGdiCompatibleMetrics(This,emSize,pixelsPerDip,transform,fontFaceMetrics)
-#define IDWriteFontFace_GetGdiCompatibleGlyphMetrics(This,emSize,pixelsPerDip,transform,useGdiNatural,glyphIndices,glyphCount,glyphMetrics,isSideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixelsPerDip,transform,useGdiNatural,glyphIndices,glyphCount,glyphMetrics,isSideways)
-#define IDWriteFontFace_GetGlyphCount() (This)->lpVtbl->GetGlyphCount(This)
-#define IDWriteFontFace_GetGlyphIndices(This,codePoints,codePointCount,glyphIndices) (This)->lpVtbl->GetGlyphIndices(This,codePoints,codePointCount,glyphIndices)
-#define IDWriteFontFace_GetGlyphRunOutline(This,emSize,glyphIndices,glyphOffsets,glyphCount,isSideways,isRightToLeft,geometrySink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyphIndices,glyphOffsets,glyphCount,isSideways,isRightToLeft,geometrySink)
-#define IDWriteFontFace_GetIndex() (This)->lpVtbl->GetIndex(This)
-#define IDWriteFontFace_GetMetrics(This,fontFaceMetrics) (This)->lpVtbl->GetMetrics(This,fontFaceMetrics)
-#define IDWriteFontFace_GetRecommendedRenderingMode(This,emSize,pixelsPerDip,measuringMode,renderingParams,renderingMode) (This)->lpVtbl->GetRecommendedRenderingMode(This,emSize,pixelsPerDip,measuringMode,renderingParams,renderingMode)
-#define IDWriteFontFace_GetSimulations() (This)->lpVtbl->GetSimulations(This)
-#define IDWriteFontFace_GetType() (This)->lpVtbl->GetType(This)
-#define IDWriteFontFace_IsSymbolFont() (This)->lpVtbl->IsSymbolFont(This)
-#define IDWriteFontFace_ReleaseFontTable(This,tableContext) (This)->lpVtbl->ReleaseFontTable(This,tableContext)
-#define IDWriteFontFace_TryGetFontTable(This,openTypeTableTag,tableData,tableSize,tableContext,exists) (This)->lpVtbl->TryGetFontTable(This,openTypeTableTag,tableData,tableSize,tableContext,exists)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontList
-DECLARE_INTERFACE_(IDWriteFontList,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteTextAnalysisSink_FWD_DEFINED__
+#define __IDWriteTextAnalysisSink_FWD_DEFINED__
+typedef interface IDWriteTextAnalysisSink IDWriteTextAnalysisSink;
+#ifdef __cplusplus
+interface IDWriteTextAnalysisSink;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFontList methods */
-    STDMETHOD(GetFontCollection)(THIS_
-        IDWriteFontCollection** fontCollection) PURE;
-
-    STDMETHOD_(UINT32, GetFontCount)(THIS) PURE;
-
-    STDMETHOD(GetFont)(THIS_
-        UINT32 index,
-        IDWriteFont **font) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontList_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontList_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontList_GetFont(This,index,font) (This)->lpVtbl->GetFont(This,index,font)
-#define IDWriteFontList_GetFontCollection(This,fontCollection) (This)->lpVtbl->GetFontCollection(This,fontCollection)
-#define IDWriteFontList_GetFontCount() (This)->lpVtbl->GetFontCount(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFamily
-DECLARE_INTERFACE_(IDWriteFontFamily,IDWriteFontList)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteFontList methods */
-    STDMETHOD(GetFontCollection)(THIS_
-        IDWriteFontCollection** fontCollection) PURE;
-
-    STDMETHOD_(UINT32, GetFontCount)(THIS) PURE;
-
-    STDMETHOD(GetFont)(THIS_
-        UINT32 index,
-        IDWriteFont **font) PURE;
+#ifndef __IDWriteTextAnalyzer_FWD_DEFINED__
+#define __IDWriteTextAnalyzer_FWD_DEFINED__
+typedef interface IDWriteTextAnalyzer IDWriteTextAnalyzer;
+#ifdef __cplusplus
+interface IDWriteTextAnalyzer;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFontFamily methods */
-    STDMETHOD(GetFamilyNames)(THIS_
-        IDWriteLocalizedStrings **names) PURE;
-
-    STDMETHOD(GetFirstMatchingFont)(THIS_
-        DWRITE_FONT_WEIGHT weight,
-        DWRITE_FONT_STRETCH stretch,
-        DWRITE_FONT_STYLE style,
-        IDWriteFont **matchingFont) PURE;
-
-    STDMETHOD(GetMatchingFonts)(THIS_
-        DWRITE_FONT_WEIGHT weight,
-        DWRITE_FONT_STRETCH stretch,
-        DWRITE_FONT_STYLE style,
-        IDWriteFontList **matchingFonts) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontFamily_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontFamily_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontFamily_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontFamily_GetFont(This,index,font) (This)->lpVtbl->GetFont(This,index,font)
-#define IDWriteFontFamily_GetFontCollection(This,fontCollection) (This)->lpVtbl->GetFontCollection(This,fontCollection)
-#define IDWriteFontFamily_GetFontCount() (This)->lpVtbl->GetFontCount(This)
-#define IDWriteFontFamily_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
-#define IDWriteFontFamily_GetFirstMatchingFont(This,weight,stretch,style,matchingFont) (This)->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,matchingFont)
-#define IDWriteFontFamily_GetMatchingFonts(This,weight,stretch,style,matchingFonts) (This)->lpVtbl->GetMatchingFonts(This,weight,stretch,style,matchingFonts)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFile
-DECLARE_INTERFACE_(IDWriteFontFile,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteGlyphRunAnalysis_FWD_DEFINED__
+#define __IDWriteGlyphRunAnalysis_FWD_DEFINED__
+typedef interface IDWriteGlyphRunAnalysis IDWriteGlyphRunAnalysis;
+#ifdef __cplusplus
+interface IDWriteGlyphRunAnalysis;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFontFile methods */
-    STDMETHOD(GetReferenceKey)(THIS_
-        void const **fontFileReferenceKey,
-        UINT32 *fontFileReferenceKeySize) PURE;
-
-    STDMETHOD(GetLoader)(THIS_
-        IDWriteFontFileLoader **fontFileLoader) PURE;
-
-    STDMETHOD(Analyze)(THIS_
-        WINBOOL *isSupportedFontType,
-        DWRITE_FONT_FILE_TYPE *fontFileType,
-        DWRITE_FONT_FACE_TYPE *fontFaceType,
-        UINT32 *numberOfFaces) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontFile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontFile_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontFile_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontFile_Analyze(This,isSupportedFontType,fontFileType,fontFaceType,numberOfFaces) (This)->lpVtbl->Analyze(This,isSupportedFontType,fontFileType,fontFaceType,numberOfFaces)
-#define IDWriteFontFile_GetLoader(This,fontFileLoader) (This)->lpVtbl->GetLoader(This,fontFileLoader)
-#define IDWriteFontFile_GetReferenceKey(This,fontFileReferenceKey,fontFileReferenceKeySize) (This)->lpVtbl->GetReferenceKey(This,fontFileReferenceKey,fontFileReferenceKeySize)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFileLoader
-DECLARE_INTERFACE_(IDWriteFontFileLoader,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IDWriteFactory_FWD_DEFINED__
+#define __IDWriteFactory_FWD_DEFINED__
+typedef interface IDWriteFactory IDWriteFactory;
+#ifdef __cplusplus
+interface IDWriteFactory;
+#endif /* __cplusplus */
 #endif
 
-    /* IDWriteFontFileLoader methods */
-    STDMETHOD(CreateStreamFromKey)(
-        void const *fontFileReferenceKey,
-        UINT32 fontFileReferenceKeySize,
-        IDWriteFontFileStream **fontFileStream) PURE;
+/* Headers for imported files */
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontFileLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontFileLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontFileLoader_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontFileLoader_CreateStreamFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,fontFileStream) (This)->lpVtbl->CreateStreamFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,fontFileStream)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFileStream
-DECLARE_INTERFACE_(IDWriteFontFileStream,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteFontFileStream methods */
-    STDMETHOD(ReadFileFragment)(THIS_
-        void const **fragmentStart,
-        UINT64 fileOffset,
-        UINT64 fragmentSize,
-        void** fragmentContext) PURE;
-
-    STDMETHOD_(void, ReleaseFileFragment)(THIS_
-        void *fragmentContext) PURE;
-
-    STDMETHOD(GetFileSize)(THIS_
-        UINT64 *fileSize) PURE;
-
-    STDMETHOD(GetLastWriteTime)(THIS_
-        UINT64 *lastWriteTime) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontFileStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontFileStream_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontFileStream_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontFileStream_GetFileSize(This,fileSize) (This)->lpVtbl->GetFileSize(This,fileSize)
-#define IDWriteFontFileStream_GetLastWriteTime(This,lastWriteTime) (This)->lpVtbl->GetLastWriteTime(This,lastWriteTime)
-#define IDWriteFontFileStream_ReadFileFragment(This,fragmentStart,fileOffset,fragmentSize,fragmentContext) (This)->lpVtbl->ReadFileFragment(This,fragmentStart,fileOffset,fragmentSize,fragmentContext)
-#define IDWriteFontFileStream_ReleaseFileFragment(This,fragmentContext) (This)->lpVtbl->ReleaseFileFragment(This,fragmentContext)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontCollectionLoader
-DECLARE_INTERFACE_(IDWriteFontCollectionLoader,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteFontCollectionLoader methods */
-    STDMETHOD_(HRESULT,CreateEnumeratorFromKey)(THIS_ IDWriteFactory * factory,const void * collectionKey,UINT32  collectionKeySize,IDWriteFontFileEnumerator ** fontFileEnumerator) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontCollectionLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontCollectionLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontCollectionLoader_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontCollectionLoader_CreateEnumeratorFromKey(This,factory,collectionKey,collectionKeySize,fontFileEnumerator) (This)->lpVtbl->CreateEnumeratorFromKey(This,factory,collectionKey,collectionKeySize,fontFileEnumerator)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFileEnumerator
-DECLARE_INTERFACE_(IDWriteFontFileEnumerator,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteFontFileEnumerator methods */
-    STDMETHOD_(HRESULT,MoveNext)(THIS_ WINBOOL * hasCurrentFile) PURE;
-    STDMETHOD_(HRESULT,GetCurrentFontFile)(THIS_ IDWriteFontFile ** fontFile) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteFontFileEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteFontFileEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteFontFileEnumerator_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteFontFileEnumerator_GetCurrentFontFile(This,fontFile) (This)->lpVtbl->GetCurrentFontFile(This,fontFile)
-#define IDWriteFontFileEnumerator_MoveNext(This,hasCurrentFile) (This)->lpVtbl->MoveNext(This,hasCurrentFile)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteGdiInterop
-DECLARE_INTERFACE_(IDWriteGdiInterop,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteGdiInterop methods */
-    STDMETHOD(CreateFontFromLOGFONT)(THIS_
-        LOGFONTW const *logFont,
-        IDWriteFont **font) PURE;
-
-    STDMETHOD(ConvertFontToLOGFONT)(THIS_
-        IDWriteFont *font,
-        LOGFONTW *logFont,
-        WINBOOL *isSystemFont) PURE;
-
-    STDMETHOD(ConvertFontFaceToLOGFONT)(THIS_
-        IDWriteFontFace *font,
-        LOGFONTW *logFont) PURE;
-
-    STDMETHOD(CreateFontFaceFromHdc)(THIS_
-        HDC hdc,
-        IDWriteFontFace **fontFace) PURE;
-
-    STDMETHOD(CreateBitmapRenderTarget)(THIS_
-        HDC hdc,
-        UINT32 width,
-        UINT32 height,
-        IDWriteBitmapRenderTarget **renderTarget) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteGdiInterop_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteGdiInterop_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteGdiInterop_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteGdiInterop_ConvertFontFaceToLOGFONT(This,font,logFont) (This)->lpVtbl->ConvertFontFaceToLOGFONT(This,font,logFont)
-#define IDWriteGdiInterop_ConvertFontToLOGFONT(This,font,logFont,isSystemFont) (This)->lpVtbl->ConvertFontToLOGFONT(This,font,logFont,isSystemFont)
-#define IDWriteGdiInterop_CreateBitmapRenderTarget(This,hdc,width,height,renderTarget) (This)->lpVtbl->CreateBitmapRenderTarget(This,hdc,width,height,renderTarget)
-#define IDWriteGdiInterop_CreateFontFaceFromHdc(This,hdc,fontFace) (This)->lpVtbl->CreateFontFaceFromHdc(This,hdc,fontFace)
-#define IDWriteGdiInterop_CreateFontFromLOGFONT(This,logFont,font) (This)->lpVtbl->CreateFontFromLOGFONT(This,logFont,font)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteGlyphRunAnalysis
-DECLARE_INTERFACE_(IDWriteGlyphRunAnalysis,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteGlyphRunAnalysis methods */
-    STDMETHOD(GetAlphaTextureBounds)(THIS_
-        DWRITE_TEXTURE_TYPE textureType,
-        RECT *textureBounds) PURE;
-
-    STDMETHOD(CreateAlphaTexture)(THIS_
-        DWRITE_TEXTURE_TYPE textureType,
-        RECT const *textureBounds,
-        BYTE *alphaValues,
-        UINT32 bufferSize) PURE;
-
-    STDMETHOD(GetAlphaBlendParams)(THIS_
-        IDWriteRenderingParams *renderingParams,
-        FLOAT *blendGamma,
-        FLOAT *blendEnhancedContrast,
-        FLOAT *blendClearTypeLevel) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteGlyphRunAnalysis_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteGlyphRunAnalysis_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteGlyphRunAnalysis_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteGlyphRunAnalysis_CreateAlphaTexture(This,textureType,textureBounds,alphaValues,bufferSize) (This)->lpVtbl->CreateAlphaTexture(This,textureType,textureBounds,alphaValues,bufferSize)
-#define IDWriteGlyphRunAnalysis_GetAlphaBlendParams(This,renderingParams,blendGamma,blendEnhancedContrast,blendClearTypeLevel) (This)->lpVtbl->GetAlphaBlendParams(This,renderingParams,blendGamma,blendEnhancedContrast,blendClearTypeLevel)
-#define IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(This,textureType,textureBounds) (This)->lpVtbl->GetAlphaTextureBounds(This,textureType,textureBounds)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteInlineObject
-DECLARE_INTERFACE_(IDWriteInlineObject,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteInlineObject methods */
-    STDMETHOD(Draw)(THIS_
-            void *clientDrawingContext,
-            IDWriteTextRenderer *renderer,
-            FLOAT originX,
-            FLOAT originY,
-            WINBOOL isSideways,
-            WINBOOL isRightToLeft,
-            IUnknown *clientDrawingEffect) PURE;
-    STDMETHOD(GetMetrics)(THIS_
-            DWRITE_INLINE_OBJECT_METRICS *metrics) PURE;
-    STDMETHOD(GetOverhangMetrics)(THIS_
-            DWRITE_OVERHANG_METRICS *overhangs) PURE;
-    STDMETHOD(GetBreakConditions)(THIS_
-            DWRITE_BREAK_CONDITION *breakConditionBefore,
-            DWRITE_BREAK_CONDITION *breakConditionAfter) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteInlineObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteInlineObject_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteInlineObject_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteInlineObject_Draw(This,clientDrawingContext,renderer,originX,originY,isSideways,isRightToLeft,clientDrawingEffect) (This)->lpVtbl->Draw(This,clientDrawingContext,renderer,originX,originY,isSideways,isRightToLeft,clientDrawingEffect)
-#define IDWriteInlineObject_GetBreakConditions(This,breakConditionBefore,breakConditionAfter) (This)->lpVtbl->GetBreakConditions(This,breakConditionBefore,breakConditionAfter)
-#define IDWriteInlineObject_GetMetrics(This,metrics) (This)->lpVtbl->GetMetrics(This,metrics)
-#define IDWriteInlineObject_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteLocalFontFileLoader
-DECLARE_INTERFACE_(IDWriteLocalFontFileLoader,IDWriteFontFileLoader)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteFontFileLoader methods */
-    STDMETHOD(CreateStreamFromKey)(THIS_ const void *fontFileReferenceKey,UINT32 fontFileReferenceKeySize,IDWriteFontFileStream **fileStream) PURE;
-#endif
-
-    /* IDWriteLocalFontFileLoader methods */
-    STDMETHOD(GetFilePathLengthFromKey)(THIS_ const void *fontFileReferenceKey,UINT32 fontFileReferenceKeySize,UINT32 *filePathLength) PURE;
-    STDMETHOD(GetFilePathFromKey)(THIS_ const void *fontFileReferenceKey,UINT32 fontFileReferenceKeySize,WCHAR *filePath,UINT32 filePathSize) PURE;
-    STDMETHOD(GetLastWriteTimeFromKey)(THIS_ const void *fontFileReferenceKey,UINT32 fontFileReferenceKeySize,FILETIME *lastWriteTime) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteLocalFontFileLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteLocalFontFileLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteLocalFontFileLoader_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteLocalFontFileLoader_CreateStreamFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,fileStream) (This)->lpVtbl->CreateStreamFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,fileStream)
-#define IDWriteLocalFontFileLoader_GetFilePathLengthFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,filePathLength) (This)->lpVtbl->GetFilePathLengthFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,filePathLength)
-#define IDWriteLocalFontFileLoader_GetFilePathFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,filePath,filePathSize) (This)->lpVtbl->GetFilePathFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,filePath,filePathSize)
-#define IDWriteLocalFontFileLoader_GetLastWriteTimeFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,lastWriteTime) (This)->lpVtbl->GetLastWriteTimeFromKey(This,fontFileReferenceKey,fontFileReferenceKeySize,lastWriteTime)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteLocalizedStrings
-DECLARE_INTERFACE_(IDWriteLocalizedStrings,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteLocalizedStrings methods */
-    STDMETHOD_(UINT32, GetCount)(THIS) PURE;
-
-    STDMETHOD(FindLocaleName)(THIS_
-        WCHAR const *localeName,
-        UINT32 *index,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD(GetLocaleNameLength)(THIS_
-        UINT32 index,
-        UINT32 *length) PURE;
-
-    STDMETHOD(GetLocaleName)(THIS_
-        UINT32 index,
-        WCHAR *localeName,
-        UINT32 size) PURE;
-
-    STDMETHOD(GetStringLength)(THIS_
-        UINT32 index,
-        UINT32 *length) PURE;
-
-    STDMETHOD(GetString)(THIS_
-        UINT32 index,
-        WCHAR *stringBuffer,
-        UINT32 size) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteLocalizedStrings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteLocalizedStrings_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteLocalizedStrings_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteLocalizedStrings_FindLocaleName(This,localeName,index,exists) (This)->lpVtbl->FindLocaleName(This,localeName,index,exists)
-#define IDWriteLocalizedStrings_GetCount() (This)->lpVtbl->GetCount(This)
-#define IDWriteLocalizedStrings_GetLocaleName(This,index,localeName,size) (This)->lpVtbl->GetLocaleName(This,index,localeName,size)
-#define IDWriteLocalizedStrings_GetLocaleNameLength(This,index,length) (This)->lpVtbl->GetLocaleNameLength(This,index,length)
-#define IDWriteLocalizedStrings_GetString(This,index,stringBuffer,size) (This)->lpVtbl->GetString(This,index,stringBuffer,size)
-#define IDWriteLocalizedStrings_GetStringLength(This,index,length) (This)->lpVtbl->GetStringLength(This,index,length)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteNumberSubstitution
-DECLARE_INTERFACE_(IDWriteNumberSubstitution,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteNumberSubstitution methods */
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteNumberSubstitution_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteNumberSubstitution_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteNumberSubstitution_Release(This) (This)->lpVtbl->Release(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWritePixelSnapping
-DECLARE_INTERFACE_(IDWritePixelSnapping,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWritePixelSnapping methods */
-    STDMETHOD(IsPixelSnappingDisabled)(THIS_
-            void *clientDrawingContext,
-            WINBOOL *isDisabled) PURE;
-    STDMETHOD(GetCurrentTransform)(THIS_
-            void *clientDrawingContext,
-            DWRITE_MATRIX *transform) PURE;
-    STDMETHOD(GetPixelsPerDip)(THIS_
-            void *clientDrawingContext,
-            FLOAT *pixelsPerDip) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWritePixelSnapping_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWritePixelSnapping_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWritePixelSnapping_Release(This) (This)->lpVtbl->Release(This)
-#define IDWritePixelSnapping_GetCurrentTransform(This,clientDrawingContext,transform) (This)->lpVtbl->GetCurrentTransform(This,clientDrawingContext,transform)
-#define IDWritePixelSnapping_GetPixelsPerDip(This,clientDrawingContext,pixelsPerDip) (This)->lpVtbl->GetPixelsPerDip(This,clientDrawingContext,pixelsPerDip)
-#define IDWritePixelSnapping_IsPixelSnappingEnabled(This,clientDrawingContext,isDisabled) (This)->lpVtbl->IsPixelSnappingEnabled(This,clientDrawingContext,isDisabled)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteRenderingParams
-DECLARE_INTERFACE_(IDWriteRenderingParams,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteRenderingParams methods */
-    STDMETHOD_(FLOAT, GetGamma)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetEnhancedContrast)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetClearTypeLevel)(THIS) PURE;
-    STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)(THIS) PURE;
-    STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)(THIS) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteRenderingParams_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteRenderingParams_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteRenderingParams_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteRenderingParams_GetClearTypeLevel() (This)->lpVtbl->GetClearTypeLevel(This)
-#define IDWriteRenderingParams_GetEnhancedContrast() (This)->lpVtbl->GetEnhancedContrast(This)
-#define IDWriteRenderingParams_GetGamma() (This)->lpVtbl->GetGamma(This)
-#define IDWriteRenderingParams_GetPixelGeometry() (This)->lpVtbl->GetPixelGeometry(This)
-#define IDWriteRenderingParams_GetRenderingMode() (This)->lpVtbl->GetRenderingMode(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextAnalysisSink
-DECLARE_INTERFACE_(IDWriteTextAnalysisSink,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteTextAnalysisSink methods */
-    STDMETHOD(SetScriptAnalysis)(
-            UINT32 textPosition,
-            UINT32 textLength,
-            DWRITE_SCRIPT_ANALYSIS const *scriptAnalysis) PURE;
-
-    STDMETHOD(SetLineBreakpoints)(
-            UINT32 textPosition,
-            UINT32 textLength,
-            DWRITE_LINE_BREAKPOINT const *lineBreakpoints) PURE;
-
-    STDMETHOD(SetBidiLevel)(
-            UINT32 textPosition,
-            UINT32 textLength,
-            UINT8 explicitLevel,
-            UINT8 resolvedLevel) PURE;
-
-    STDMETHOD(SetNumberSubstitution)(
-            UINT32 textPosition,
-            UINT32 textLength,
-            IDWriteNumberSubstitution *numberSubstitution) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteTextAnalysisSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteTextAnalysisSink_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteTextAnalysisSink_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteTextAnalysisSink_SetBidiLevel(This,textPosition,textLength,explicitLevel,resolvedLevel) (This)->lpVtbl->SetBidiLevel(This,textPosition,textLength,explicitLevel,resolvedLevel)
-#define IDWriteTextAnalysisSink_SetLineBreakpoints(This,textPosition,textLength,lineBreakpoints) (This)->lpVtbl->SetLineBreakpoints(This,textPosition,textLength,lineBreakpoints)
-#define IDWriteTextAnalysisSink_SetNumberSubstitution(This,textPosition,textLength,numberSubstitution) (This)->lpVtbl->SetNumberSubstitution(This,textPosition,textLength,numberSubstitution)
-#define IDWriteTextAnalysisSink_SetScriptAnalysis(This,textPosition,textLength,scriptAnalysis) (This)->lpVtbl->SetScriptAnalysis(This,textPosition,textLength,scriptAnalysis)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextAnalysisSource
-DECLARE_INTERFACE_(IDWriteTextAnalysisSource,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteTextAnalysisSource methods */
-    STDMETHOD(GetTextAtPosition)(THIS_
-        UINT32 textPosition,
-        WCHAR const **textString,
-        UINT32 *textLength) PURE;
-
-    STDMETHOD(GetTextBeforePosition)(THIS_
-        UINT32 textPosition,
-        WCHAR const **textString,
-        UINT32 *textLength) PURE;
-
-    STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)(THIS) PURE;
-
-    STDMETHOD(GetLocaleName)(THIS_
-        UINT32 textPosition,
-        UINT32 *textLength,
-        WCHAR const **localeName) PURE;
-
-    STDMETHOD(GetNumberSubstitution)(THIS_
-        UINT32 textPosition,
-        UINT32 *textLength,
-        IDWriteNumberSubstitution **numberSubstitution) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteTextAnalysisSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteTextAnalysisSource_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteTextAnalysisSource_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteTextAnalysisSource_GetLocaleName(This,textPosition,textLength,localeName) (This)->lpVtbl->GetLocaleName(This,textPosition,textLength,localeName)
-#define IDWriteTextAnalysisSource_GetNumberSubstitution(This,textPosition,textLength,numberSubstitution) (This)->lpVtbl->GetNumberSubstitution(This,textPosition,textLength,numberSubstitution)
-#define IDWriteTextAnalysisSource_GetParagraphReadingDirection() (This)->lpVtbl->GetParagraphReadingDirection(This)
-#define IDWriteTextAnalysisSource_GetTextAtPosition(This,textPosition,textString,textLength) (This)->lpVtbl->GetTextAtPosition(This,textPosition,textString,textLength)
-#define IDWriteTextAnalysisSource_GetTextBeforePosition(This,textPosition,textString,textLength) (This)->lpVtbl->GetTextBeforePosition(This,textPosition,textString,textLength)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextAnalyzer
-DECLARE_INTERFACE_(IDWriteTextAnalyzer,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteTextAnalyzer methods */
-    STDMETHOD(AnalyzeScript)(THIS_
-        IDWriteTextAnalysisSource* analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteTextAnalysisSink *analysisSink) PURE;
-
-    STDMETHOD(AnalyzeBidi)(THIS_
-        IDWriteTextAnalysisSource *analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteTextAnalysisSink *analysisSink) PURE;
-
-    STDMETHOD(AnalyzeNumberSubstitution)(THIS_
-        IDWriteTextAnalysisSource *analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteTextAnalysisSink *analysisSink) PURE;
-
-    STDMETHOD(AnalyzeLineBreakpoints)(THIS_
-        IDWriteTextAnalysisSource *analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteTextAnalysisSink *analysisSink) PURE;
-
-    STDMETHOD(GetGlyphs)(THIS_
-        WCHAR const *textString,
-        UINT32 textLength,
-        IDWriteFontFace *fontFace,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        DWRITE_SCRIPT_ANALYSIS const *scriptAnalysis,
-        WCHAR const *localeName,
-        IDWriteNumberSubstitution *numberSubstitution,
-        DWRITE_TYPOGRAPHIC_FEATURES const **features,
-        UINT32 const *featureRangeLengths,
-        UINT32 featureRanges,
-        UINT32 maxGlyphCount,
-        UINT16 *clusterMap,
-        DWRITE_SHAPING_TEXT_PROPERTIES *textProps,
-        UINT16 *glyphIndices,
-        DWRITE_SHAPING_GLYPH_PROPERTIES *glyphProps,
-        UINT32 *actualGlyphCount) PURE;
-
-    STDMETHOD(GetGlyphPlacements)(THIS_
-        WCHAR const *textString,
-        UINT16 const *clusterMap,
-        DWRITE_SHAPING_TEXT_PROPERTIES *textProps,
-        UINT32 textLength,
-        UINT16 const *glyphIndices,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const *glyphProps,
-        UINT32 glyphCount,
-        IDWriteFontFace *fontFace,
-        FLOAT fontEmSize,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        DWRITE_SCRIPT_ANALYSIS const *scriptAnalysis,
-        WCHAR const *localeName,
-        DWRITE_TYPOGRAPHIC_FEATURES const **features,
-        UINT32 const *featureRangeLengths,
-        UINT32 featureRanges,
-        FLOAT *glyphAdvances,
-        DWRITE_GLYPH_OFFSET *glyphOffsets) PURE;
-
-    STDMETHOD(GetGdiCompatibleGlyphPlacements)(THIS_
-        WCHAR const *textString,
-        UINT16 const *clusterMap,
-        DWRITE_SHAPING_TEXT_PROPERTIES *textProps,
-        UINT32 textLength,
-        UINT16 const *glyphIndices,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const *glyphProps,
-        UINT32 glyphCount,
-        IDWriteFontFace *fontFace,
-        FLOAT fontEmSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
-        WCHAR const *localeName,
-        DWRITE_TYPOGRAPHIC_FEATURES const **features,
-        UINT32 const *featureRangeLengths,
-        UINT32 featureRanges,
-        FLOAT *glyphAdvances,
-        DWRITE_GLYPH_OFFSET *glyphOffsets) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteTextAnalyzer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteTextAnalyzer_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteTextAnalyzer_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteTextAnalyzer_AnalyzeBidi(This,analysisSource,textPosition,textLength,analysisSink) (This)->lpVtbl->AnalyzeBidi(This,analysisSource,textPosition,textLength,analysisSink)
-#define IDWriteTextAnalyzer_AnalyzeLineBreakpoints(This,analysisSource,textPosition,textLength,analysisSink) (This)->lpVtbl->AnalyzeLineBreakpoints(This,analysisSource,textPosition,textLength,analysisSink)
-#define IDWriteTextAnalyzer_AnalyzeNumberSubstitution(This,analysisSource,textPosition,textLength,analysisSink) (This)->lpVtbl->AnalyzeNumberSubstitution(This,analysisSource,textPosition,textLength,analysisSink)
-#define IDWriteTextAnalyzer_AnalyzeScript(This,analysisSource,textPosition,textLength,analysisSink) (This)->lpVtbl->AnalyzeScript(This,analysisSource,textPosition,textLength,analysisSink)
-#define IDWriteTextAnalyzer_GetGdiCompatibleGlyphPlacements(This,textString,clusterMap,textProps,textLength,glyphIndices,glyphProps,glyphCount,fontFace,fontEmSize,pixelsPerDip,transform,useGdiNatural,isSideways,isRightToLeft,scriptAnalysis,featureRangeLengths,featureRanges,glyphAdvances,glyphOffsets) (This)->lpVtbl->GetGdiCompatibleGlyphPlacements(This,textString,clusterMap,textProps,textLength,glyphIndices,glyphProps,glyphCount,fontFace,fontEmSize,pixelsPerDip,transform,useGdiNatural,isSideways,isRightToLeft,scriptAnalysis,featureRangeLengths,featureRanges,glyphAdvances,glyphOffsets)
-#define IDWriteTextAnalyzer_GetGlyphPlacements(This,textString,clusterMap,textProps,textLength,glyphIndices,glyphProps,glyphCount,fontFace,fontEmSize,isSideways,isRightToLeft,scriptAnalysis,featureRangeLengths,featureRanges,glyphAdvances,glyphOffsets) (This)->lpVtbl->GetGlyphPlacements(This,textString,clusterMap,textProps,textLength,glyphIndices,glyphProps,glyphCount,fontFace,fontEmSize,isSideways,isRightToLeft,scriptAnalysis,featureRangeLengths,featureRanges,glyphAdvances,glyphOffsets)
-#define IDWriteTextAnalyzer_GetGlyphs(This,textString,textLength,fontFace,isSideways,isRightToLeft,scriptAnalysis,featureRangeLengths,featureRanges,maxGlyphCount,clusterMap,textProps,glyphIndices,glyphProps,actualGlyphCount) (This)->lpVtbl->GetGlyphs(This,textString,textLength,fontFace,isSideways,isRightToLeft,scriptAnalysis,featureRangeLengths,featureRanges,maxGlyphCount,clusterMap,textProps,glyphIndices,glyphProps,actualGlyphCount)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextFormat
-DECLARE_INTERFACE_(IDWriteTextFormat,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteTextFormat methods */
-    STDMETHOD(SetTextAlignment)(THIS_
-            DWRITE_TEXT_ALIGNMENT textAlignment) PURE;
-    STDMETHOD(SetParagraphAlignment)(THIS_
-            DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment) PURE;
-    STDMETHOD(SetWordWrapping)(THIS_
-            DWRITE_WORD_WRAPPING wordWrapping) PURE;
-    STDMETHOD(SetReadingDirection)(THIS_
-            DWRITE_READING_DIRECTION readingDirection) PURE;
-    STDMETHOD(SetFlowDirection)(THIS_
-            DWRITE_FLOW_DIRECTION flowDirection) PURE;
-    STDMETHOD(SetIncrementalTabStop)(THIS_
-            FLOAT incrementalTabStop) PURE;
-    STDMETHOD(SetTrimming)(THIS_
-            DWRITE_TRIMMING const *trimmingOptions,
-            IDWriteInlineObject *trimmingSign) PURE;
-    STDMETHOD(SetLineSpacing)(THIS_
-            DWRITE_LINE_SPACING_METHOD lineSpacingMethod,
-            FLOAT lineSpacing,
-            FLOAT baseline) PURE;
-    STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)(THIS) PURE;
-    STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)(THIS) PURE;
-    STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)(THIS) PURE;
-    STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)(THIS) PURE;
-    STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetIncrementalTabStop)(THIS) PURE;
-    STDMETHOD(GetTrimming)(THIS_
-            DWRITE_TRIMMING* trimmingOptions,
-            IDWriteInlineObject **trimmingSign) PURE;
-    STDMETHOD(GetLineSpacing)(THIS_
-            DWRITE_LINE_SPACING_METHOD *lineSpacingMethod,
-            FLOAT *lineSpacing,
-            FLOAT *baseline) PURE;
-    STDMETHOD(GetFontCollection)(THIS_
-            IDWriteFontCollection **fontCollection) PURE;
-    STDMETHOD_(UINT32, GetFontFamilyNameLength)(THIS) PURE;
-    STDMETHOD(GetFontFamilyName)(THIS_
-            WCHAR *fontFamilyName,
-            UINT32 nameSize) PURE;
-    STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetFontSize)(THIS) PURE;
-    STDMETHOD_(UINT32, GetLocaleNameLength)(THIS) PURE;
-    STDMETHOD(GetLocaleName)(THIS_
-            WCHAR *localeName,
-            UINT32 nameSize) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteTextFormat_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteTextFormat_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteTextFormat_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteTextFormat_GetFlowDirection() (This)->lpVtbl->GetFlowDirection(This)
-#define IDWriteTextFormat_GetFontCollection(This,fontCollection) (This)->lpVtbl->GetFontCollection(This,fontCollection)
-#define IDWriteTextFormat_GetFontFamilyName(This,fontFamilyName,nameSize) (This)->lpVtbl->GetFontFamilyName(This,fontFamilyName,nameSize)
-#define IDWriteTextFormat_GetFontFamilyNameLength() (This)->lpVtbl->GetFontFamilyNameLength(This)
-#define IDWriteTextFormat_GetFontSize() (This)->lpVtbl->GetFontSize(This)
-#define IDWriteTextFormat_GetFontStretch() (This)->lpVtbl->GetFontStretch(This)
-#define IDWriteTextFormat_GetFontStyle() (This)->lpVtbl->GetFontStyle(This)
-#define IDWriteTextFormat_GetFontWeight() (This)->lpVtbl->GetFontWeight(This)
-#define IDWriteTextFormat_GetIncrementalTabStop() (This)->lpVtbl->GetIncrementalTabStop(This)
-#define IDWriteTextFormat_GetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline) (This)->lpVtbl->GetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline)
-#define IDWriteTextFormat_GetLocaleName(This,localeName,nameSize) (This)->lpVtbl->GetLocaleName(This,localeName,nameSize)
-#define IDWriteTextFormat_GetLocaleNameLength() (This)->lpVtbl->GetLocaleNameLength(This)
-#define IDWriteTextFormat_GetParagraphAlignment() (This)->lpVtbl->GetParagraphAlignment(This)
-#define IDWriteTextFormat_GetReadingDirection() (This)->lpVtbl->GetReadingDirection(This)
-#define IDWriteTextFormat_GetTextAlignment() (This)->lpVtbl->GetTextAlignment(This)
-#define IDWriteTextFormat_GetTrimming(This,trimmingOptions,trimmingSign) (This)->lpVtbl->GetTrimming(This,trimmingOptions,trimmingSign)
-#define IDWriteTextFormat_GetWordWrapping() (This)->lpVtbl->GetWordWrapping(This)
-#define IDWriteTextFormat_SetFlowDirection(This,flowDirection) (This)->lpVtbl->SetFlowDirection(This,flowDirection)
-#define IDWriteTextFormat_SetIncrementalTabStop(This,incrementalTabStop) (This)->lpVtbl->SetIncrementalTabStop(This,incrementalTabStop)
-#define IDWriteTextFormat_SetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline) (This)->lpVtbl->SetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline)
-#define IDWriteTextFormat_SetParagraphAlignment(This,paragraphAlignment) (This)->lpVtbl->SetParagraphAlignment(This,paragraphAlignment)
-#define IDWriteTextFormat_SetReadingDirection(This,readingDirection) (This)->lpVtbl->SetReadingDirection(This,readingDirection)
-#define IDWriteTextFormat_SetTextAlignment(This,textAlignment) (This)->lpVtbl->SetTextAlignment(This,textAlignment)
-#define IDWriteTextFormat_SetTrimming(This,trimmingOptions,trimmingSign) (This)->lpVtbl->SetTrimming(This,trimmingOptions,trimmingSign)
-#define IDWriteTextFormat_SetWordWrapping(This,wordWrapping) (This)->lpVtbl->SetWordWrapping(This,wordWrapping)
-#endif /*COBJMACROS*/
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextLayout
-DECLARE_INTERFACE_(IDWriteTextLayout,IDWriteTextFormat)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD(SetMaxWidth)(FLOAT maxWidth) PURE;
-    STDMETHOD(SetMaxHeight)(FLOAT maxHeight) PURE;
-    STDMETHOD(SetFontCollection)(IDWriteFontCollection *fontCollection,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontFamilyName)(WCHAR const *fontFamilyName,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontWeight)(DWRITE_FONT_WEIGHT fontWeight,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontStyle)(DWRITE_FONT_STYLE fontStyle,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontStretch)(DWRITE_FONT_STRETCH fontStretch,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontSize)(FLOAT fontSize,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetUnderline)(WINBOOL hasUnderline,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetStrikethrough)(WINBOOL hasStrikethrough,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetDrawingEffect)(IUnknown *drawingEffect,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetInlineObject)(IDWriteInlineObject *inlineObject,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetTypography)(IDWriteTypography *typography,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetLocaleName)(WCHAR const *localeName,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD_(FLOAT, GetMaxWidth)(void) PURE;
-    STDMETHOD_(FLOAT, GetMaxHeight)(void) PURE;
-    STDMETHOD(GetFontCollection)(UINT32 currentPosition,
-            IDWriteFontCollection** fontCollection,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontFamilyNameLength)(UINT32 currentPosition,
-            UINT32 *nameLength,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontFamilyName)(UINT32 currentPosition,
-            WCHAR *fontFamilyName,
-            UINT32 nameSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontWeight)(UINT32 currentPosition,
-            DWRITE_FONT_WEIGHT *fontWeight,
-            DWRITE_TEXT_RANGE* textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontStyle)(UINT32 currentPosition,
-            DWRITE_FONT_STYLE *fontStyle,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontStretch)(UINT32 currentPosition,
-            DWRITE_FONT_STRETCH* fontStretch,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontSize)(UINT32 currentPosition,
-            FLOAT *fontSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetUnderline)(UINT32 currentPosition,
-            WINBOOL *hasUnderline,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetStrikethrough)(UINT32 currentPosition,
-            WINBOOL *hasStrikethrough,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetDrawingEffect)(UINT32 currentPosition,
-            IUnknown **drawingEffect,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetInlineObject)(UINT32 currentPosition,
-            IDWriteInlineObject **inlineObject,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetTypography)(UINT32 currentPosition,
-            IDWriteTypography **typography,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetLocaleNameLength)(UINT32 currentPosition,
-            UINT32 *nameLength,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetLocaleName)(UINT32 currentPosition,
-            WCHAR *localeName,
-            UINT32 nameSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(Draw)(void *clientDrawingContext,
-            IDWriteTextRenderer *renderer,
-            FLOAT originX,
-            FLOAT originY) PURE;
-    STDMETHOD(GetLineMetrics)(DWRITE_LINE_METRICS *lineMetrics,
-            UINT32 maxLineCount,
-            UINT32 *actualLineCount) PURE;
-    STDMETHOD(GetMetrics)(DWRITE_TEXT_METRICS *textMetrics) PURE;
-    STDMETHOD(GetOverhangMetrics)(DWRITE_OVERHANG_METRICS *overhangs) PURE;
-    STDMETHOD(GetClusterMetrics)(DWRITE_CLUSTER_METRICS *clusterMetrics,
-            UINT32 maxClusterCount,
-            UINT32 *actualClusterCount) PURE;
-    STDMETHOD(DetermineMinWidth)(FLOAT *minWidth) PURE;
-    STDMETHOD(HitTestPoint)(FLOAT pointX,
-            FLOAT pointY,
-            WINBOOL *isTrailingHit,
-            WINBOOL *isInside,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics) PURE;
-    STDMETHOD(HitTestTextPosition)(UINT32 textPosition,
-            WINBOOL isTrailingHit,
-            FLOAT *pointX,
-            FLOAT *pointY,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics) PURE;
-    STDMETHOD(HitTestTextRange)(UINT32 textPosition,
-            UINT32 textLength,
-            FLOAT originX,
-            FLOAT originY,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics,
-            UINT32 maxHitTestMetricsCount,
-            UINT32 *actualHitTestMetricsCount) PURE;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteTextLayoutVtbl
-{
-    IDWriteTextFormatVtbl Base;
-
-    STDMETHOD(SetMaxWidth)(IDWriteTextLayout *This,
-            FLOAT maxWidth) PURE;
-    STDMETHOD(SetMaxHeight)(IDWriteTextLayout *This,
-            FLOAT maxHeight) PURE;
-    STDMETHOD(SetFontCollection)(IDWriteTextLayout *This,
-            IDWriteFontCollection *fontCollection,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontFamilyName)(IDWriteTextLayout *This,
-            WCHAR const *fontFamilyName,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontWeight)(IDWriteTextLayout *This,
-            DWRITE_FONT_WEIGHT fontWeight,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontStyle)(IDWriteTextLayout *This,
-            DWRITE_FONT_STYLE fontStyle,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontStretch)(IDWriteTextLayout *This,
-            DWRITE_FONT_STRETCH fontStretch,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontSize)(IDWriteTextLayout *This,
-            FLOAT fontSize,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetUnderline)(IDWriteTextLayout *This,
-            WINBOOL hasUnderline,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetStrikethrough)(IDWriteTextLayout *This,
-            WINBOOL hasStrikethrough,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetDrawingEffect)(IDWriteTextLayout *This,
-            IUnknown *drawingEffect,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetInlineObject)(IDWriteTextLayout *This,
-            IDWriteInlineObject *inlineObject,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetTypography)(IDWriteTextLayout *This,
-            IDWriteTypography *typography,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetLocaleName)(IDWriteTextLayout *This,
-            WCHAR const *localeName,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD_(FLOAT, GetMaxWidth)(IDWriteTextLayout *This) PURE;
-    STDMETHOD_(FLOAT, GetMaxHeight)(IDWriteTextLayout *This) PURE;
-    STDMETHOD(GetFontCollection)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            IDWriteFontCollection** fontCollection,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontFamilyNameLength)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            UINT32 *nameLength,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontFamilyName)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            WCHAR *fontFamilyName,
-            UINT32 nameSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontWeight)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            DWRITE_FONT_WEIGHT *fontWeight,
-            DWRITE_TEXT_RANGE* textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontStyle)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            DWRITE_FONT_STYLE *fontStyle,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontStretch)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            DWRITE_FONT_STRETCH* fontStretch,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontSize)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            FLOAT *fontSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetUnderline)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            WINBOOL *hasUnderline,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetStrikethrough)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            WINBOOL *hasStrikethrough,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetDrawingEffect)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            IUnknown **drawingEffect,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetInlineObject)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            IDWriteInlineObject **inlineObject,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetTypography)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            IDWriteTypography **typography,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetLocaleNameLength)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            UINT32 *nameLength,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetLocaleName)(IDWriteTextLayout *This,
-            UINT32 currentPosition,
-            WCHAR *localeName,
-            UINT32 nameSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(Draw)(IDWriteTextLayout *This,
-            void *clientDrawingContext,
-            IDWriteTextRenderer *renderer,
-            FLOAT originX,
-            FLOAT originY) PURE;
-    STDMETHOD(GetLineMetrics)(IDWriteTextLayout *This,
-            DWRITE_LINE_METRICS *lineMetrics,
-            UINT32 maxLineCount,
-            UINT32 *actualLineCount) PURE;
-    STDMETHOD(GetMetrics)(IDWriteTextLayout *This,
-            DWRITE_TEXT_METRICS *textMetrics) PURE;
-    STDMETHOD(GetOverhangMetrics)(IDWriteTextLayout *This,
-            DWRITE_OVERHANG_METRICS *overhangs) PURE;
-    STDMETHOD(GetClusterMetrics)(IDWriteTextLayout *This,
-            DWRITE_CLUSTER_METRICS *clusterMetrics,
-            UINT32 maxClusterCount,
-            UINT32 *actualClusterCount) PURE;
-    STDMETHOD(DetermineMinWidth)(IDWriteTextLayout *This,
-            FLOAT *minWidth) PURE;
-    STDMETHOD(HitTestPoint)(IDWriteTextLayout *This,
-            FLOAT pointX,
-            FLOAT pointY,
-            WINBOOL *isTrailingHit,
-            WINBOOL *isInside,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics) PURE;
-    STDMETHOD(HitTestTextPosition)(IDWriteTextLayout *This,
-            UINT32 textPosition,
-            WINBOOL isTrailingHit,
-            FLOAT *pointX,
-            FLOAT *pointY,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics) PURE;
-    STDMETHOD(HitTestTextRange)(IDWriteTextLayout *This,
-            UINT32 textPosition,
-            UINT32 textLength,
-            FLOAT originX,
-            FLOAT originY,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics,
-            UINT32 maxHitTestMetricsCount,
-            UINT32 *actualHitTestMetricsCount) PURE;
-}
-IDWriteTextLayoutVtbl;
-
-interface IDWriteTextLayout
-{
-    const IDWriteTextLayoutVtbl *lpVtbl;
-};
-
-#ifdef COBJMACROS
-/* Wrappers for IUnknown members. */
-#define IDWriteTextLayout_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->Base.QueryInterface((IDWriteTextFormat *)(This),riid,ppvObject)
-#define IDWriteTextLayout_AddRef(This) (This)->lpVtbl->Base.AddRef((IDWriteTextFormat *)(This))
-#define IDWriteTextLayout_Release(This) (This)->lpVtbl->Base.Release((IDWriteTextFormat *)(This))
-/* Wrappers for IDWriteTextFormat members. */
-#define IDWriteTextLayout_GetFlowDirection(This) (This)->lpVtbl->Base.GetFlowDirection(This)
-/* Use IDWriteTextFormat_GetFontXXXX macros instead of the following ones.  The
- * latters are for the IDWriteTextLayout's overloaded member function.
-#define IDWriteTextLayout_GetFontCollection(This,fontCollection) (This)->lpVtbl->Base.GetFontCollection(This,fontCollection)
-#define IDWriteTextLayout_GetFontFamilyName(This,fontFamilyName,nameSize) (This)->lpVtbl->Base.GetFontFamilyName(This,fontFamilyName,nameSize)
-#define IDWriteTextLayout_GetFontFamilyNameLength(This) (This)->lpVtbl->Base.GetFontFamilyNameLength(This)
-#define IDWriteTextLayout_GetFontSize(This) (This)->lpVtbl->Base.GetFontSize(This)
-#define IDWriteTextLayout_GetFontStretch(This) (This)->lpVtbl->Base.GetFontStretch(This)
-#define IDWriteTextLayout_GetFontStyle(This) (This)->lpVtbl->Base.GetFontStyle(This)
-#define IDWriteTextLayout_GetFontWeight(This) (This)->lpVtbl->GetFontWeight(This)
- */
-#define IDWriteTextLayout_GetIncrementalTabStop(This) (This)->lpVtbl->Base.GetIncrementalTabStop(This)
-#define IDWriteTextLayout_GetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline) (This)->lpVtbl->Base.GetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline)
-/* Use IDWriteTextFormat_GetLocaleNameXXXX macros instead.
-#define IDWriteTextLayout_GetLocaleName(This,localeName,nameSize) (This)->lpVtbl->Base.GetLocaleName(This,localeName,nameSize)
-#define IDWriteTextLayout_GetLocaleNameLength(This) (This)->lpVtbl->Base.GetLocaleNameLength(This)
- */
-#define IDWriteTextLayout_GetParagraphAlignment(This) (This)->lpVtbl->Base.GetParagraphAlignment(This)
-#define IDWriteTextLayout_GetReadingDirection(This) (This)->lpVtbl->Base.GetReadingDirection(This)
-#define IDWriteTextLayout_GetTextAlignment(This) (This)->lpVtbl->Base.GetTextAlignment(This)
-#define IDWriteTextLayout_GetTrimming(This,trimmingOptions,trimmingSign) (This)->lpVtbl->Base.GetTrimming(This,trimmingOptions,trimmingSign)
-#define IDWriteTextLayout_GetWordWrapping(This) (This)->lpVtbl->Base.GetWordWrapping(This)
-#define IDWriteTextLayout_SetFlowDirection(This,flowDirection) (This)->lpVtbl->Base.SetFlowDirection(This,flowDirection)
-#define IDWriteTextLayout_SetIncrementalTabStop(This,incrementalTabStop) (This)->lpVtbl->Base.SetIncrementalTabStop(This,incrementalTabStop)
-#define IDWriteTextLayout_SetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline) (This)->lpVtbl->Base.SetLineSpacing(This,lineSpacingMethod,lineSpacing,baseline)
-#define IDWriteTextLayout_SetParagraphAlignment(This,paragraphAlignment) (This)->lpVtbl->SetParagraphAlignment(This,paragraphAlignment)
-#define IDWriteTextLayout_SetReadingDirection(This,readingDirection) (This)->lpVtbl->Base.SetReadingDirection(This,readingDirection)
-#define IDWriteTextLayout_SetTextAlignment(This,textAlignment) (This)->lpVtbl->Base.SetTextAlignment(This,textAlignment)
-#define IDWriteTextLayout_SetTrimming(This,trimmingOptions,trimmingSign) (This)->lpVtbl->Base.SetTrimming(This,trimmingOptions,trimmingSign)
-#define IDWriteTextLayout_SetWordWrapping(This,wordWrapping) (This)->lpVtbl->Base.SetWordWrapping(This,wordWrapping)
-/* Wrappers for IDWriteTextLayout members. */
-#define IDWriteTextLayout_Draw(This,clientDrawingContext,renderer,originX,originY) (This)->lpVtbl->Draw(This,clientDrawingContext,renderer,originX,originY)
-#define IDWriteTextLayout_GetClusterMetrics(This,clusterMetrics,maxClusterCount,actualClusterCount) (This)->lpVtbl->GetClusterMetrics(This,clusterMetrics,maxClusterCount,actualClusterCount)
-#define IDWriteTextLayout_DetermineMinWidth(This,minWidth) (This)->lpVtbl->DetermineMinWidth(This,minWidth)
-#define IDWriteTextLayout_GetDrawingEffect(This,currentPosition,drawingEffect,textRange) (This)->lpVtbl->GetDrawingEffect(This,currentPosition,drawingEffect,textRange)
-#define IDWriteTextLayout_GetFontCollection(This,currentPosition,fontCollection,textRange) (This)->lpVtbl->GetFontCollection(This,currentPosition,fontCollection,textRange)
-#define IDWriteTextLayout_GetFontFamilyName(This,currentPosition,fontFamilyName,nameSize,textRange) (This)->lpVtbl->GetFontFamilyName(This,currentPosition,fontFamilyName,nameSize,textRange)
-#define IDWriteTextLayout_GetFontFamilyNameLength(This,currentPosition,nameLength,textRange) (This)->lpVtbl->GetFontFamilyNameLength(This,currentPosition,nameLength,textRange)
-#define IDWriteTextLayout_GetFontSize(This,currentPosition,fontSize,textRange) (This)->lpVtbl->GetFontSize(This,currentPosition,fontSize,textRange)
-#define IDWriteTextLayout_GetFontStretch(This,currentPosition,fontStretch,textRange) (This)->lpVtbl->GetFontStretch(This,currentPosition,fontStretch,textRange)
-#define IDWriteTextLayout_GetFontStyle(This,currentPosition,fontStyle,textRange) (This)->lpVtbl->GetFontStyle(This,currentPosition,fontStyle,textRange)
-#define IDWriteTextLayout_GetFontWeight(This,currentPosition,fontWeight,textRange) (This)->lpVtbl->GetFontWeight(This,currentPosition,fontWeight,textRange)
-#define IDWriteTextLayout_GetInlineObject(This,currentPosition,inlineObject,textRange) (This)->lpVtbl->GetInlineObject(This,currentPosition,inlineObject,textRange)
-#define IDWriteTextLayout_GetLineMetrics(This,lineMetrics,maxLineCount,actualLineCount) (This)->lpVtbl->GetLineMetrics(This,lineMetrics,maxLineCount,actualLineCount)
-#define IDWriteTextLayout_GetLocaleName(This,currentPosition,localeName,nameSize,textRange) (This)->lpVtbl->GetLocaleName(This,currentPosition,localeName,nameSize,textRange)
-#define IDWriteTextLayout_GetLocaleNameLength(This,currentPosition,nameLength,textRange) (This)->lpVtbl->GetLocaleNameLength(This,currentPosition,nameLength,textRange)
-#define IDWriteTextLayout_GetMaxHeight(This) (This)->lpVtbl->GetMaxHeight(This)
-#define IDWriteTextLayout_GetMaxWidth(This) (This)->lpVtbl->GetMaxWidth(This)
-#define IDWriteTextLayout_GetMetrics(This,textMetrics) (This)->lpVtbl->GetMetrics(This,textMetrics)
-#define IDWriteTextLayout_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
-#define IDWriteTextLayout_GetStrikethrough(This,currentPosition,hasStrikethrough,textRange) (This)->lpVtbl->GetStrikethrough(This,currentPosition,hasStrikethrough,textRange)
-#define IDWriteTextLayout_GetTypography(This,currentPosition,typography,textRange) (This)->lpVtbl->GetTypography(This,currentPosition,typography,textRange)
-#define IDWriteTextLayout_GetUnderline(This,currentPosition,hasUnderline,textRange) (This)->lpVtbl->GetUnderline(This,currentPosition,hasUnderline,textRange)
-#define IDWriteTextLayout_HitTestPoint(This,pointX,pointY,isTrailingHit,isInside,hitTestMetrics) (This)->lpVtbl->HitTestPoint(This,pointX,pointY,isTrailingHit,isInside,hitTestMetrics)
-#define IDWriteTextLayout_HitTestTextPosition(This,textPosition,isTrailingHit,pointX,pointY,hitTestMetrics) (This)->lpVtbl->HitTestTextPosition(This,textPosition,isTrailingHit,pointX,pointY,hitTestMetrics)
-#define IDWriteTextLayout_HitTestTextRange(This,textPosition,textLength,originX,originY,hitTestMetrics,maxHitTestMetricsCount,actualHitTestMetricsCount) (This)->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,hitTestMetrics,maxHitTestMetricsCount,actualHitTestMetricsCount)
-#define IDWriteTextLayout_SetDrawingEffect(This,drawingEffect,textRange) (This)->lpVtbl->SetDrawingEffect(This,drawingEffect,textRange)
-#define IDWriteTextLayout_SetFontCollection(This,fontCollection,textRange) (This)->lpVtbl->SetFontCollection(This,fontCollection,textRange)
-#define IDWriteTextLayout_SetFontFamilyName(This,fontFamilyName,textRange) (This)->lpVtbl->SetFontFamilyName(This,fontFamilyName,textRange)
-#define IDWriteTextLayout_SetFontSize(This,fontSize,textRange) (This)->lpVtbl->SetFontSize(This,fontSize,textRange)
-#define IDWriteTextLayout_SetFontStretch(This,fontStretch,textRange) (This)->lpVtbl->SetFontStretch(This,fontStretch,textRange)
-#define IDWriteTextLayout_SetFontStyle(This,fontStyle,textRange) (This)->lpVtbl->SetFontStyle(This,fontStyle,textRange)
-#define IDWriteTextLayout_SetFontWeight(This,fontWeight,textRange) (This)->lpVtbl->SetFontWeight(This,fontWeight,textRange)
-#define IDWriteTextLayout_SetInlineObject(This,inlineObject,textRange) (This)->lpVtbl->SetInlineObject(This,inlineObject,textRange)
-#define IDWriteTextLayout_SetLocaleName(This,localeName,textRange) (This)->lpVtbl->SetLocaleName(This,localeName,textRange)
-#define IDWriteTextLayout_SetMaxHeight(This,maxHeight) (This)->lpVtbl->SetMaxHeight(This,maxHeight)
-#define IDWriteTextLayout_SetMaxWidth(This,maxWidth) (This)->lpVtbl->SetMaxWidth(This,maxWidth)
-#define IDWriteTextLayout_SetStrikethrough(This,hasStrikethrough,textRange) (This)->lpVtbl->SetStrikethrough(This,hasStrikethrough,textRange)
-#define IDWriteTextLayout_SetTypography(This,typography,textRange) (This)->lpVtbl->SetTypography(This,typography,textRange)
-#define IDWriteTextLayout_SetUnderline(This,hasUnderline,textRange) (This)->lpVtbl->SetUnderline(This,hasUnderline,textRange)
-#endif /*COBJMACROS*/
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextRenderer
-DECLARE_INTERFACE_(IDWriteTextRenderer,IDWritePixelSnapping)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWritePixelSnapping methods */
-    STDMETHOD(IsPixelSnappingDisabled)(THIS_
-            void *clientDrawingContext,
-            WINBOOL *isDisabled) PURE;
-    STDMETHOD(GetCurrentTransform)(THIS_
-            void *clientDrawingContext,
-            DWRITE_MATRIX *transform) PURE;
-    STDMETHOD(GetPixelsPerDip)(THIS_
-            void *clientDrawingContext,
-            FLOAT *pixelsPerDip) PURE;
-#endif
-
-    /* IDWriteTextRenderer methods */
-    STDMETHOD(DrawGlyphRun)(THIS_
-            void *clientDrawingContext,
-            FLOAT baselineOriginX,
-            FLOAT baselineOriginY,
-            DWRITE_MEASURING_MODE measuringMode,
-            DWRITE_GLYPH_RUN const *glyphRun,
-            DWRITE_GLYPH_RUN_DESCRIPTION const *glyphRunDescription,
-            IUnknown* clientDrawingEffect) PURE;
-    STDMETHOD(DrawUnderline)(THIS_
-            void *clientDrawingContext,
-            FLOAT baselineOriginX,
-            FLOAT baselineOriginY,
-            DWRITE_UNDERLINE const *underline,
-            IUnknown *clientDrawingEffect) PURE;
-    STDMETHOD(DrawStrikethrough)(THIS_
-            void *clientDrawingContext,
-            FLOAT baselineOriginX,
-            FLOAT baselineOriginY,
-            DWRITE_STRIKETHROUGH const *strikethrough,
-            IUnknown* clientDrawingEffect) PURE;
-    STDMETHOD(DrawInlineObject)(
-            void *clientDrawingContext,
-            FLOAT originX,
-            FLOAT originY,
-            IDWriteInlineObject *inlineObject,
-            WINBOOL isSideways,
-            WINBOOL isRightToLeft,
-            IUnknown *clientDrawingEffect) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteTextRenderer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteTextRenderer_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteTextRenderer_GetCurrentTransform(This,clientDrawingContext,transform) (This)->lpVtbl->GetCurrentTransform(This,clientDrawingContext,transform)
-#define IDWriteTextRenderer_GetPixelsPerDip(This,clientDrawingContext,pixelsPerDip) (This)->lpVtbl->GetPixelsPerDip(This,clientDrawingContext,pixelsPerDip)
-#define IDWriteTextRenderer_IsPixelSnappingEnabled(This,clientDrawingContext,isDisabled) (This)->lpVtbl->IsPixelSnappingEnabled(This,clientDrawingContext,isDisabled)
-#define IDWriteTextRenderer_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteTextRenderer_DrawGlyphRun(This,clientDrawingContext,baselineOriginX,baselineOriginY,measuringMode,glyphRun,glyphRunDescription,clientDrawingEffect) (This)->lpVtbl->DrawGlyphRun(This,clientDrawingContext,baselineOriginX,baselineOriginY,measuringMode,glyphRun,glyphRunDescription,clientDrawingEffect)
-#define IDWriteTextRenderer_DrawInlineObject(This,clientDrawingContext,originX,originY,inlineObject,isSideways,isRightToLeft,clientDrawingEffect) (This)->lpVtbl->DrawInlineObject(This,clientDrawingContext,originX,originY,inlineObject,isSideways,isRightToLeft,clientDrawingEffect)
-#define IDWriteTextRenderer_DrawStrikethrough(This,clientDrawingContext,baselineOriginX,baselineOriginY,strikethrough,clientDrawingEffect) (This)->lpVtbl->DrawStrikethrough(This,clientDrawingContext,baselineOriginX,baselineOriginY,strikethrough,clientDrawingEffect)
-#define IDWriteTextRenderer_DrawUnderline(This,clientDrawingContext,baselineOriginX,baselineOriginY,underline,clientDrawingEffect) (This)->lpVtbl->DrawUnderline(This,clientDrawingContext,baselineOriginX,baselineOriginY,underline,clientDrawingEffect)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTypography
-DECLARE_INTERFACE_(IDWriteTypography,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    /* IDWriteTypography methods */
-    STDMETHOD(AddFontFeature)(THIS_ DWRITE_FONT_FEATURE fontFeature) PURE;
-    STDMETHOD_(UINT32,GetFontFeatureCount)(THIS) PURE;
-    STDMETHOD(GetFontFeature)(THIS_ UINT32 fontFeatureIndex, DWRITE_FONT_FEATURE *fontFeature) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDWriteTypography_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDWriteTypography_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDWriteTypography_Release(This) (This)->lpVtbl->Release(This)
-#define IDWriteTypography_AddFontFeature(This,fontFeature) (This)->lpVtbl->AddFontFeature(This,fontFeature)
-#define IDWriteTypography_GetFontFeatureCount() (This)->lpVtbl->GetFontFeatureCount(This)
-#define IDWriteTypography_GetFontFeature(This,fontFeatureIndex,fontFeature) (This)->lpVtbl->GetFontFeature(This,fontFeatureIndex,fontFeature)
-#endif /*COBJMACROS*/
+#include <unknwn.h>
+#include <dcommon.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-DWRITEAPI HRESULT WINAPI DWriteCreateFactory(
-  DWRITE_FACTORY_TYPE factoryType,
-  REFIID iid,
-  IUnknown **factory
-);
+#ifndef __IDWriteFactory_FWD_DEFINED__
+#define __IDWriteFactory_FWD_DEFINED__
+typedef interface IDWriteFactory IDWriteFactory;
+#ifdef __cplusplus
+interface IDWriteFactory;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontCollection_FWD_DEFINED__
+#define __IDWriteFontCollection_FWD_DEFINED__
+typedef interface IDWriteFontCollection IDWriteFontCollection;
+#ifdef __cplusplus
+interface IDWriteFontCollection;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFamily_FWD_DEFINED__
+#define __IDWriteFontFamily_FWD_DEFINED__
+typedef interface IDWriteFontFamily IDWriteFontFamily;
+#ifdef __cplusplus
+interface IDWriteFontFamily;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace_FWD_DEFINED__
+#define __IDWriteFontFace_FWD_DEFINED__
+typedef interface IDWriteFontFace IDWriteFontFace;
+#ifdef __cplusplus
+interface IDWriteFontFace;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteInlineObject_FWD_DEFINED__
+#define __IDWriteInlineObject_FWD_DEFINED__
+typedef interface IDWriteInlineObject IDWriteInlineObject;
+#ifdef __cplusplus
+interface IDWriteInlineObject;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __ID2D1SimplifiedGeometrySink_FWD_DEFINED__
+#define __ID2D1SimplifiedGeometrySink_FWD_DEFINED__
+typedef interface ID2D1SimplifiedGeometrySink ID2D1SimplifiedGeometrySink;
+#ifdef __cplusplus
+interface ID2D1SimplifiedGeometrySink;
+#endif /* __cplusplus */
+#endif
+
+typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
+#ifndef _WINDEF_
+typedef void *HMONITOR;
+#endif /* _WINDEF_ */
+#ifdef WINE_NO_UNICODE_MACROS
+#undef GetGlyphIndices
+#endif
+typedef enum DWRITE_FACTORY_TYPE {
+    DWRITE_FACTORY_TYPE_SHARED = 0,
+    DWRITE_FACTORY_TYPE_ISOLATED = 1
+} DWRITE_FACTORY_TYPE;
+typedef enum DWRITE_FONT_FILE_TYPE {
+    DWRITE_FONT_FILE_TYPE_UNKNOWN = 0,
+    DWRITE_FONT_FILE_TYPE_CFF = 1,
+    DWRITE_FONT_FILE_TYPE_TRUETYPE = 2,
+    DWRITE_FONT_FILE_TYPE_OPENTYPE_COLLECTION = 3,
+    DWRITE_FONT_FILE_TYPE_TYPE1_PFM = 4,
+    DWRITE_FONT_FILE_TYPE_TYPE1_PFB = 5,
+    DWRITE_FONT_FILE_TYPE_VECTOR = 6,
+    DWRITE_FONT_FILE_TYPE_BITMAP = 7,
+    DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION = DWRITE_FONT_FILE_TYPE_OPENTYPE_COLLECTION
+} DWRITE_FONT_FILE_TYPE;
+typedef enum DWRITE_FONT_FACE_TYPE {
+    DWRITE_FONT_FACE_TYPE_CFF = 0,
+    DWRITE_FONT_FACE_TYPE_TRUETYPE = 1,
+    DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION = 2,
+    DWRITE_FONT_FACE_TYPE_TYPE1 = 3,
+    DWRITE_FONT_FACE_TYPE_VECTOR = 4,
+    DWRITE_FONT_FACE_TYPE_BITMAP = 5,
+    DWRITE_FONT_FACE_TYPE_UNKNOWN = 6,
+    DWRITE_FONT_FACE_TYPE_RAW_CFF = 7,
+    DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION = DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION
+} DWRITE_FONT_FACE_TYPE;
+typedef enum DWRITE_FONT_WEIGHT {
+    DWRITE_FONT_WEIGHT_THIN = 100,
+    DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
+    DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
+    DWRITE_FONT_WEIGHT_LIGHT = 300,
+    DWRITE_FONT_WEIGHT_SEMI_LIGHT = 350,
+    DWRITE_FONT_WEIGHT_NORMAL = 400,
+    DWRITE_FONT_WEIGHT_REGULAR = 400,
+    DWRITE_FONT_WEIGHT_MEDIUM = 500,
+    DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
+    DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
+    DWRITE_FONT_WEIGHT_BOLD = 700,
+    DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
+    DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
+    DWRITE_FONT_WEIGHT_BLACK = 900,
+    DWRITE_FONT_WEIGHT_HEAVY = 900,
+    DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
+    DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
+} DWRITE_FONT_WEIGHT;
+typedef enum DWRITE_FONT_STRETCH {
+    DWRITE_FONT_STRETCH_UNDEFINED = 0,
+    DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
+    DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
+    DWRITE_FONT_STRETCH_CONDENSED = 3,
+    DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
+    DWRITE_FONT_STRETCH_NORMAL = 5,
+    DWRITE_FONT_STRETCH_MEDIUM = 5,
+    DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
+    DWRITE_FONT_STRETCH_EXPANDED = 7,
+    DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
+    DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
+} DWRITE_FONT_STRETCH;
+typedef enum DWRITE_FONT_STYLE {
+    DWRITE_FONT_STYLE_NORMAL = 0,
+    DWRITE_FONT_STYLE_OBLIQUE = 1,
+    DWRITE_FONT_STYLE_ITALIC = 2
+} DWRITE_FONT_STYLE;
+typedef enum DWRITE_INFORMATIONAL_STRING_ID {
+    DWRITE_INFORMATIONAL_STRING_NONE = 0,
+    DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE = 1,
+    DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS = 2,
+    DWRITE_INFORMATIONAL_STRING_TRADEMARK = 3,
+    DWRITE_INFORMATIONAL_STRING_MANUFACTURER = 4,
+    DWRITE_INFORMATIONAL_STRING_DESIGNER = 5,
+    DWRITE_INFORMATIONAL_STRING_DESIGNER_URL = 6,
+    DWRITE_INFORMATIONAL_STRING_DESCRIPTION = 7,
+    DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL = 8,
+    DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION = 9,
+    DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL = 10,
+    DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES = 11,
+    DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES = 12,
+    DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_FAMILY_NAMES = 13,
+    DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_SUBFAMILY_NAMES = 14,
+    DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT = 15,
+    DWRITE_INFORMATIONAL_STRING_FULL_NAME = 16,
+    DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME = 17,
+    DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME = 18,
+    DWRITE_INFORMATIONAL_STRING_WEIGHT_STRETCH_STYLE_FAMILY_NAME = 19,
+    DWRITE_INFORMATIONAL_STRING_DESIGN_SCRIPT_LANGUAGE_TAG = 20,
+    DWRITE_INFORMATIONAL_STRING_SUPPORTED_SCRIPT_LANGUAGE_TAG = 21,
+    DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES = DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_FAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES = DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_SUBFAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_WWS_FAMILY_NAME = DWRITE_INFORMATIONAL_STRING_WEIGHT_STRETCH_STYLE_FAMILY_NAME
+} DWRITE_INFORMATIONAL_STRING_ID;
+typedef enum DWRITE_FONT_SIMULATIONS {
+    DWRITE_FONT_SIMULATIONS_NONE = 0,
+    DWRITE_FONT_SIMULATIONS_BOLD = 1,
+    DWRITE_FONT_SIMULATIONS_OBLIQUE = 2
+} DWRITE_FONT_SIMULATIONS;
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
+#endif
+typedef enum DWRITE_PIXEL_GEOMETRY {
+    DWRITE_PIXEL_GEOMETRY_FLAT = 0,
+    DWRITE_PIXEL_GEOMETRY_RGB = 1,
+    DWRITE_PIXEL_GEOMETRY_BGR = 2
+} DWRITE_PIXEL_GEOMETRY;
+typedef enum DWRITE_RENDERING_MODE {
+    DWRITE_RENDERING_MODE_DEFAULT = 0,
+    DWRITE_RENDERING_MODE_ALIASED = 1,
+    DWRITE_RENDERING_MODE_GDI_CLASSIC = 2,
+    DWRITE_RENDERING_MODE_GDI_NATURAL = 3,
+    DWRITE_RENDERING_MODE_NATURAL = 4,
+    DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC = 5,
+    DWRITE_RENDERING_MODE_OUTLINE = 6,
+    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC = DWRITE_RENDERING_MODE_GDI_CLASSIC,
+    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL = DWRITE_RENDERING_MODE_GDI_NATURAL,
+    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL = DWRITE_RENDERING_MODE_NATURAL,
+    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC
+} DWRITE_RENDERING_MODE;
+typedef enum DWRITE_TEXT_ALIGNMENT {
+    DWRITE_TEXT_ALIGNMENT_LEADING = 0,
+    DWRITE_TEXT_ALIGNMENT_TRAILING = 1,
+    DWRITE_TEXT_ALIGNMENT_CENTER = 2,
+    DWRITE_TEXT_ALIGNMENT_JUSTIFIED = 3
+} DWRITE_TEXT_ALIGNMENT;
+typedef enum DWRITE_PARAGRAPH_ALIGNMENT {
+    DWRITE_PARAGRAPH_ALIGNMENT_NEAR = 0,
+    DWRITE_PARAGRAPH_ALIGNMENT_FAR = 1,
+    DWRITE_PARAGRAPH_ALIGNMENT_CENTER = 2
+} DWRITE_PARAGRAPH_ALIGNMENT;
+typedef enum DWRITE_WORD_WRAPPING {
+    DWRITE_WORD_WRAPPING_WRAP = 0,
+    DWRITE_WORD_WRAPPING_NO_WRAP = 1,
+    DWRITE_WORD_WRAPPING_EMERGENCY_BREAK = 2,
+    DWRITE_WORD_WRAPPING_WHOLE_WORD = 3,
+    DWRITE_WORD_WRAPPING_CHARACTER = 4
+} DWRITE_WORD_WRAPPING;
+typedef enum DWRITE_READING_DIRECTION {
+    DWRITE_READING_DIRECTION_LEFT_TO_RIGHT = 0,
+    DWRITE_READING_DIRECTION_RIGHT_TO_LEFT = 1,
+    DWRITE_READING_DIRECTION_TOP_TO_BOTTOM = 2,
+    DWRITE_READING_DIRECTION_BOTTOM_TO_TOP = 3
+} DWRITE_READING_DIRECTION;
+typedef enum DWRITE_FLOW_DIRECTION {
+    DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM = 0,
+    DWRITE_FLOW_DIRECTION_BOTTOM_TO_TOP = 1,
+    DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT = 2,
+    DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT = 3
+} DWRITE_FLOW_DIRECTION;
+typedef enum DWRITE_TRIMMING_GRANULARITY {
+    DWRITE_TRIMMING_GRANULARITY_NONE = 0,
+    DWRITE_TRIMMING_GRANULARITY_CHARACTER = 1,
+    DWRITE_TRIMMING_GRANULARITY_WORD = 2
+} DWRITE_TRIMMING_GRANULARITY;
+typedef enum DWRITE_BREAK_CONDITION {
+    DWRITE_BREAK_CONDITION_NEUTRAL = 0,
+    DWRITE_BREAK_CONDITION_CAN_BREAK = 1,
+    DWRITE_BREAK_CONDITION_MAY_NOT_BREAK = 2,
+    DWRITE_BREAK_CONDITION_MUST_BREAK = 3
+} DWRITE_BREAK_CONDITION;
+typedef enum DWRITE_LINE_SPACING_METHOD {
+    DWRITE_LINE_SPACING_METHOD_DEFAULT = 0,
+    DWRITE_LINE_SPACING_METHOD_UNIFORM = 1,
+    DWRITE_LINE_SPACING_METHOD_PROPORTIONAL = 2
+} DWRITE_LINE_SPACING_METHOD;
+#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
+    ((UINT32)(UINT8)(d) << 24) | \
+    ((UINT32)(UINT8)(c) << 16) | \
+    ((UINT32)(UINT8)(b) <<  8) | \
+     (UINT32)(UINT8)(a))
+typedef enum DWRITE_FONT_FEATURE_TAG {
+    DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661,
+    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263,
+    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263,
+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163,
+    DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163,
+    DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363,
+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63,
+    DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063,
+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363,
+    DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563,
+    DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664,
+    DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64,
+    DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865,
+    DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266,
+    DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766,
+    DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168,
+    DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168,
+    DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168,
+    DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968,
+    DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68,
+    DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68,
+    DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768,
+    DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68,
+    DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a,
+    DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a,
+    DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a,
+    DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a,
+    DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b,
+    DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c,
+    DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c,
+    DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c,
+    DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d,
+    DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d,
+    DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d,
+    DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e,
+    DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e,
+    DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f,
+    DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f,
+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170,
+    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370,
+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70,
+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770,
+    DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771,
+    DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72,
+    DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173,
+    DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973,
+    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73,
+    DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373,
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373,
+    DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573,
+    DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573,
+    DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773,
+    DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974,
+    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74,
+    DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74,
+    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274,
+    DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774,
+    DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75,
+    DWRITE_FONT_FEATURE_TAG_VERTICAL_WRITING = 0x74726576,
+    DWRITE_FONT_FEATURE_TAG_VERTICAL_ALTERNATES_AND_ROTATION = 0x32747276,
+    DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a
+} DWRITE_FONT_FEATURE_TAG;
+typedef enum DWRITE_SCRIPT_SHAPES {
+    DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
+    DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
+} DWRITE_SCRIPT_SHAPES;
+typedef enum DWRITE_NUMBER_SUBSTITUTION_METHOD {
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE = 0,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL = 1,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE = 2,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL = 3,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL = 4
+} DWRITE_NUMBER_SUBSTITUTION_METHOD;
+#define DWRITE_ALPHA_MAX 255
+typedef enum DWRITE_TEXTURE_TYPE {
+    DWRITE_TEXTURE_ALIASED_1x1 = 0,
+    DWRITE_TEXTURE_CLEARTYPE_3x1 = 1
+} DWRITE_TEXTURE_TYPE;
+typedef struct DWRITE_FONT_METRICS {
+    UINT16 designUnitsPerEm;
+    UINT16 ascent;
+    UINT16 descent;
+    INT16 lineGap;
+    UINT16 capHeight;
+    UINT16 xHeight;
+    INT16 underlinePosition;
+    UINT16 underlineThickness;
+    INT16 strikethroughPosition;
+    UINT16 strikethroughThickness;
+} DWRITE_FONT_METRICS;
+typedef struct DWRITE_GLYPH_METRICS {
+    INT32 leftSideBearing;
+    UINT32 advanceWidth;
+    INT32 rightSideBearing;
+    INT32 topSideBearing;
+    UINT32 advanceHeight;
+    INT32 bottomSideBearing;
+    INT32 verticalOriginY;
+} DWRITE_GLYPH_METRICS;
+typedef struct DWRITE_GLYPH_OFFSET {
+    FLOAT advanceOffset;
+    FLOAT ascenderOffset;
+} DWRITE_GLYPH_OFFSET;
+typedef struct DWRITE_MATRIX {
+    FLOAT m11;
+    FLOAT m12;
+    FLOAT m21;
+    FLOAT m22;
+    FLOAT dx;
+    FLOAT dy;
+} DWRITE_MATRIX;
+typedef struct DWRITE_TRIMMING {
+    DWRITE_TRIMMING_GRANULARITY granularity;
+    UINT32 delimiter;
+    UINT32 delimiterCount;
+} DWRITE_TRIMMING;
+#ifndef __d2d1_h__
+typedef struct DWRITE_GLYPH_RUN DWRITE_GLYPH_RUN;
+#endif /* __d2d1_h__ */
+struct DWRITE_GLYPH_RUN {
+    IDWriteFontFace *fontFace;
+    FLOAT fontEmSize;
+    UINT32 glyphCount;
+    const UINT16 *glyphIndices;
+    const FLOAT *glyphAdvances;
+    const DWRITE_GLYPH_OFFSET *glyphOffsets;
+    WINBOOL isSideways;
+    UINT32 bidiLevel;
+};
+#ifndef __d2d1_1_h__
+typedef struct DWRITE_GLYPH_RUN_DESCRIPTION DWRITE_GLYPH_RUN_DESCRIPTION;
+#endif /* __d2d1_1_h__ */
+struct DWRITE_GLYPH_RUN_DESCRIPTION {
+    const WCHAR *localeName;
+    const WCHAR *string;
+    UINT32 stringLength;
+    const UINT16 *clusterMap;
+    UINT32 textPosition;
+};
+typedef struct DWRITE_UNDERLINE {
+    FLOAT width;
+    FLOAT thickness;
+    FLOAT offset;
+    FLOAT runHeight;
+    DWRITE_READING_DIRECTION readingDirection;
+    DWRITE_FLOW_DIRECTION flowDirection;
+    const WCHAR *localeName;
+    DWRITE_MEASURING_MODE measuringMode;
+} DWRITE_UNDERLINE;
+typedef struct DWRITE_STRIKETHROUGH {
+    FLOAT width;
+    FLOAT thickness;
+    FLOAT offset;
+    DWRITE_READING_DIRECTION readingDirection;
+    DWRITE_FLOW_DIRECTION flowDirection;
+    const WCHAR *localeName;
+    DWRITE_MEASURING_MODE measuringMode;
+} DWRITE_STRIKETHROUGH;
+typedef struct DWRITE_INLINE_OBJECT_METRICS {
+    FLOAT width;
+    FLOAT height;
+    FLOAT baseline;
+    WINBOOL supportsSideways;
+} DWRITE_INLINE_OBJECT_METRICS;
+typedef struct DWRITE_OVERHANG_METRICS {
+    FLOAT left;
+    FLOAT top;
+    FLOAT right;
+    FLOAT bottom;
+} DWRITE_OVERHANG_METRICS;
+typedef struct DWRITE_FONT_FEATURE {
+    DWRITE_FONT_FEATURE_TAG nameTag;
+    UINT32 parameter;
+} DWRITE_FONT_FEATURE;
+typedef struct DWRITE_TEXT_RANGE {
+    UINT32 startPosition;
+    UINT32 length;
+} DWRITE_TEXT_RANGE;
+typedef struct DWRITE_LINE_METRICS {
+    UINT32 length;
+    UINT32 trailingWhitespaceLength;
+    UINT32 newlineLength;
+    FLOAT height;
+    FLOAT baseline;
+    WINBOOL isTrimmed;
+} DWRITE_LINE_METRICS;
+typedef struct DWRITE_TEXT_METRICS {
+    FLOAT left;
+    FLOAT top;
+    FLOAT width;
+    FLOAT widthIncludingTrailingWhitespace;
+    FLOAT height;
+    FLOAT layoutWidth;
+    FLOAT layoutHeight;
+    UINT32 maxBidiReorderingDepth;
+    UINT32 lineCount;
+} DWRITE_TEXT_METRICS;
+typedef struct DWRITE_CLUSTER_METRICS {
+    FLOAT width;
+    UINT16 length;
+    UINT16 canWrapLineAfter : 1;
+    UINT16 isWhitespace : 1;
+    UINT16 isNewline : 1;
+    UINT16 isSoftHyphen : 1;
+    UINT16 isRightToLeft : 1;
+    UINT16 padding : 11;
+} DWRITE_CLUSTER_METRICS;
+typedef struct DWRITE_HIT_TEST_METRICS {
+    UINT32 textPosition;
+    UINT32 length;
+    FLOAT left;
+    FLOAT top;
+    FLOAT width;
+    FLOAT height;
+    UINT32 bidiLevel;
+    WINBOOL isText;
+    WINBOOL isTrimmed;
+} DWRITE_HIT_TEST_METRICS;
+typedef struct DWRITE_SCRIPT_ANALYSIS {
+    UINT16 script;
+    DWRITE_SCRIPT_SHAPES shapes;
+} DWRITE_SCRIPT_ANALYSIS;
+typedef struct DWRITE_LINE_BREAKPOINT {
+    UINT8 breakConditionBefore : 2;
+    UINT8 breakConditionAfter : 2;
+    UINT8 isWhitespace : 1;
+    UINT8 isSoftHyphen : 1;
+    UINT8 padding : 2;
+} DWRITE_LINE_BREAKPOINT;
+typedef struct DWRITE_TYPOGRAPHIC_FEATURES {
+    DWRITE_FONT_FEATURE *features;
+    UINT32 featureCount;
+} DWRITE_TYPOGRAPHIC_FEATURES;
+typedef struct DWRITE_SHAPING_TEXT_PROPERTIES {
+    UINT16 isShapedAlone : 1;
+    UINT16 reserved1 : 1;
+    UINT16 canBreakShapingAfter : 1;
+    UINT16 reserved : 13;
+} DWRITE_SHAPING_TEXT_PROPERTIES;
+typedef struct DWRITE_SHAPING_GLYPH_PROPERTIES {
+    UINT16 justification : 4;
+    UINT16 isClusterStart : 1;
+    UINT16 isDiacritic : 1;
+    UINT16 isZeroWidthSpace : 1;
+    UINT16 reserved : 9;
+} DWRITE_SHAPING_GLYPH_PROPERTIES;
+/*****************************************************************************
+ * IDWriteFontFileStream interface
+ */
+#ifndef __IDWriteFontFileStream_INTERFACE_DEFINED__
+#define __IDWriteFontFileStream_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFileStream, 0x6d4865fe, 0x0ab8, 0x4d91, 0x8f,0x62, 0x5d,0xd6,0xbe,0x34,0xa3,0xe0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0")
+IDWriteFontFileStream : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(
+        const void **fragment_start,
+        UINT64 offset,
+        UINT64 fragment_size,
+        void **fragment_context) = 0;
+
+    virtual void STDMETHODCALLTYPE ReleaseFileFragment(
+        void *fragment_context) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileSize(
+        UINT64 *size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(
+        UINT64 *last_writetime) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFileStream, 0x6d4865fe, 0x0ab8, 0x4d91, 0x8f,0x62, 0x5d,0xd6,0xbe,0x34,0xa3,0xe0)
+#endif
+#else
+typedef struct IDWriteFontFileStreamVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFileStream *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFileStream *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFileStream *This);
+
+    /*** IDWriteFontFileStream methods ***/
+    HRESULT (STDMETHODCALLTYPE *ReadFileFragment)(
+        IDWriteFontFileStream *This,
+        const void **fragment_start,
+        UINT64 offset,
+        UINT64 fragment_size,
+        void **fragment_context);
+
+    void (STDMETHODCALLTYPE *ReleaseFileFragment)(
+        IDWriteFontFileStream *This,
+        void *fragment_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileSize)(
+        IDWriteFontFileStream *This,
+        UINT64 *size);
+
+    HRESULT (STDMETHODCALLTYPE *GetLastWriteTime)(
+        IDWriteFontFileStream *This,
+        UINT64 *last_writetime);
+
+    END_INTERFACE
+} IDWriteFontFileStreamVtbl;
+
+interface IDWriteFontFileStream {
+    CONST_VTBL IDWriteFontFileStreamVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFileStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFileStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFileStream_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileStream methods ***/
+#define IDWriteFontFileStream_ReadFileFragment(This,fragment_start,offset,fragment_size,fragment_context) (This)->lpVtbl->ReadFileFragment(This,fragment_start,offset,fragment_size,fragment_context)
+#define IDWriteFontFileStream_ReleaseFileFragment(This,fragment_context) (This)->lpVtbl->ReleaseFileFragment(This,fragment_context)
+#define IDWriteFontFileStream_GetFileSize(This,size) (This)->lpVtbl->GetFileSize(This,size)
+#define IDWriteFontFileStream_GetLastWriteTime(This,last_writetime) (This)->lpVtbl->GetLastWriteTime(This,last_writetime)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFileStream_QueryInterface(IDWriteFontFileStream* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFileStream_AddRef(IDWriteFontFileStream* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFileStream_Release(IDWriteFontFileStream* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileStream methods ***/
+static FORCEINLINE HRESULT IDWriteFontFileStream_ReadFileFragment(IDWriteFontFileStream* This,const void **fragment_start,UINT64 offset,UINT64 fragment_size,void **fragment_context) {
+    return This->lpVtbl->ReadFileFragment(This,fragment_start,offset,fragment_size,fragment_context);
+}
+static FORCEINLINE void IDWriteFontFileStream_ReleaseFileFragment(IDWriteFontFileStream* This,void *fragment_context) {
+    This->lpVtbl->ReleaseFileFragment(This,fragment_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFileStream_GetFileSize(IDWriteFontFileStream* This,UINT64 *size) {
+    return This->lpVtbl->GetFileSize(This,size);
+}
+static FORCEINLINE HRESULT IDWriteFontFileStream_GetLastWriteTime(IDWriteFontFileStream* This,UINT64 *last_writetime) {
+    return This->lpVtbl->GetLastWriteTime(This,last_writetime);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFileStream_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFileLoader interface
+ */
+#ifndef __IDWriteFontFileLoader_INTERFACE_DEFINED__
+#define __IDWriteFontFileLoader_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFileLoader, 0x727cad4e, 0xd6af, 0x4c9e, 0x8a,0x08, 0xd6,0x95,0xb1,0x1c,0xaa,0x49);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49")
+IDWriteFontFileLoader : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileStream **stream) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFileLoader, 0x727cad4e, 0xd6af, 0x4c9e, 0x8a,0x08, 0xd6,0x95,0xb1,0x1c,0xaa,0x49)
+#endif
+#else
+typedef struct IDWriteFontFileLoaderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFileLoader *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFileLoader *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFileLoader *This);
+
+    /*** IDWriteFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateStreamFromKey)(
+        IDWriteFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileStream **stream);
+
+    END_INTERFACE
+} IDWriteFontFileLoaderVtbl;
+
+interface IDWriteFontFileLoader {
+    CONST_VTBL IDWriteFontFileLoaderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFileLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFileLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFileLoader_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileLoader methods ***/
+#define IDWriteFontFileLoader_CreateStreamFromKey(This,key,key_size,stream) (This)->lpVtbl->CreateStreamFromKey(This,key,key_size,stream)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFileLoader_QueryInterface(IDWriteFontFileLoader* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFileLoader_AddRef(IDWriteFontFileLoader* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFileLoader_Release(IDWriteFontFileLoader* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteFontFileLoader_CreateStreamFromKey(IDWriteFontFileLoader* This,const void *key,UINT32 key_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->CreateStreamFromKey(This,key,key_size,stream);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFileLoader_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteLocalFontFileLoader interface
+ */
+#ifndef __IDWriteLocalFontFileLoader_INTERFACE_DEFINED__
+#define __IDWriteLocalFontFileLoader_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteLocalFontFileLoader, 0xb2d9f3ec, 0xc9fe, 0x4a11, 0xa2,0xec, 0xd8,0x62,0x08,0xf7,0xc0,0xa2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2")
+IDWriteLocalFontFileLoader : public IDWriteFontFileLoader
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFilePathLengthFromKey(
+        const void *key,
+        UINT32 key_size,
+        UINT32 *length) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilePathFromKey(
+        const void *key,
+        UINT32 key_size,
+        WCHAR *path,
+        UINT32 length) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLastWriteTimeFromKey(
+        const void *key,
+        UINT32 key_size,
+        FILETIME *writetime) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteLocalFontFileLoader, 0xb2d9f3ec, 0xc9fe, 0x4a11, 0xa2,0xec, 0xd8,0x62,0x08,0xf7,0xc0,0xa2)
+#endif
+#else
+typedef struct IDWriteLocalFontFileLoaderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteLocalFontFileLoader *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteLocalFontFileLoader *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteLocalFontFileLoader *This);
+
+    /*** IDWriteFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateStreamFromKey)(
+        IDWriteLocalFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileStream **stream);
+
+    /*** IDWriteLocalFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFilePathLengthFromKey)(
+        IDWriteLocalFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        UINT32 *length);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilePathFromKey)(
+        IDWriteLocalFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        WCHAR *path,
+        UINT32 length);
+
+    HRESULT (STDMETHODCALLTYPE *GetLastWriteTimeFromKey)(
+        IDWriteLocalFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        FILETIME *writetime);
+
+    END_INTERFACE
+} IDWriteLocalFontFileLoaderVtbl;
+
+interface IDWriteLocalFontFileLoader {
+    CONST_VTBL IDWriteLocalFontFileLoaderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteLocalFontFileLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteLocalFontFileLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteLocalFontFileLoader_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileLoader methods ***/
+#define IDWriteLocalFontFileLoader_CreateStreamFromKey(This,key,key_size,stream) (This)->lpVtbl->CreateStreamFromKey(This,key,key_size,stream)
+/*** IDWriteLocalFontFileLoader methods ***/
+#define IDWriteLocalFontFileLoader_GetFilePathLengthFromKey(This,key,key_size,length) (This)->lpVtbl->GetFilePathLengthFromKey(This,key,key_size,length)
+#define IDWriteLocalFontFileLoader_GetFilePathFromKey(This,key,key_size,path,length) (This)->lpVtbl->GetFilePathFromKey(This,key,key_size,path,length)
+#define IDWriteLocalFontFileLoader_GetLastWriteTimeFromKey(This,key,key_size,writetime) (This)->lpVtbl->GetLastWriteTimeFromKey(This,key,key_size,writetime)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteLocalFontFileLoader_QueryInterface(IDWriteLocalFontFileLoader* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteLocalFontFileLoader_AddRef(IDWriteLocalFontFileLoader* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteLocalFontFileLoader_Release(IDWriteLocalFontFileLoader* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteLocalFontFileLoader_CreateStreamFromKey(IDWriteLocalFontFileLoader* This,const void *key,UINT32 key_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->CreateStreamFromKey(This,key,key_size,stream);
+}
+/*** IDWriteLocalFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteLocalFontFileLoader_GetFilePathLengthFromKey(IDWriteLocalFontFileLoader* This,const void *key,UINT32 key_size,UINT32 *length) {
+    return This->lpVtbl->GetFilePathLengthFromKey(This,key,key_size,length);
+}
+static FORCEINLINE HRESULT IDWriteLocalFontFileLoader_GetFilePathFromKey(IDWriteLocalFontFileLoader* This,const void *key,UINT32 key_size,WCHAR *path,UINT32 length) {
+    return This->lpVtbl->GetFilePathFromKey(This,key,key_size,path,length);
+}
+static FORCEINLINE HRESULT IDWriteLocalFontFileLoader_GetLastWriteTimeFromKey(IDWriteLocalFontFileLoader* This,const void *key,UINT32 key_size,FILETIME *writetime) {
+    return This->lpVtbl->GetLastWriteTimeFromKey(This,key,key_size,writetime);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteLocalFontFileLoader_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFile interface
+ */
+#ifndef __IDWriteFontFile_INTERFACE_DEFINED__
+#define __IDWriteFontFile_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFile, 0x739d886a, 0xcef5, 0x47dc, 0x87,0x69, 0x1a,0x8b,0x41,0xbe,0xbb,0xb0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0")
+IDWriteFontFile : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetReferenceKey(
+        const void **key,
+        UINT32 *key_size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLoader(
+        IDWriteFontFileLoader **loader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Analyze(
+        WINBOOL *is_supported_fonttype,
+        DWRITE_FONT_FILE_TYPE *file_type,
+        DWRITE_FONT_FACE_TYPE *face_type,
+        UINT32 *faces_num) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFile, 0x739d886a, 0xcef5, 0x47dc, 0x87,0x69, 0x1a,0x8b,0x41,0xbe,0xbb,0xb0)
+#endif
+#else
+typedef struct IDWriteFontFileVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFile *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFile *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFile *This);
+
+    /*** IDWriteFontFile methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetReferenceKey)(
+        IDWriteFontFile *This,
+        const void **key,
+        UINT32 *key_size);
+
+    HRESULT (STDMETHODCALLTYPE *GetLoader)(
+        IDWriteFontFile *This,
+        IDWriteFontFileLoader **loader);
+
+    HRESULT (STDMETHODCALLTYPE *Analyze)(
+        IDWriteFontFile *This,
+        WINBOOL *is_supported_fonttype,
+        DWRITE_FONT_FILE_TYPE *file_type,
+        DWRITE_FONT_FACE_TYPE *face_type,
+        UINT32 *faces_num);
+
+    END_INTERFACE
+} IDWriteFontFileVtbl;
+
+interface IDWriteFontFile {
+    CONST_VTBL IDWriteFontFileVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFile_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFile_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFile methods ***/
+#define IDWriteFontFile_GetReferenceKey(This,key,key_size) (This)->lpVtbl->GetReferenceKey(This,key,key_size)
+#define IDWriteFontFile_GetLoader(This,loader) (This)->lpVtbl->GetLoader(This,loader)
+#define IDWriteFontFile_Analyze(This,is_supported_fonttype,file_type,face_type,faces_num) (This)->lpVtbl->Analyze(This,is_supported_fonttype,file_type,face_type,faces_num)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFile_QueryInterface(IDWriteFontFile* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFile_AddRef(IDWriteFontFile* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFile_Release(IDWriteFontFile* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFile methods ***/
+static FORCEINLINE HRESULT IDWriteFontFile_GetReferenceKey(IDWriteFontFile* This,const void **key,UINT32 *key_size) {
+    return This->lpVtbl->GetReferenceKey(This,key,key_size);
+}
+static FORCEINLINE HRESULT IDWriteFontFile_GetLoader(IDWriteFontFile* This,IDWriteFontFileLoader **loader) {
+    return This->lpVtbl->GetLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFontFile_Analyze(IDWriteFontFile* This,WINBOOL *is_supported_fonttype,DWRITE_FONT_FILE_TYPE *file_type,DWRITE_FONT_FACE_TYPE *face_type,UINT32 *faces_num) {
+    return This->lpVtbl->Analyze(This,is_supported_fonttype,file_type,face_type,faces_num);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFile_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFileEnumerator interface
+ */
+#ifndef __IDWriteFontFileEnumerator_INTERFACE_DEFINED__
+#define __IDWriteFontFileEnumerator_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFileEnumerator, 0x72755049, 0x5ff7, 0x435d, 0x83,0x48, 0x4b,0xe9,0x7c,0xfa,0x6c,0x7c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c")
+IDWriteFontFileEnumerator : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE MoveNext(
+        WINBOOL *has_current_file) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentFontFile(
+        IDWriteFontFile **font_file) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFileEnumerator, 0x72755049, 0x5ff7, 0x435d, 0x83,0x48, 0x4b,0xe9,0x7c,0xfa,0x6c,0x7c)
+#endif
+#else
+typedef struct IDWriteFontFileEnumeratorVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFileEnumerator *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFileEnumerator *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFileEnumerator *This);
+
+    /*** IDWriteFontFileEnumerator methods ***/
+    HRESULT (STDMETHODCALLTYPE *MoveNext)(
+        IDWriteFontFileEnumerator *This,
+        WINBOOL *has_current_file);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentFontFile)(
+        IDWriteFontFileEnumerator *This,
+        IDWriteFontFile **font_file);
+
+    END_INTERFACE
+} IDWriteFontFileEnumeratorVtbl;
+
+interface IDWriteFontFileEnumerator {
+    CONST_VTBL IDWriteFontFileEnumeratorVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFileEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFileEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFileEnumerator_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileEnumerator methods ***/
+#define IDWriteFontFileEnumerator_MoveNext(This,has_current_file) (This)->lpVtbl->MoveNext(This,has_current_file)
+#define IDWriteFontFileEnumerator_GetCurrentFontFile(This,font_file) (This)->lpVtbl->GetCurrentFontFile(This,font_file)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFileEnumerator_QueryInterface(IDWriteFontFileEnumerator* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFileEnumerator_AddRef(IDWriteFontFileEnumerator* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFileEnumerator_Release(IDWriteFontFileEnumerator* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileEnumerator methods ***/
+static FORCEINLINE HRESULT IDWriteFontFileEnumerator_MoveNext(IDWriteFontFileEnumerator* This,WINBOOL *has_current_file) {
+    return This->lpVtbl->MoveNext(This,has_current_file);
+}
+static FORCEINLINE HRESULT IDWriteFontFileEnumerator_GetCurrentFontFile(IDWriteFontFileEnumerator* This,IDWriteFontFile **font_file) {
+    return This->lpVtbl->GetCurrentFontFile(This,font_file);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFileEnumerator_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontCollectionLoader interface
+ */
+#ifndef __IDWriteFontCollectionLoader_INTERFACE_DEFINED__
+#define __IDWriteFontCollectionLoader_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontCollectionLoader, 0xcca920e4, 0x52f0, 0x492b, 0xbf,0xa8, 0x29,0xc7,0x2e,0xe0,0xa4,0x68);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468")
+IDWriteFontCollectionLoader : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateEnumeratorFromKey(
+        IDWriteFactory *factory,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileEnumerator **enumerator) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontCollectionLoader, 0xcca920e4, 0x52f0, 0x492b, 0xbf,0xa8, 0x29,0xc7,0x2e,0xe0,0xa4,0x68)
+#endif
+#else
+typedef struct IDWriteFontCollectionLoaderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontCollectionLoader *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontCollectionLoader *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontCollectionLoader *This);
+
+    /*** IDWriteFontCollectionLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateEnumeratorFromKey)(
+        IDWriteFontCollectionLoader *This,
+        IDWriteFactory *factory,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileEnumerator **enumerator);
+
+    END_INTERFACE
+} IDWriteFontCollectionLoaderVtbl;
+
+interface IDWriteFontCollectionLoader {
+    CONST_VTBL IDWriteFontCollectionLoaderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontCollectionLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontCollectionLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontCollectionLoader_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontCollectionLoader methods ***/
+#define IDWriteFontCollectionLoader_CreateEnumeratorFromKey(This,factory,key,key_size,enumerator) (This)->lpVtbl->CreateEnumeratorFromKey(This,factory,key,key_size,enumerator)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollectionLoader_QueryInterface(IDWriteFontCollectionLoader* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontCollectionLoader_AddRef(IDWriteFontCollectionLoader* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontCollectionLoader_Release(IDWriteFontCollectionLoader* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontCollectionLoader methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollectionLoader_CreateEnumeratorFromKey(IDWriteFontCollectionLoader* This,IDWriteFactory *factory,const void *key,UINT32 key_size,IDWriteFontFileEnumerator **enumerator) {
+    return This->lpVtbl->CreateEnumeratorFromKey(This,factory,key,key_size,enumerator);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontCollectionLoader_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteLocalizedStrings interface
+ */
+#ifndef __IDWriteLocalizedStrings_INTERFACE_DEFINED__
+#define __IDWriteLocalizedStrings_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteLocalizedStrings, 0x08256209, 0x099a, 0x4b34, 0xb8,0x6d, 0xc2,0x2b,0x11,0x0e,0x77,0x71);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771")
+IDWriteLocalizedStrings : public IUnknown
+{
+    virtual UINT32 STDMETHODCALLTYPE GetCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindLocaleName(
+        const WCHAR *locale_name,
+        UINT32 *index,
+        WINBOOL *exists) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleNameLength(
+        UINT32 index,
+        UINT32 *length) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleName(
+        UINT32 index,
+        WCHAR *locale_name,
+        UINT32 size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStringLength(
+        UINT32 index,
+        UINT32 *length) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetString(
+        UINT32 index,
+        WCHAR *buffer,
+        UINT32 size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteLocalizedStrings, 0x08256209, 0x099a, 0x4b34, 0xb8,0x6d, 0xc2,0x2b,0x11,0x0e,0x77,0x71)
+#endif
+#else
+typedef struct IDWriteLocalizedStringsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteLocalizedStrings *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteLocalizedStrings *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteLocalizedStrings *This);
+
+    /*** IDWriteLocalizedStrings methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetCount)(
+        IDWriteLocalizedStrings *This);
+
+    HRESULT (STDMETHODCALLTYPE *FindLocaleName)(
+        IDWriteLocalizedStrings *This,
+        const WCHAR *locale_name,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteLocalizedStrings *This,
+        UINT32 index,
+        UINT32 *length);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteLocalizedStrings *This,
+        UINT32 index,
+        WCHAR *locale_name,
+        UINT32 size);
+
+    HRESULT (STDMETHODCALLTYPE *GetStringLength)(
+        IDWriteLocalizedStrings *This,
+        UINT32 index,
+        UINT32 *length);
+
+    HRESULT (STDMETHODCALLTYPE *GetString)(
+        IDWriteLocalizedStrings *This,
+        UINT32 index,
+        WCHAR *buffer,
+        UINT32 size);
+
+    END_INTERFACE
+} IDWriteLocalizedStringsVtbl;
+
+interface IDWriteLocalizedStrings {
+    CONST_VTBL IDWriteLocalizedStringsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteLocalizedStrings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteLocalizedStrings_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteLocalizedStrings_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteLocalizedStrings methods ***/
+#define IDWriteLocalizedStrings_GetCount(This) (This)->lpVtbl->GetCount(This)
+#define IDWriteLocalizedStrings_FindLocaleName(This,locale_name,index,exists) (This)->lpVtbl->FindLocaleName(This,locale_name,index,exists)
+#define IDWriteLocalizedStrings_GetLocaleNameLength(This,index,length) (This)->lpVtbl->GetLocaleNameLength(This,index,length)
+#define IDWriteLocalizedStrings_GetLocaleName(This,index,locale_name,size) (This)->lpVtbl->GetLocaleName(This,index,locale_name,size)
+#define IDWriteLocalizedStrings_GetStringLength(This,index,length) (This)->lpVtbl->GetStringLength(This,index,length)
+#define IDWriteLocalizedStrings_GetString(This,index,buffer,size) (This)->lpVtbl->GetString(This,index,buffer,size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteLocalizedStrings_QueryInterface(IDWriteLocalizedStrings* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteLocalizedStrings_AddRef(IDWriteLocalizedStrings* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteLocalizedStrings_Release(IDWriteLocalizedStrings* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteLocalizedStrings methods ***/
+static FORCEINLINE UINT32 IDWriteLocalizedStrings_GetCount(IDWriteLocalizedStrings* This) {
+    return This->lpVtbl->GetCount(This);
+}
+static FORCEINLINE HRESULT IDWriteLocalizedStrings_FindLocaleName(IDWriteLocalizedStrings* This,const WCHAR *locale_name,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindLocaleName(This,locale_name,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteLocalizedStrings_GetLocaleNameLength(IDWriteLocalizedStrings* This,UINT32 index,UINT32 *length) {
+    return This->lpVtbl->GetLocaleNameLength(This,index,length);
+}
+static FORCEINLINE HRESULT IDWriteLocalizedStrings_GetLocaleName(IDWriteLocalizedStrings* This,UINT32 index,WCHAR *locale_name,UINT32 size) {
+    return This->lpVtbl->GetLocaleName(This,index,locale_name,size);
+}
+static FORCEINLINE HRESULT IDWriteLocalizedStrings_GetStringLength(IDWriteLocalizedStrings* This,UINT32 index,UINT32 *length) {
+    return This->lpVtbl->GetStringLength(This,index,length);
+}
+static FORCEINLINE HRESULT IDWriteLocalizedStrings_GetString(IDWriteLocalizedStrings* This,UINT32 index,WCHAR *buffer,UINT32 size) {
+    return This->lpVtbl->GetString(This,index,buffer,size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteLocalizedStrings_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteRenderingParams interface
+ */
+#ifndef __IDWriteRenderingParams_INTERFACE_DEFINED__
+#define __IDWriteRenderingParams_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteRenderingParams, 0x2f0da53a, 0x2add, 0x47cd, 0x82,0xee, 0xd9,0xec,0x34,0x68,0x8e,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75")
+IDWriteRenderingParams : public IUnknown
+{
+    virtual FLOAT STDMETHODCALLTYPE GetGamma(
+        ) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetEnhancedContrast(
+        ) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetClearTypeLevel(
+        ) = 0;
+
+    virtual DWRITE_PIXEL_GEOMETRY STDMETHODCALLTYPE GetPixelGeometry(
+        ) = 0;
+
+    virtual DWRITE_RENDERING_MODE STDMETHODCALLTYPE GetRenderingMode(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteRenderingParams, 0x2f0da53a, 0x2add, 0x47cd, 0x82,0xee, 0xd9,0xec,0x34,0x68,0x8e,0x75)
+#endif
+#else
+typedef struct IDWriteRenderingParamsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteRenderingParams *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteRenderingParams *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteRenderingParams *This);
+
+    /*** IDWriteRenderingParams methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGamma)(
+        IDWriteRenderingParams *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetEnhancedContrast)(
+        IDWriteRenderingParams *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetClearTypeLevel)(
+        IDWriteRenderingParams *This);
+
+    DWRITE_PIXEL_GEOMETRY (STDMETHODCALLTYPE *GetPixelGeometry)(
+        IDWriteRenderingParams *This);
+
+    DWRITE_RENDERING_MODE (STDMETHODCALLTYPE *GetRenderingMode)(
+        IDWriteRenderingParams *This);
+
+    END_INTERFACE
+} IDWriteRenderingParamsVtbl;
+
+interface IDWriteRenderingParams {
+    CONST_VTBL IDWriteRenderingParamsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteRenderingParams_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteRenderingParams_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteRenderingParams_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteRenderingParams methods ***/
+#define IDWriteRenderingParams_GetGamma(This) (This)->lpVtbl->GetGamma(This)
+#define IDWriteRenderingParams_GetEnhancedContrast(This) (This)->lpVtbl->GetEnhancedContrast(This)
+#define IDWriteRenderingParams_GetClearTypeLevel(This) (This)->lpVtbl->GetClearTypeLevel(This)
+#define IDWriteRenderingParams_GetPixelGeometry(This) (This)->lpVtbl->GetPixelGeometry(This)
+#define IDWriteRenderingParams_GetRenderingMode(This) (This)->lpVtbl->GetRenderingMode(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteRenderingParams_QueryInterface(IDWriteRenderingParams* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams_AddRef(IDWriteRenderingParams* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams_Release(IDWriteRenderingParams* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteRenderingParams methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams_GetGamma(IDWriteRenderingParams* This) {
+    return This->lpVtbl->GetGamma(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams_GetEnhancedContrast(IDWriteRenderingParams* This) {
+    return This->lpVtbl->GetEnhancedContrast(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams_GetClearTypeLevel(IDWriteRenderingParams* This) {
+    return This->lpVtbl->GetClearTypeLevel(This);
+}
+static FORCEINLINE DWRITE_PIXEL_GEOMETRY IDWriteRenderingParams_GetPixelGeometry(IDWriteRenderingParams* This) {
+    return This->lpVtbl->GetPixelGeometry(This);
+}
+static FORCEINLINE DWRITE_RENDERING_MODE IDWriteRenderingParams_GetRenderingMode(IDWriteRenderingParams* This) {
+    return This->lpVtbl->GetRenderingMode(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteRenderingParams_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFace interface
+ */
+#ifndef __IDWriteFontFace_INTERFACE_DEFINED__
+#define __IDWriteFontFace_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFace, 0x5f49804d, 0x7024, 0x4d43, 0xbf,0xa9, 0xd2,0x59,0x84,0xf5,0x38,0x49);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849")
+IDWriteFontFace : public IUnknown
+{
+    virtual DWRITE_FONT_FACE_TYPE STDMETHODCALLTYPE GetType(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFiles(
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetIndex(
+        ) = 0;
+
+    virtual DWRITE_FONT_SIMULATIONS STDMETHODCALLTYPE GetSimulations(
+        ) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsSymbolFont(
+        ) = 0;
+
+    virtual void STDMETHODCALLTYPE GetMetrics(
+        DWRITE_FONT_METRICS *metrics) = 0;
+
+    virtual UINT16 STDMETHODCALLTYPE GetGlyphCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDesignGlyphMetrics(
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways = FALSE) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphIndices(
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE TryGetFontTable(
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists) = 0;
+
+    virtual void STDMETHODCALLTYPE ReleaseFontTable(
+        void *table_context) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphRunOutline(
+        FLOAT emSize,
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRecommendedRenderingMode(
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGdiCompatibleMetrics(
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGdiCompatibleGlyphMetrics(
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways = FALSE) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFace, 0x5f49804d, 0x7024, 0x4d43, 0xbf,0xa9, 0xd2,0x59,0x84,0xf5,0x38,0x49)
+#endif
+#else
+typedef struct IDWriteFontFaceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFace *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFace *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFace *This);
+
+    /*** IDWriteFontFace methods ***/
+    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
+        IDWriteFontFace *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiles)(
+        IDWriteFontFace *This,
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles);
+
+    UINT32 (STDMETHODCALLTYPE *GetIndex)(
+        IDWriteFontFace *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFace *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFontFace *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFontFace *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
+        IDWriteFontFace *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
+        IDWriteFontFace *This,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
+        IDWriteFontFace *This,
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
+        IDWriteFontFace *This,
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists);
+
+    void (STDMETHODCALLTYPE *ReleaseFontTable)(
+        IDWriteFontFace *This,
+        void *table_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
+        IDWriteFontFace *This,
+        FLOAT emSize,
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
+
+    HRESULT (STDMETHODCALLTYPE *GetRecommendedRenderingMode)(
+        IDWriteFontFace *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
+        IDWriteFontFace *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
+        IDWriteFontFace *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    END_INTERFACE
+} IDWriteFontFaceVtbl;
+
+interface IDWriteFontFace {
+    CONST_VTBL IDWriteFontFaceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFace_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFace_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFace methods ***/
+#define IDWriteFontFace_GetType(This) (This)->lpVtbl->GetType(This)
+#define IDWriteFontFace_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
+#define IDWriteFontFace_GetIndex(This) (This)->lpVtbl->GetIndex(This)
+#define IDWriteFontFace_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFace_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFontFace_GetMetrics(This,metrics) (This)->lpVtbl->GetMetrics(This,metrics)
+#define IDWriteFontFace_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
+#define IDWriteFontFace_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
+#define IDWriteFontFace_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
+#define IDWriteFontFace_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
+#define IDWriteFontFace_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
+#define IDWriteFontFace_GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink)
+#define IDWriteFontFace_GetRecommendedRenderingMode(This,emSize,pixels_per_dip,mode,params,rendering_mode) (This)->lpVtbl->GetRecommendedRenderingMode(This,emSize,pixels_per_dip,mode,params,rendering_mode)
+#define IDWriteFontFace_GetGdiCompatibleMetrics(This,emSize,pixels_per_dip,transform,metrics) (This)->lpVtbl->GetGdiCompatibleMetrics(This,emSize,pixels_per_dip,transform,metrics)
+#define IDWriteFontFace_GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace_QueryInterface(IDWriteFontFace* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFace_AddRef(IDWriteFontFace* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFace_Release(IDWriteFontFace* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFace methods ***/
+static FORCEINLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace_GetType(IDWriteFontFace* This) {
+    return This->lpVtbl->GetType(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetFiles(IDWriteFontFace* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
+    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
+}
+static FORCEINLINE UINT32 IDWriteFontFace_GetIndex(IDWriteFontFace* This) {
+    return This->lpVtbl->GetIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace_GetSimulations(IDWriteFontFace* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace_IsSymbolFont(IDWriteFontFace* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE void IDWriteFontFace_GetMetrics(IDWriteFontFace* This,DWRITE_FONT_METRICS *metrics) {
+    This->lpVtbl->GetMetrics(This,metrics);
+}
+static FORCEINLINE UINT16 IDWriteFontFace_GetGlyphCount(IDWriteFontFace* This) {
+    return This->lpVtbl->GetGlyphCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetDesignGlyphMetrics(IDWriteFontFace* This,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetGlyphIndices(IDWriteFontFace* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
+    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_TryGetFontTable(IDWriteFontFace* This,UINT32 table_tag,const void **table_data,UINT32 *table_size,void **context,WINBOOL *exists) {
+    return This->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists);
+}
+static FORCEINLINE void IDWriteFontFace_ReleaseFontTable(IDWriteFontFace* This,void *table_context) {
+    This->lpVtbl->ReleaseFontTable(This,table_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetGlyphRunOutline(IDWriteFontFace* This,FLOAT emSize,const UINT16 *glyph_indices,const FLOAT *glyph_advances,const DWRITE_GLYPH_OFFSET *glyph_offsets,UINT32 glyph_count,WINBOOL is_sideways,WINBOOL is_rtl,IDWriteGeometrySink *geometrysink) {
+    return This->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetRecommendedRenderingMode(IDWriteFontFace* This,FLOAT emSize,FLOAT pixels_per_dip,DWRITE_MEASURING_MODE mode,IDWriteRenderingParams *params,DWRITE_RENDERING_MODE *rendering_mode) {
+    return This->lpVtbl->GetRecommendedRenderingMode(This,emSize,pixels_per_dip,mode,params,rendering_mode);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetGdiCompatibleMetrics(IDWriteFontFace* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_FONT_METRICS *metrics) {
+    return This->lpVtbl->GetGdiCompatibleMetrics(This,emSize,pixels_per_dip,transform,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace_GetGdiCompatibleGlyphMetrics(IDWriteFontFace* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFace_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFont interface
+ */
+#ifndef __IDWriteFont_INTERFACE_DEFINED__
+#define __IDWriteFont_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFont, 0xacd16696, 0x8c14, 0x4f5d, 0x87,0x7e, 0xfe,0x3f,0xc1,0xd3,0x27,0x37);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737")
+IDWriteFont : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamily(
+        IDWriteFontFamily **family) = 0;
+
+    virtual DWRITE_FONT_WEIGHT STDMETHODCALLTYPE GetWeight(
+        ) = 0;
+
+    virtual DWRITE_FONT_STRETCH STDMETHODCALLTYPE GetStretch(
+        ) = 0;
+
+    virtual DWRITE_FONT_STYLE STDMETHODCALLTYPE GetStyle(
+        ) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsSymbolFont(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFaceNames(
+        IDWriteLocalizedStrings **names) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInformationalStrings(
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists) = 0;
+
+    virtual DWRITE_FONT_SIMULATIONS STDMETHODCALLTYPE GetSimulations(
+        ) = 0;
+
+    virtual void STDMETHODCALLTYPE GetMetrics(
+        DWRITE_FONT_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HasCharacter(
+        UINT32 value,
+        WINBOOL *exists) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        IDWriteFontFace **face) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFont, 0xacd16696, 0x8c14, 0x4f5d, 0x87,0x7e, 0xfe,0x3f,0xc1,0xd3,0x27,0x37)
+#endif
+#else
+typedef struct IDWriteFontVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFont *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFont *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFont *This);
+
+    /*** IDWriteFont methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFont *This,
+        IDWriteFontFamily **family);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFont *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFont *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFont *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFont *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFont *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFont *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFont *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFont *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFont *This,
+        UINT32 value,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFont *This,
+        IDWriteFontFace **face);
+
+    END_INTERFACE
+} IDWriteFontVtbl;
+
+interface IDWriteFont {
+    CONST_VTBL IDWriteFontVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFont_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFont_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFont_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFont methods ***/
+#define IDWriteFont_GetFontFamily(This,family) (This)->lpVtbl->GetFontFamily(This,family)
+#define IDWriteFont_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFont_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFont_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFont_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFont_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFont_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFont_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFont_GetMetrics(This,metrics) (This)->lpVtbl->GetMetrics(This,metrics)
+#define IDWriteFont_HasCharacter(This,value,exists) (This)->lpVtbl->HasCharacter(This,value,exists)
+#define IDWriteFont_CreateFontFace(This,face) (This)->lpVtbl->CreateFontFace(This,face)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFont_QueryInterface(IDWriteFont* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFont_AddRef(IDWriteFont* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFont_Release(IDWriteFont* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFont methods ***/
+static FORCEINLINE HRESULT IDWriteFont_GetFontFamily(IDWriteFont* This,IDWriteFontFamily **family) {
+    return This->lpVtbl->GetFontFamily(This,family);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFont_GetWeight(IDWriteFont* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFont_GetStretch(IDWriteFont* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFont_GetStyle(IDWriteFont* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE WINBOOL IDWriteFont_IsSymbolFont(IDWriteFont* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFont_GetFaceNames(IDWriteFont* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFont_GetInformationalStrings(IDWriteFont* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFont_GetSimulations(IDWriteFont* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE void IDWriteFont_GetMetrics(IDWriteFont* This,DWRITE_FONT_METRICS *metrics) {
+    This->lpVtbl->GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFont_HasCharacter(IDWriteFont* This,UINT32 value,WINBOOL *exists) {
+    return This->lpVtbl->HasCharacter(This,value,exists);
+}
+static FORCEINLINE HRESULT IDWriteFont_CreateFontFace(IDWriteFont* This,IDWriteFontFace **face) {
+    return This->lpVtbl->CreateFontFace(This,face);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFont_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontList interface
+ */
+#ifndef __IDWriteFontList_INTERFACE_DEFINED__
+#define __IDWriteFontList_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontList, 0x1a0d8438, 0x1d97, 0x4ec1, 0xae,0xf9, 0xa2,0xfb,0x86,0xed,0x6a,0xcb);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb")
+IDWriteFontList : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontCollection(
+        IDWriteFontCollection **collection) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFont(
+        UINT32 index,
+        IDWriteFont **font) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontList, 0x1a0d8438, 0x1d97, 0x4ec1, 0xae,0xf9, 0xa2,0xfb,0x86,0xed,0x6a,0xcb)
+#endif
+#else
+typedef struct IDWriteFontListVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontList *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontList *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontList *This);
+
+    /*** IDWriteFontList methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteFontList *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontList *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFont)(
+        IDWriteFontList *This,
+        UINT32 index,
+        IDWriteFont **font);
+
+    END_INTERFACE
+} IDWriteFontListVtbl;
+
+interface IDWriteFontList {
+    CONST_VTBL IDWriteFontListVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontList_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontList_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontList methods ***/
+#define IDWriteFontList_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteFontList_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+#define IDWriteFontList_GetFont(This,index,font) (This)->lpVtbl->GetFont(This,index,font)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontList_QueryInterface(IDWriteFontList* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontList_AddRef(IDWriteFontList* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontList_Release(IDWriteFontList* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontList methods ***/
+static FORCEINLINE HRESULT IDWriteFontList_GetFontCollection(IDWriteFontList* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteFontList_GetFontCount(IDWriteFontList* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontList_GetFont(IDWriteFontList* This,UINT32 index,IDWriteFont **font) {
+    return This->lpVtbl->GetFont(This,index,font);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontList_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFamily interface
+ */
+#ifndef __IDWriteFontFamily_INTERFACE_DEFINED__
+#define __IDWriteFontFamily_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFamily, 0xda20d8ef, 0x812a, 0x4c43, 0x98,0x02, 0x62,0xec,0x4a,0xbd,0x7a,0xdd);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add")
+IDWriteFontFamily : public IDWriteFontList
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFamilyNames(
+        IDWriteLocalizedStrings **names) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFirstMatchingFont(
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFont **font) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts(
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontList **fonts) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFamily, 0xda20d8ef, 0x812a, 0x4c43, 0x98,0x02, 0x62,0xec,0x4a,0xbd,0x7a,0xdd)
+#endif
+#else
+typedef struct IDWriteFontFamilyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFamily *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFamily *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFamily *This);
+
+    /*** IDWriteFontList methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteFontFamily *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontFamily *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFont)(
+        IDWriteFontFamily *This,
+        UINT32 index,
+        IDWriteFont **font);
+
+    /*** IDWriteFontFamily methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
+        IDWriteFontFamily *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetFirstMatchingFont)(
+        IDWriteFontFamily *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFont **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontFamily *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontList **fonts);
+
+    END_INTERFACE
+} IDWriteFontFamilyVtbl;
+
+interface IDWriteFontFamily {
+    CONST_VTBL IDWriteFontFamilyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFamily_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFamily_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFamily_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontList methods ***/
+#define IDWriteFontFamily_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteFontFamily_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+#define IDWriteFontFamily_GetFont(This,index,font) (This)->lpVtbl->GetFont(This,index,font)
+/*** IDWriteFontFamily methods ***/
+#define IDWriteFontFamily_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
+#define IDWriteFontFamily_GetFirstMatchingFont(This,weight,stretch,style,font) (This)->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,font)
+#define IDWriteFontFamily_GetMatchingFonts(This,weight,stretch,style,fonts) (This)->lpVtbl->GetMatchingFonts(This,weight,stretch,style,fonts)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily_QueryInterface(IDWriteFontFamily* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFamily_AddRef(IDWriteFontFamily* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFamily_Release(IDWriteFontFamily* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontList methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily_GetFontCollection(IDWriteFontFamily* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteFontFamily_GetFontCount(IDWriteFontFamily* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily_GetFont(IDWriteFontFamily* This,UINT32 index,IDWriteFont **font) {
+    return This->lpVtbl->GetFont(This,index,font);
+}
+/*** IDWriteFontFamily methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily_GetFamilyNames(IDWriteFontFamily* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFamilyNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily_GetFirstMatchingFont(IDWriteFontFamily* This,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFont **font) {
+    return This->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,font);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily_GetMatchingFonts(IDWriteFontFamily* This,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFontList **fonts) {
+    return This->lpVtbl->GetMatchingFonts(This,weight,stretch,style,fonts);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFamily_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontCollection interface
+ */
+#ifndef __IDWriteFontCollection_INTERFACE_DEFINED__
+#define __IDWriteFontCollection_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontCollection, 0xa84cee02, 0x3eea, 0x4eee, 0xa8,0x27, 0x87,0xc1,0xa0,0x2a,0x0f,0xcc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc")
+IDWriteFontCollection : public IUnknown
+{
+    virtual UINT32 STDMETHODCALLTYPE GetFontFamilyCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamily(
+        UINT32 index,
+        IDWriteFontFamily **family) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindFamilyName(
+        const WCHAR *name,
+        UINT32 *index,
+        WINBOOL *exists) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFromFontFace(
+        IDWriteFontFace *face,
+        IDWriteFont **font) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontCollection, 0xa84cee02, 0x3eea, 0x4eee, 0xa8,0x27, 0x87,0xc1,0xa0,0x2a,0x0f,0xcc)
+#endif
+#else
+typedef struct IDWriteFontCollectionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontCollection *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontCollection *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontCollection *This);
+
+    /*** IDWriteFontCollection methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyCount)(
+        IDWriteFontCollection *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFontCollection *This,
+        UINT32 index,
+        IDWriteFontFamily **family);
+
+    HRESULT (STDMETHODCALLTYPE *FindFamilyName)(
+        IDWriteFontCollection *This,
+        const WCHAR *name,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFromFontFace)(
+        IDWriteFontCollection *This,
+        IDWriteFontFace *face,
+        IDWriteFont **font);
+
+    END_INTERFACE
+} IDWriteFontCollectionVtbl;
+
+interface IDWriteFontCollection {
+    CONST_VTBL IDWriteFontCollectionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontCollection_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontCollection methods ***/
+#define IDWriteFontCollection_GetFontFamilyCount(This) (This)->lpVtbl->GetFontFamilyCount(This)
+#define IDWriteFontCollection_GetFontFamily(This,index,family) (This)->lpVtbl->GetFontFamily(This,index,family)
+#define IDWriteFontCollection_FindFamilyName(This,name,index,exists) (This)->lpVtbl->FindFamilyName(This,name,index,exists)
+#define IDWriteFontCollection_GetFontFromFontFace(This,face,font) (This)->lpVtbl->GetFontFromFontFace(This,face,font)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection_QueryInterface(IDWriteFontCollection* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontCollection_AddRef(IDWriteFontCollection* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontCollection_Release(IDWriteFontCollection* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontCollection methods ***/
+static FORCEINLINE UINT32 IDWriteFontCollection_GetFontFamilyCount(IDWriteFontCollection* This) {
+    return This->lpVtbl->GetFontFamilyCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection_GetFontFamily(IDWriteFontCollection* This,UINT32 index,IDWriteFontFamily **family) {
+    return This->lpVtbl->GetFontFamily(This,index,family);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection_FindFamilyName(IDWriteFontCollection* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFamilyName(This,name,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection_GetFontFromFontFace(IDWriteFontCollection* This,IDWriteFontFace *face,IDWriteFont **font) {
+    return This->lpVtbl->GetFontFromFontFace(This,face,font);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontCollection_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWritePixelSnapping interface
+ */
+#ifndef __IDWritePixelSnapping_INTERFACE_DEFINED__
+#define __IDWritePixelSnapping_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWritePixelSnapping, 0xeaf3a2da, 0xecf4, 0x4d24, 0xb6,0x44, 0xb3,0x4f,0x68,0x42,0x02,0x4b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b")
+IDWritePixelSnapping : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE IsPixelSnappingDisabled(
+        void *client_drawingcontext,
+        WINBOOL *disabled) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentTransform(
+        void *client_drawingcontext,
+        DWRITE_MATRIX *transform) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPixelsPerDip(
+        void *client_drawingcontext,
+        FLOAT *pixels_per_dip) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWritePixelSnapping, 0xeaf3a2da, 0xecf4, 0x4d24, 0xb6,0x44, 0xb3,0x4f,0x68,0x42,0x02,0x4b)
+#endif
+#else
+typedef struct IDWritePixelSnappingVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWritePixelSnapping *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWritePixelSnapping *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWritePixelSnapping *This);
+
+    /*** IDWritePixelSnapping methods ***/
+    HRESULT (STDMETHODCALLTYPE *IsPixelSnappingDisabled)(
+        IDWritePixelSnapping *This,
+        void *client_drawingcontext,
+        WINBOOL *disabled);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentTransform)(
+        IDWritePixelSnapping *This,
+        void *client_drawingcontext,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetPixelsPerDip)(
+        IDWritePixelSnapping *This,
+        void *client_drawingcontext,
+        FLOAT *pixels_per_dip);
+
+    END_INTERFACE
+} IDWritePixelSnappingVtbl;
+
+interface IDWritePixelSnapping {
+    CONST_VTBL IDWritePixelSnappingVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWritePixelSnapping_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWritePixelSnapping_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWritePixelSnapping_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWritePixelSnapping methods ***/
+#define IDWritePixelSnapping_IsPixelSnappingDisabled(This,client_drawingcontext,disabled) (This)->lpVtbl->IsPixelSnappingDisabled(This,client_drawingcontext,disabled)
+#define IDWritePixelSnapping_GetCurrentTransform(This,client_drawingcontext,transform) (This)->lpVtbl->GetCurrentTransform(This,client_drawingcontext,transform)
+#define IDWritePixelSnapping_GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip) (This)->lpVtbl->GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWritePixelSnapping_QueryInterface(IDWritePixelSnapping* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWritePixelSnapping_AddRef(IDWritePixelSnapping* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWritePixelSnapping_Release(IDWritePixelSnapping* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWritePixelSnapping methods ***/
+static FORCEINLINE HRESULT IDWritePixelSnapping_IsPixelSnappingDisabled(IDWritePixelSnapping* This,void *client_drawingcontext,WINBOOL *disabled) {
+    return This->lpVtbl->IsPixelSnappingDisabled(This,client_drawingcontext,disabled);
+}
+static FORCEINLINE HRESULT IDWritePixelSnapping_GetCurrentTransform(IDWritePixelSnapping* This,void *client_drawingcontext,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->GetCurrentTransform(This,client_drawingcontext,transform);
+}
+static FORCEINLINE HRESULT IDWritePixelSnapping_GetPixelsPerDip(IDWritePixelSnapping* This,void *client_drawingcontext,FLOAT *pixels_per_dip) {
+    return This->lpVtbl->GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWritePixelSnapping_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextRenderer interface
+ */
+#ifndef __IDWriteTextRenderer_INTERFACE_DEFINED__
+#define __IDWriteTextRenderer_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextRenderer, 0xef8a8135, 0x5cc6, 0x45fe, 0x88,0x25, 0xc5,0xa0,0x72,0x4e,0xb8,0x19);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819")
+IDWriteTextRenderer : public IDWritePixelSnapping
+{
+    virtual HRESULT STDMETHODCALLTYPE DrawGlyphRun(
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_descr,
+        IUnknown *drawing_effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DrawUnderline(
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        const DWRITE_UNDERLINE *underline,
+        IUnknown *drawing_effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DrawStrikethrough(
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        const DWRITE_STRIKETHROUGH *strikethrough,
+        IUnknown *drawing_effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DrawInlineObject(
+        void *client_drawingcontext,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteInlineObject *object,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *drawing_effect) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextRenderer, 0xef8a8135, 0x5cc6, 0x45fe, 0x88,0x25, 0xc5,0xa0,0x72,0x4e,0xb8,0x19)
+#endif
+#else
+typedef struct IDWriteTextRendererVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextRenderer *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextRenderer *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextRenderer *This);
+
+    /*** IDWritePixelSnapping methods ***/
+    HRESULT (STDMETHODCALLTYPE *IsPixelSnappingDisabled)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        WINBOOL *disabled);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentTransform)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetPixelsPerDip)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        FLOAT *pixels_per_dip);
+
+    /*** IDWriteTextRenderer methods ***/
+    HRESULT (STDMETHODCALLTYPE *DrawGlyphRun)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_descr,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *DrawUnderline)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        const DWRITE_UNDERLINE *underline,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *DrawStrikethrough)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        const DWRITE_STRIKETHROUGH *strikethrough,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *DrawInlineObject)(
+        IDWriteTextRenderer *This,
+        void *client_drawingcontext,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteInlineObject *object,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *drawing_effect);
+
+    END_INTERFACE
+} IDWriteTextRendererVtbl;
+
+interface IDWriteTextRenderer {
+    CONST_VTBL IDWriteTextRendererVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextRenderer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextRenderer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextRenderer_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWritePixelSnapping methods ***/
+#define IDWriteTextRenderer_IsPixelSnappingDisabled(This,client_drawingcontext,disabled) (This)->lpVtbl->IsPixelSnappingDisabled(This,client_drawingcontext,disabled)
+#define IDWriteTextRenderer_GetCurrentTransform(This,client_drawingcontext,transform) (This)->lpVtbl->GetCurrentTransform(This,client_drawingcontext,transform)
+#define IDWriteTextRenderer_GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip) (This)->lpVtbl->GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip)
+/*** IDWriteTextRenderer methods ***/
+#define IDWriteTextRenderer_DrawGlyphRun(This,client_drawingcontext,baselineOriginX,baselineOriginY,mode,glyph_run,run_descr,drawing_effect) (This)->lpVtbl->DrawGlyphRun(This,client_drawingcontext,baselineOriginX,baselineOriginY,mode,glyph_run,run_descr,drawing_effect)
+#define IDWriteTextRenderer_DrawUnderline(This,client_drawingcontext,baselineOriginX,baselineOriginY,underline,drawing_effect) (This)->lpVtbl->DrawUnderline(This,client_drawingcontext,baselineOriginX,baselineOriginY,underline,drawing_effect)
+#define IDWriteTextRenderer_DrawStrikethrough(This,client_drawingcontext,baselineOriginX,baselineOriginY,strikethrough,drawing_effect) (This)->lpVtbl->DrawStrikethrough(This,client_drawingcontext,baselineOriginX,baselineOriginY,strikethrough,drawing_effect)
+#define IDWriteTextRenderer_DrawInlineObject(This,client_drawingcontext,originX,originY,object,is_sideways,is_rtl,drawing_effect) (This)->lpVtbl->DrawInlineObject(This,client_drawingcontext,originX,originY,object,is_sideways,is_rtl,drawing_effect)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextRenderer_QueryInterface(IDWriteTextRenderer* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextRenderer_AddRef(IDWriteTextRenderer* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextRenderer_Release(IDWriteTextRenderer* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWritePixelSnapping methods ***/
+static FORCEINLINE HRESULT IDWriteTextRenderer_IsPixelSnappingDisabled(IDWriteTextRenderer* This,void *client_drawingcontext,WINBOOL *disabled) {
+    return This->lpVtbl->IsPixelSnappingDisabled(This,client_drawingcontext,disabled);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer_GetCurrentTransform(IDWriteTextRenderer* This,void *client_drawingcontext,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->GetCurrentTransform(This,client_drawingcontext,transform);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer_GetPixelsPerDip(IDWriteTextRenderer* This,void *client_drawingcontext,FLOAT *pixels_per_dip) {
+    return This->lpVtbl->GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip);
+}
+/*** IDWriteTextRenderer methods ***/
+static FORCEINLINE HRESULT IDWriteTextRenderer_DrawGlyphRun(IDWriteTextRenderer* This,void *client_drawingcontext,FLOAT baselineOriginX,FLOAT baselineOriginY,DWRITE_MEASURING_MODE mode,const DWRITE_GLYPH_RUN *glyph_run,const DWRITE_GLYPH_RUN_DESCRIPTION *run_descr,IUnknown *drawing_effect) {
+    return This->lpVtbl->DrawGlyphRun(This,client_drawingcontext,baselineOriginX,baselineOriginY,mode,glyph_run,run_descr,drawing_effect);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer_DrawUnderline(IDWriteTextRenderer* This,void *client_drawingcontext,FLOAT baselineOriginX,FLOAT baselineOriginY,const DWRITE_UNDERLINE *underline,IUnknown *drawing_effect) {
+    return This->lpVtbl->DrawUnderline(This,client_drawingcontext,baselineOriginX,baselineOriginY,underline,drawing_effect);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer_DrawStrikethrough(IDWriteTextRenderer* This,void *client_drawingcontext,FLOAT baselineOriginX,FLOAT baselineOriginY,const DWRITE_STRIKETHROUGH *strikethrough,IUnknown *drawing_effect) {
+    return This->lpVtbl->DrawStrikethrough(This,client_drawingcontext,baselineOriginX,baselineOriginY,strikethrough,drawing_effect);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer_DrawInlineObject(IDWriteTextRenderer* This,void *client_drawingcontext,FLOAT originX,FLOAT originY,IDWriteInlineObject *object,WINBOOL is_sideways,WINBOOL is_rtl,IUnknown *drawing_effect) {
+    return This->lpVtbl->DrawInlineObject(This,client_drawingcontext,originX,originY,object,is_sideways,is_rtl,drawing_effect);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextRenderer_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteInlineObject interface
+ */
+#ifndef __IDWriteInlineObject_INTERFACE_DEFINED__
+#define __IDWriteInlineObject_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteInlineObject, 0x8339fde3, 0x106f, 0x47ab, 0x83,0x73, 0x1c,0x62,0x95,0xeb,0x10,0xb3);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8339fde3-106f-47ab-8373-1c6295eb10b3")
+IDWriteInlineObject : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Draw(
+        void *client_drawingontext,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *drawing_effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMetrics(
+        DWRITE_INLINE_OBJECT_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOverhangMetrics(
+        DWRITE_OVERHANG_METRICS *overhangs) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetBreakConditions(
+        DWRITE_BREAK_CONDITION *condition_before,
+        DWRITE_BREAK_CONDITION *condition_after) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteInlineObject, 0x8339fde3, 0x106f, 0x47ab, 0x83,0x73, 0x1c,0x62,0x95,0xeb,0x10,0xb3)
+#endif
+#else
+typedef struct IDWriteInlineObjectVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteInlineObject *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteInlineObject *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteInlineObject *This);
+
+    /*** IDWriteInlineObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *Draw)(
+        IDWriteInlineObject *This,
+        void *client_drawingontext,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteInlineObject *This,
+        DWRITE_INLINE_OBJECT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetOverhangMetrics)(
+        IDWriteInlineObject *This,
+        DWRITE_OVERHANG_METRICS *overhangs);
+
+    HRESULT (STDMETHODCALLTYPE *GetBreakConditions)(
+        IDWriteInlineObject *This,
+        DWRITE_BREAK_CONDITION *condition_before,
+        DWRITE_BREAK_CONDITION *condition_after);
+
+    END_INTERFACE
+} IDWriteInlineObjectVtbl;
+
+interface IDWriteInlineObject {
+    CONST_VTBL IDWriteInlineObjectVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteInlineObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteInlineObject_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteInlineObject_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteInlineObject methods ***/
+#define IDWriteInlineObject_Draw(This,client_drawingontext,renderer,originX,originY,is_sideways,is_rtl,drawing_effect) (This)->lpVtbl->Draw(This,client_drawingontext,renderer,originX,originY,is_sideways,is_rtl,drawing_effect)
+#define IDWriteInlineObject_GetMetrics(This,metrics) (This)->lpVtbl->GetMetrics(This,metrics)
+#define IDWriteInlineObject_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
+#define IDWriteInlineObject_GetBreakConditions(This,condition_before,condition_after) (This)->lpVtbl->GetBreakConditions(This,condition_before,condition_after)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteInlineObject_QueryInterface(IDWriteInlineObject* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteInlineObject_AddRef(IDWriteInlineObject* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteInlineObject_Release(IDWriteInlineObject* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteInlineObject methods ***/
+static FORCEINLINE HRESULT IDWriteInlineObject_Draw(IDWriteInlineObject* This,void *client_drawingontext,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY,WINBOOL is_sideways,WINBOOL is_rtl,IUnknown *drawing_effect) {
+    return This->lpVtbl->Draw(This,client_drawingontext,renderer,originX,originY,is_sideways,is_rtl,drawing_effect);
+}
+static FORCEINLINE HRESULT IDWriteInlineObject_GetMetrics(IDWriteInlineObject* This,DWRITE_INLINE_OBJECT_METRICS *metrics) {
+    return This->lpVtbl->GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteInlineObject_GetOverhangMetrics(IDWriteInlineObject* This,DWRITE_OVERHANG_METRICS *overhangs) {
+    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
+}
+static FORCEINLINE HRESULT IDWriteInlineObject_GetBreakConditions(IDWriteInlineObject* This,DWRITE_BREAK_CONDITION *condition_before,DWRITE_BREAK_CONDITION *condition_after) {
+    return This->lpVtbl->GetBreakConditions(This,condition_before,condition_after);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteInlineObject_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextFormat interface
+ */
+#ifndef __IDWriteTextFormat_INTERFACE_DEFINED__
+#define __IDWriteTextFormat_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextFormat, 0x9c906818, 0x31d7, 0x4fd3, 0xa1,0x51, 0x7c,0x5e,0x22,0x5d,0xb5,0x5a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a")
+IDWriteTextFormat : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetTextAlignment(
+        DWRITE_TEXT_ALIGNMENT alignment) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetParagraphAlignment(
+        DWRITE_PARAGRAPH_ALIGNMENT alignment) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetWordWrapping(
+        DWRITE_WORD_WRAPPING wrapping) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetReadingDirection(
+        DWRITE_READING_DIRECTION direction) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFlowDirection(
+        DWRITE_FLOW_DIRECTION direction) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetIncrementalTabStop(
+        FLOAT tabstop) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTrimming(
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLineSpacing(
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline) = 0;
+
+    virtual DWRITE_TEXT_ALIGNMENT STDMETHODCALLTYPE GetTextAlignment(
+        ) = 0;
+
+    virtual DWRITE_PARAGRAPH_ALIGNMENT STDMETHODCALLTYPE GetParagraphAlignment(
+        ) = 0;
+
+    virtual DWRITE_WORD_WRAPPING STDMETHODCALLTYPE GetWordWrapping(
+        ) = 0;
+
+    virtual DWRITE_READING_DIRECTION STDMETHODCALLTYPE GetReadingDirection(
+        ) = 0;
+
+    virtual DWRITE_FLOW_DIRECTION STDMETHODCALLTYPE GetFlowDirection(
+        ) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetIncrementalTabStop(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTrimming(
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLineSpacing(
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontCollection(
+        IDWriteFontCollection **collection) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontFamilyNameLength(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamilyName(
+        WCHAR *name,
+        UINT32 size) = 0;
+
+    virtual DWRITE_FONT_WEIGHT STDMETHODCALLTYPE GetFontWeight(
+        ) = 0;
+
+    virtual DWRITE_FONT_STYLE STDMETHODCALLTYPE GetFontStyle(
+        ) = 0;
+
+    virtual DWRITE_FONT_STRETCH STDMETHODCALLTYPE GetFontStretch(
+        ) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetFontSize(
+        ) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetLocaleNameLength(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleName(
+        WCHAR *name,
+        UINT32 size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextFormat, 0x9c906818, 0x31d7, 0x4fd3, 0xa1,0x51, 0x7c,0x5e,0x22,0x5d,0xb5,0x5a)
+#endif
+#else
+typedef struct IDWriteTextFormatVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextFormat *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextFormat *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextFormat *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextFormat *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextFormat *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextFormat *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextFormat *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextFormat *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextFormat *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextFormat *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextFormat *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextFormat *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextFormat *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextFormat *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextFormat *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextFormat *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextFormat *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextFormat *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextFormat *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextFormat *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextFormat *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextFormat *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextFormat *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextFormat *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextFormat *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextFormat *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextFormat *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextFormat *This,
+        WCHAR *name,
+        UINT32 size);
+
+    END_INTERFACE
+} IDWriteTextFormatVtbl;
+
+interface IDWriteTextFormat {
+    CONST_VTBL IDWriteTextFormatVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextFormat_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextFormat_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextFormat_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextFormat_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextFormat_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextFormat_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextFormat_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextFormat_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextFormat_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextFormat_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextFormat_SetLineSpacing(This,spacing,line_spacing,baseline) (This)->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline)
+#define IDWriteTextFormat_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextFormat_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextFormat_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextFormat_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextFormat_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextFormat_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextFormat_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextFormat_GetLineSpacing(This,method,spacing,baseline) (This)->lpVtbl->GetLineSpacing(This,method,spacing,baseline)
+#define IDWriteTextFormat_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteTextFormat_GetFontFamilyNameLength(This) (This)->lpVtbl->GetFontFamilyNameLength(This)
+#define IDWriteTextFormat_GetFontFamilyName(This,name,size) (This)->lpVtbl->GetFontFamilyName(This,name,size)
+#define IDWriteTextFormat_GetFontWeight(This) (This)->lpVtbl->GetFontWeight(This)
+#define IDWriteTextFormat_GetFontStyle(This) (This)->lpVtbl->GetFontStyle(This)
+#define IDWriteTextFormat_GetFontStretch(This) (This)->lpVtbl->GetFontStretch(This)
+#define IDWriteTextFormat_GetFontSize(This) (This)->lpVtbl->GetFontSize(This)
+#define IDWriteTextFormat_GetLocaleNameLength(This) (This)->lpVtbl->GetLocaleNameLength(This)
+#define IDWriteTextFormat_GetLocaleName(This,name,size) (This)->lpVtbl->GetLocaleName(This,name,size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat_QueryInterface(IDWriteTextFormat* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextFormat_AddRef(IDWriteTextFormat* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextFormat_Release(IDWriteTextFormat* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat_SetTextAlignment(IDWriteTextFormat* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetParagraphAlignment(IDWriteTextFormat* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetWordWrapping(IDWriteTextFormat* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetReadingDirection(IDWriteTextFormat* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetFlowDirection(IDWriteTextFormat* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetIncrementalTabStop(IDWriteTextFormat* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetTrimming(IDWriteTextFormat* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_SetLineSpacing(IDWriteTextFormat* This,DWRITE_LINE_SPACING_METHOD spacing,FLOAT line_spacing,FLOAT baseline) {
+    return This->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextFormat_GetTextAlignment(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextFormat_GetParagraphAlignment(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextFormat_GetWordWrapping(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextFormat_GetReadingDirection(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextFormat_GetFlowDirection(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat_GetIncrementalTabStop(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_GetTrimming(IDWriteTextFormat* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_GetLineSpacing(IDWriteTextFormat* This,DWRITE_LINE_SPACING_METHOD *method,FLOAT *spacing,FLOAT *baseline) {
+    return This->lpVtbl->GetLineSpacing(This,method,spacing,baseline);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_GetFontCollection(IDWriteTextFormat* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat_GetFontFamilyNameLength(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetFontFamilyNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_GetFontFamilyName(IDWriteTextFormat* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetFontFamilyName(This,name,size);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteTextFormat_GetFontWeight(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetFontWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteTextFormat_GetFontStyle(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetFontStyle(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteTextFormat_GetFontStretch(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetFontStretch(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat_GetFontSize(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetFontSize(This);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat_GetLocaleNameLength(IDWriteTextFormat* This) {
+    return This->lpVtbl->GetLocaleNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat_GetLocaleName(IDWriteTextFormat* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetLocaleName(This,name,size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextFormat_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTypography interface
+ */
+#ifndef __IDWriteTypography_INTERFACE_DEFINED__
+#define __IDWriteTypography_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTypography, 0x55f1112b, 0x1dc2, 0x4b3c, 0x95,0x41, 0xf4,0x68,0x94,0xed,0x85,0xb6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6")
+IDWriteTypography : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddFontFeature(
+        DWRITE_FONT_FEATURE feature) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontFeatureCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFeature(
+        UINT32 index,
+        DWRITE_FONT_FEATURE *feature) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTypography, 0x55f1112b, 0x1dc2, 0x4b3c, 0x95,0x41, 0xf4,0x68,0x94,0xed,0x85,0xb6)
+#endif
+#else
+typedef struct IDWriteTypographyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTypography *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTypography *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTypography *This);
+
+    /*** IDWriteTypography methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFontFeature)(
+        IDWriteTypography *This,
+        DWRITE_FONT_FEATURE feature);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFeatureCount)(
+        IDWriteTypography *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFeature)(
+        IDWriteTypography *This,
+        UINT32 index,
+        DWRITE_FONT_FEATURE *feature);
+
+    END_INTERFACE
+} IDWriteTypographyVtbl;
+
+interface IDWriteTypography {
+    CONST_VTBL IDWriteTypographyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTypography_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTypography_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTypography_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTypography methods ***/
+#define IDWriteTypography_AddFontFeature(This,feature) (This)->lpVtbl->AddFontFeature(This,feature)
+#define IDWriteTypography_GetFontFeatureCount(This) (This)->lpVtbl->GetFontFeatureCount(This)
+#define IDWriteTypography_GetFontFeature(This,index,feature) (This)->lpVtbl->GetFontFeature(This,index,feature)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTypography_QueryInterface(IDWriteTypography* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTypography_AddRef(IDWriteTypography* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTypography_Release(IDWriteTypography* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTypography methods ***/
+static FORCEINLINE HRESULT IDWriteTypography_AddFontFeature(IDWriteTypography* This,DWRITE_FONT_FEATURE feature) {
+    return This->lpVtbl->AddFontFeature(This,feature);
+}
+static FORCEINLINE UINT32 IDWriteTypography_GetFontFeatureCount(IDWriteTypography* This) {
+    return This->lpVtbl->GetFontFeatureCount(This);
+}
+static FORCEINLINE HRESULT IDWriteTypography_GetFontFeature(IDWriteTypography* This,UINT32 index,DWRITE_FONT_FEATURE *feature) {
+    return This->lpVtbl->GetFontFeature(This,index,feature);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTypography_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteBitmapRenderTarget interface
+ */
+#ifndef __IDWriteBitmapRenderTarget_INTERFACE_DEFINED__
+#define __IDWriteBitmapRenderTarget_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteBitmapRenderTarget, 0x5e5a32a3, 0x8dff, 0x4773, 0x9f,0xf6, 0x06,0x96,0xea,0xb7,0x72,0x67);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267")
+IDWriteBitmapRenderTarget : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE DrawGlyphRun(
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        IDWriteRenderingParams *params,
+        COLORREF textColor,
+        RECT *blackbox_rect = 0) = 0;
+
+    virtual HDC STDMETHODCALLTYPE GetMemoryDC(
+        ) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetPixelsPerDip(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetPixelsPerDip(
+        FLOAT pixels_per_dip) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentTransform(
+        DWRITE_MATRIX *transform) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetCurrentTransform(
+        const DWRITE_MATRIX *transform) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSize(
+        SIZE *size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Resize(
+        UINT32 width,
+        UINT32 height) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteBitmapRenderTarget, 0x5e5a32a3, 0x8dff, 0x4773, 0x9f,0xf6, 0x06,0x96,0xea,0xb7,0x72,0x67)
+#endif
+#else
+typedef struct IDWriteBitmapRenderTargetVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteBitmapRenderTarget *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteBitmapRenderTarget *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteBitmapRenderTarget *This);
+
+    /*** IDWriteBitmapRenderTarget methods ***/
+    HRESULT (STDMETHODCALLTYPE *DrawGlyphRun)(
+        IDWriteBitmapRenderTarget *This,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        IDWriteRenderingParams *params,
+        COLORREF textColor,
+        RECT *blackbox_rect);
+
+    HDC (STDMETHODCALLTYPE *GetMemoryDC)(
+        IDWriteBitmapRenderTarget *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetPixelsPerDip)(
+        IDWriteBitmapRenderTarget *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetPixelsPerDip)(
+        IDWriteBitmapRenderTarget *This,
+        FLOAT pixels_per_dip);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentTransform)(
+        IDWriteBitmapRenderTarget *This,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *SetCurrentTransform)(
+        IDWriteBitmapRenderTarget *This,
+        const DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetSize)(
+        IDWriteBitmapRenderTarget *This,
+        SIZE *size);
+
+    HRESULT (STDMETHODCALLTYPE *Resize)(
+        IDWriteBitmapRenderTarget *This,
+        UINT32 width,
+        UINT32 height);
+
+    END_INTERFACE
+} IDWriteBitmapRenderTargetVtbl;
+
+interface IDWriteBitmapRenderTarget {
+    CONST_VTBL IDWriteBitmapRenderTargetVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteBitmapRenderTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteBitmapRenderTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteBitmapRenderTarget_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteBitmapRenderTarget methods ***/
+#define IDWriteBitmapRenderTarget_DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuring_mode,glyph_run,params,textColor,blackbox_rect) (This)->lpVtbl->DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuring_mode,glyph_run,params,textColor,blackbox_rect)
+#define IDWriteBitmapRenderTarget_GetMemoryDC(This) (This)->lpVtbl->GetMemoryDC(This)
+#define IDWriteBitmapRenderTarget_GetPixelsPerDip(This) (This)->lpVtbl->GetPixelsPerDip(This)
+#define IDWriteBitmapRenderTarget_SetPixelsPerDip(This,pixels_per_dip) (This)->lpVtbl->SetPixelsPerDip(This,pixels_per_dip)
+#define IDWriteBitmapRenderTarget_GetCurrentTransform(This,transform) (This)->lpVtbl->GetCurrentTransform(This,transform)
+#define IDWriteBitmapRenderTarget_SetCurrentTransform(This,transform) (This)->lpVtbl->SetCurrentTransform(This,transform)
+#define IDWriteBitmapRenderTarget_GetSize(This,size) (This)->lpVtbl->GetSize(This,size)
+#define IDWriteBitmapRenderTarget_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_QueryInterface(IDWriteBitmapRenderTarget* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteBitmapRenderTarget_AddRef(IDWriteBitmapRenderTarget* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteBitmapRenderTarget_Release(IDWriteBitmapRenderTarget* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteBitmapRenderTarget methods ***/
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_DrawGlyphRun(IDWriteBitmapRenderTarget* This,FLOAT baselineOriginX,FLOAT baselineOriginY,DWRITE_MEASURING_MODE measuring_mode,const DWRITE_GLYPH_RUN *glyph_run,IDWriteRenderingParams *params,COLORREF textColor,RECT *blackbox_rect) {
+    return This->lpVtbl->DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuring_mode,glyph_run,params,textColor,blackbox_rect);
+}
+static FORCEINLINE HDC IDWriteBitmapRenderTarget_GetMemoryDC(IDWriteBitmapRenderTarget* This) {
+    return This->lpVtbl->GetMemoryDC(This);
+}
+static FORCEINLINE FLOAT IDWriteBitmapRenderTarget_GetPixelsPerDip(IDWriteBitmapRenderTarget* This) {
+    return This->lpVtbl->GetPixelsPerDip(This);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_SetPixelsPerDip(IDWriteBitmapRenderTarget* This,FLOAT pixels_per_dip) {
+    return This->lpVtbl->SetPixelsPerDip(This,pixels_per_dip);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_GetCurrentTransform(IDWriteBitmapRenderTarget* This,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->GetCurrentTransform(This,transform);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_SetCurrentTransform(IDWriteBitmapRenderTarget* This,const DWRITE_MATRIX *transform) {
+    return This->lpVtbl->SetCurrentTransform(This,transform);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_GetSize(IDWriteBitmapRenderTarget* This,SIZE *size) {
+    return This->lpVtbl->GetSize(This,size);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget_Resize(IDWriteBitmapRenderTarget* This,UINT32 width,UINT32 height) {
+    return This->lpVtbl->Resize(This,width,height);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteBitmapRenderTarget_INTERFACE_DEFINED__ */
+
+#ifndef _WINGDI_
+typedef struct tagLOGFONTW {
+    LONG lfHeight;
+    LONG lfWidth;
+    LONG lfEscapement;
+    LONG lfOrientation;
+    LONG lfWeight;
+    BYTE lfItalic;
+    BYTE lfUnderline;
+    BYTE lfStrikeOut;
+    BYTE lfCharSet;
+    BYTE lfOutPrecision;
+    BYTE lfClipPrecision;
+    BYTE lfQuality;
+    BYTE lfPitchAndFamily;
+    WCHAR lfFaceName[32];
+} LOGFONTW;
+typedef struct tagLOGFONTW *PLOGFONTW;
+typedef struct tagLOGFONTW *LPLOGFONTW;
+#endif /* _WINGDI_ */
+/*****************************************************************************
+ * IDWriteGdiInterop interface
+ */
+#ifndef __IDWriteGdiInterop_INTERFACE_DEFINED__
+#define __IDWriteGdiInterop_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteGdiInterop, 0x1edd9491, 0x9853, 0x4299, 0x89,0x8f, 0x64,0x32,0x98,0x3b,0x6f,0x3a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a")
+IDWriteGdiInterop : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFromLOGFONT(
+        const LOGFONTW *logfont,
+        IDWriteFont **font) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConvertFontToLOGFONT(
+        IDWriteFont *font,
+        LOGFONTW *logfont,
+        WINBOOL *is_systemfont) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConvertFontFaceToLOGFONT(
+        IDWriteFontFace *font,
+        LOGFONTW *logfont) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFaceFromHdc(
+        HDC hdc,
+        IDWriteFontFace **fontface) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateBitmapRenderTarget(
+        HDC hdc,
+        UINT32 width,
+        UINT32 height,
+        IDWriteBitmapRenderTarget **target) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteGdiInterop, 0x1edd9491, 0x9853, 0x4299, 0x89,0x8f, 0x64,0x32,0x98,0x3b,0x6f,0x3a)
+#endif
+#else
+typedef struct IDWriteGdiInteropVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteGdiInterop *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteGdiInterop *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteGdiInterop *This);
+
+    /*** IDWriteGdiInterop methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateFontFromLOGFONT)(
+        IDWriteGdiInterop *This,
+        const LOGFONTW *logfont,
+        IDWriteFont **font);
+
+    HRESULT (STDMETHODCALLTYPE *ConvertFontToLOGFONT)(
+        IDWriteGdiInterop *This,
+        IDWriteFont *font,
+        LOGFONTW *logfont,
+        WINBOOL *is_systemfont);
+
+    HRESULT (STDMETHODCALLTYPE *ConvertFontFaceToLOGFONT)(
+        IDWriteGdiInterop *This,
+        IDWriteFontFace *font,
+        LOGFONTW *logfont);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceFromHdc)(
+        IDWriteGdiInterop *This,
+        HDC hdc,
+        IDWriteFontFace **fontface);
+
+    HRESULT (STDMETHODCALLTYPE *CreateBitmapRenderTarget)(
+        IDWriteGdiInterop *This,
+        HDC hdc,
+        UINT32 width,
+        UINT32 height,
+        IDWriteBitmapRenderTarget **target);
+
+    END_INTERFACE
+} IDWriteGdiInteropVtbl;
+
+interface IDWriteGdiInterop {
+    CONST_VTBL IDWriteGdiInteropVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteGdiInterop_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteGdiInterop_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteGdiInterop_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteGdiInterop methods ***/
+#define IDWriteGdiInterop_CreateFontFromLOGFONT(This,logfont,font) (This)->lpVtbl->CreateFontFromLOGFONT(This,logfont,font)
+#define IDWriteGdiInterop_ConvertFontToLOGFONT(This,font,logfont,is_systemfont) (This)->lpVtbl->ConvertFontToLOGFONT(This,font,logfont,is_systemfont)
+#define IDWriteGdiInterop_ConvertFontFaceToLOGFONT(This,font,logfont) (This)->lpVtbl->ConvertFontFaceToLOGFONT(This,font,logfont)
+#define IDWriteGdiInterop_CreateFontFaceFromHdc(This,hdc,fontface) (This)->lpVtbl->CreateFontFaceFromHdc(This,hdc,fontface)
+#define IDWriteGdiInterop_CreateBitmapRenderTarget(This,hdc,width,height,target) (This)->lpVtbl->CreateBitmapRenderTarget(This,hdc,width,height,target)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteGdiInterop_QueryInterface(IDWriteGdiInterop* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteGdiInterop_AddRef(IDWriteGdiInterop* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteGdiInterop_Release(IDWriteGdiInterop* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteGdiInterop methods ***/
+static FORCEINLINE HRESULT IDWriteGdiInterop_CreateFontFromLOGFONT(IDWriteGdiInterop* This,const LOGFONTW *logfont,IDWriteFont **font) {
+    return This->lpVtbl->CreateFontFromLOGFONT(This,logfont,font);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop_ConvertFontToLOGFONT(IDWriteGdiInterop* This,IDWriteFont *font,LOGFONTW *logfont,WINBOOL *is_systemfont) {
+    return This->lpVtbl->ConvertFontToLOGFONT(This,font,logfont,is_systemfont);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop* This,IDWriteFontFace *font,LOGFONTW *logfont) {
+    return This->lpVtbl->ConvertFontFaceToLOGFONT(This,font,logfont);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop_CreateFontFaceFromHdc(IDWriteGdiInterop* This,HDC hdc,IDWriteFontFace **fontface) {
+    return This->lpVtbl->CreateFontFaceFromHdc(This,hdc,fontface);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop_CreateBitmapRenderTarget(IDWriteGdiInterop* This,HDC hdc,UINT32 width,UINT32 height,IDWriteBitmapRenderTarget **target) {
+    return This->lpVtbl->CreateBitmapRenderTarget(This,hdc,width,height,target);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteGdiInterop_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextLayout interface
+ */
+#ifndef __IDWriteTextLayout_INTERFACE_DEFINED__
+#define __IDWriteTextLayout_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextLayout, 0x53737037, 0x6d14, 0x410b, 0x9b,0xfe, 0x0b,0x18,0x2b,0xb7,0x09,0x61);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961")
+IDWriteTextLayout : public IDWriteTextFormat
+{
+    virtual HRESULT STDMETHODCALLTYPE SetMaxWidth(
+        FLOAT maxWidth) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetMaxHeight(
+        FLOAT maxHeight) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontCollection(
+        IDWriteFontCollection *collection,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontFamilyName(
+        const WCHAR *name,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontWeight(
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontStyle(
+        DWRITE_FONT_STYLE style,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontStretch(
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontSize(
+        FLOAT size,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetUnderline(
+        WINBOOL underline,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetStrikethrough(
+        WINBOOL strikethrough,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDrawingEffect(
+        IUnknown *effect,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetInlineObject(
+        IDWriteInlineObject *object,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTypography(
+        IDWriteTypography *typography,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLocaleName(
+        const WCHAR *locale,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetMaxWidth(
+        ) = 0;
+
+    virtual FLOAT STDMETHODCALLTYPE GetMaxHeight(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontCollection(
+        UINT32 pos,
+        IDWriteFontCollection **collection,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamilyNameLength(
+        UINT32 pos,
+        UINT32 *len,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamilyName(
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontWeight(
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontStyle(
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontStretch(
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontSize(
+        UINT32 position,
+        FLOAT *size,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetUnderline(
+        UINT32 position,
+        WINBOOL *has_underline,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStrikethrough(
+        UINT32 position,
+        WINBOOL *has_strikethrough,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDrawingEffect(
+        UINT32 position,
+        IUnknown **effect,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInlineObject(
+        UINT32 position,
+        IDWriteInlineObject **object,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTypography(
+        UINT32 position,
+        IDWriteTypography **typography,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleNameLength(
+        UINT32 position,
+        UINT32 *length,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleName(
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Draw(
+        void *context,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLineMetrics(
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMetrics(
+        DWRITE_TEXT_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOverhangMetrics(
+        DWRITE_OVERHANG_METRICS *overhangs) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetClusterMetrics(
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *act_count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DetermineMinWidth(
+        FLOAT *min_width) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HitTestPoint(
+        FLOAT pointX,
+        FLOAT pointY,
+        WINBOOL *is_trailinghit,
+        WINBOOL *is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HitTestTextPosition(
+        UINT32 textPosition,
+        WINBOOL is_trailinghit,
+        FLOAT *pointX,
+        FLOAT *pointY,
+        DWRITE_HIT_TEST_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HitTestTextRange(
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32 *actual_metricscount) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextLayout, 0x53737037, 0x6d14, 0x410b, 0x9b,0xfe, 0x0b,0x18,0x2b,0xb7,0x09,0x61)
+#endif
+#else
+typedef struct IDWriteTextLayoutVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextLayout *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextLayout *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextLayout *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextLayout *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextLayout *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextLayout *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextLayout *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextLayout *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextLayout *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextLayout *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextLayout *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextLayout *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextLayout *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextLayout *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextLayout *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextLayout *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextLayout *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextLayout *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextLayout *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextLayout *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextLayout *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextLayout *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextLayout *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextLayout *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextLayout *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextLayout *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextLayout *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextLayout *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextLayout methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetMaxWidth)(
+        IDWriteTextLayout *This,
+        FLOAT maxWidth);
+
+    HRESULT (STDMETHODCALLTYPE *SetMaxHeight)(
+        IDWriteTextLayout *This,
+        FLOAT maxHeight);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontCollection)(
+        IDWriteTextLayout *This,
+        IDWriteFontCollection *collection,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFamilyName)(
+        IDWriteTextLayout *This,
+        const WCHAR *name,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontWeight)(
+        IDWriteTextLayout *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStyle)(
+        IDWriteTextLayout *This,
+        DWRITE_FONT_STYLE style,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStretch)(
+        IDWriteTextLayout *This,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontSize)(
+        IDWriteTextLayout *This,
+        FLOAT size,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetUnderline)(
+        IDWriteTextLayout *This,
+        WINBOOL underline,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetStrikethrough)(
+        IDWriteTextLayout *This,
+        WINBOOL strikethrough,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetDrawingEffect)(
+        IDWriteTextLayout *This,
+        IUnknown *effect,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetInlineObject)(
+        IDWriteTextLayout *This,
+        IDWriteInlineObject *object,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetTypography)(
+        IDWriteTextLayout *This,
+        IDWriteTypography *typography,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocaleName)(
+        IDWriteTextLayout *This,
+        const WCHAR *locale,
+        DWRITE_TEXT_RANGE range);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxWidth)(
+        IDWriteTextLayout *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxHeight)(
+        IDWriteTextLayout *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontCollection)(
+        IDWriteTextLayout *This,
+        UINT32 pos,
+        IDWriteFontCollection **collection,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyNameLength)(
+        IDWriteTextLayout *This,
+        UINT32 pos,
+        UINT32 *len,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyName)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontWeight)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStyle)(
+        IDWriteTextLayout *This,
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStretch)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontSize)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        FLOAT *size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnderline)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        WINBOOL *has_underline,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetStrikethrough)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        WINBOOL *has_strikethrough,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetDrawingEffect)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        IUnknown **effect,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetInlineObject)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        IDWriteInlineObject **object,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypography)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        IDWriteTypography **typography,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleNameLength)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        UINT32 *length,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleName)(
+        IDWriteTextLayout *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *Draw)(
+        IDWriteTextLayout *This,
+        void *context,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineMetrics)(
+        IDWriteTextLayout *This,
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteTextLayout *This,
+        DWRITE_TEXT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetOverhangMetrics)(
+        IDWriteTextLayout *This,
+        DWRITE_OVERHANG_METRICS *overhangs);
+
+    HRESULT (STDMETHODCALLTYPE *GetClusterMetrics)(
+        IDWriteTextLayout *This,
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *act_count);
+
+    HRESULT (STDMETHODCALLTYPE *DetermineMinWidth)(
+        IDWriteTextLayout *This,
+        FLOAT *min_width);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
+        IDWriteTextLayout *This,
+        FLOAT pointX,
+        FLOAT pointY,
+        WINBOOL *is_trailinghit,
+        WINBOOL *is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextPosition)(
+        IDWriteTextLayout *This,
+        UINT32 textPosition,
+        WINBOOL is_trailinghit,
+        FLOAT *pointX,
+        FLOAT *pointY,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextRange)(
+        IDWriteTextLayout *This,
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32 *actual_metricscount);
+
+    END_INTERFACE
+} IDWriteTextLayoutVtbl;
+
+interface IDWriteTextLayout {
+    CONST_VTBL IDWriteTextLayoutVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextLayout_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextLayout_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextLayout_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextLayout_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextLayout_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextLayout_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextLayout_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextLayout_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextLayout_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextLayout_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextLayout_SetLineSpacing(This,spacing,line_spacing,baseline) (This)->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline)
+#define IDWriteTextLayout_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextLayout_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextLayout_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextLayout_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextLayout_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextLayout_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextLayout_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextLayout_GetLineSpacing(This,method,spacing,baseline) (This)->lpVtbl->GetLineSpacing(This,method,spacing,baseline)
+/*** IDWriteTextLayout methods ***/
+#define IDWriteTextLayout_SetMaxWidth(This,maxWidth) (This)->lpVtbl->SetMaxWidth(This,maxWidth)
+#define IDWriteTextLayout_SetMaxHeight(This,maxHeight) (This)->lpVtbl->SetMaxHeight(This,maxHeight)
+#define IDWriteTextLayout_SetFontCollection(This,collection,range) (This)->lpVtbl->SetFontCollection(This,collection,range)
+#define IDWriteTextLayout_SetFontFamilyName(This,name,range) (This)->lpVtbl->SetFontFamilyName(This,name,range)
+#define IDWriteTextLayout_SetFontWeight(This,weight,range) (This)->lpVtbl->SetFontWeight(This,weight,range)
+#define IDWriteTextLayout_SetFontStyle(This,style,range) (This)->lpVtbl->SetFontStyle(This,style,range)
+#define IDWriteTextLayout_SetFontStretch(This,stretch,range) (This)->lpVtbl->SetFontStretch(This,stretch,range)
+#define IDWriteTextLayout_SetFontSize(This,size,range) (This)->lpVtbl->SetFontSize(This,size,range)
+#define IDWriteTextLayout_SetUnderline(This,underline,range) (This)->lpVtbl->SetUnderline(This,underline,range)
+#define IDWriteTextLayout_SetStrikethrough(This,strikethrough,range) (This)->lpVtbl->SetStrikethrough(This,strikethrough,range)
+#define IDWriteTextLayout_SetDrawingEffect(This,effect,range) (This)->lpVtbl->SetDrawingEffect(This,effect,range)
+#define IDWriteTextLayout_SetInlineObject(This,object,range) (This)->lpVtbl->SetInlineObject(This,object,range)
+#define IDWriteTextLayout_SetTypography(This,typography,range) (This)->lpVtbl->SetTypography(This,typography,range)
+#define IDWriteTextLayout_SetLocaleName(This,locale,range) (This)->lpVtbl->SetLocaleName(This,locale,range)
+#define IDWriteTextLayout_GetMaxWidth(This) (This)->lpVtbl->GetMaxWidth(This)
+#define IDWriteTextLayout_GetMaxHeight(This) (This)->lpVtbl->GetMaxHeight(This)
+#define IDWriteTextLayout_GetFontCollection(This,pos,collection,range) (This)->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range)
+#define IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range)
+#define IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range)
+#define IDWriteTextLayout_GetFontWeight(This,position,weight,range) (This)->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range)
+#define IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range)
+#define IDWriteTextLayout_GetFontStretch(This,position,stretch,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range)
+#define IDWriteTextLayout_GetFontSize(This,position,size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range)
+#define IDWriteTextLayout_GetUnderline(This,position,has_underline,range) (This)->lpVtbl->GetUnderline(This,position,has_underline,range)
+#define IDWriteTextLayout_GetStrikethrough(This,position,has_strikethrough,range) (This)->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range)
+#define IDWriteTextLayout_GetDrawingEffect(This,position,effect,range) (This)->lpVtbl->GetDrawingEffect(This,position,effect,range)
+#define IDWriteTextLayout_GetInlineObject(This,position,object,range) (This)->lpVtbl->GetInlineObject(This,position,object,range)
+#define IDWriteTextLayout_GetTypography(This,position,typography,range) (This)->lpVtbl->GetTypography(This,position,typography,range)
+#define IDWriteTextLayout_GetLocaleNameLength(This,position,length,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range)
+#define IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range)
+#define IDWriteTextLayout_Draw(This,context,renderer,originX,originY) (This)->lpVtbl->Draw(This,context,renderer,originX,originY)
+#define IDWriteTextLayout_GetLineMetrics(This,metrics,max_count,actual_count) (This)->lpVtbl->GetLineMetrics(This,metrics,max_count,actual_count)
+#define IDWriteTextLayout_GetMetrics(This,metrics) (This)->lpVtbl->GetMetrics(This,metrics)
+#define IDWriteTextLayout_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
+#define IDWriteTextLayout_GetClusterMetrics(This,metrics,max_count,act_count) (This)->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count)
+#define IDWriteTextLayout_DetermineMinWidth(This,min_width) (This)->lpVtbl->DetermineMinWidth(This,min_width)
+#define IDWriteTextLayout_HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics) (This)->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics)
+#define IDWriteTextLayout_HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics) (This)->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics)
+#define IDWriteTextLayout_HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount) (This)->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout_QueryInterface(IDWriteTextLayout* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextLayout_AddRef(IDWriteTextLayout* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextLayout_Release(IDWriteTextLayout* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout_SetTextAlignment(IDWriteTextLayout* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetParagraphAlignment(IDWriteTextLayout* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetWordWrapping(IDWriteTextLayout* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetReadingDirection(IDWriteTextLayout* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFlowDirection(IDWriteTextLayout* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetIncrementalTabStop(IDWriteTextLayout* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetTrimming(IDWriteTextLayout* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetLineSpacing(IDWriteTextLayout* This,DWRITE_LINE_SPACING_METHOD spacing,FLOAT line_spacing,FLOAT baseline) {
+    return This->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout_GetTextAlignment(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout_GetParagraphAlignment(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextLayout_GetWordWrapping(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextLayout_GetReadingDirection(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout_GetFlowDirection(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout_GetIncrementalTabStop(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetTrimming(IDWriteTextLayout* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetLineSpacing(IDWriteTextLayout* This,DWRITE_LINE_SPACING_METHOD *method,FLOAT *spacing,FLOAT *baseline) {
+    return This->lpVtbl->GetLineSpacing(This,method,spacing,baseline);
+}
+/*** IDWriteTextLayout methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout_SetMaxWidth(IDWriteTextLayout* This,FLOAT maxWidth) {
+    return This->lpVtbl->SetMaxWidth(This,maxWidth);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetMaxHeight(IDWriteTextLayout* This,FLOAT maxHeight) {
+    return This->lpVtbl->SetMaxHeight(This,maxHeight);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFontCollection(IDWriteTextLayout* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontCollection(This,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFontFamilyName(IDWriteTextLayout* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontFamilyName(This,name,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFontWeight(IDWriteTextLayout* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontWeight(This,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFontStyle(IDWriteTextLayout* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStyle(This,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFontStretch(IDWriteTextLayout* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStretch(This,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetFontSize(IDWriteTextLayout* This,FLOAT size,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontSize(This,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetUnderline(IDWriteTextLayout* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetUnderline(This,underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetStrikethrough(IDWriteTextLayout* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetDrawingEffect(IDWriteTextLayout* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetDrawingEffect(This,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetInlineObject(IDWriteTextLayout* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetInlineObject(This,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetTypography(IDWriteTextLayout* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetTypography(This,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_SetLocaleName(IDWriteTextLayout* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetLocaleName(This,locale,range);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout_GetMaxWidth(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetMaxWidth(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout_GetMaxHeight(IDWriteTextLayout* This) {
+    return This->lpVtbl->GetMaxHeight(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontCollection(IDWriteTextLayout* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontFamilyNameLength(IDWriteTextLayout* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontFamilyName(IDWriteTextLayout* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontWeight(IDWriteTextLayout* This,UINT32 position,DWRITE_FONT_WEIGHT *weight,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontStyle(IDWriteTextLayout* This,UINT32 currentPosition,DWRITE_FONT_STYLE *style,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontStretch(IDWriteTextLayout* This,UINT32 position,DWRITE_FONT_STRETCH *stretch,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetFontSize(IDWriteTextLayout* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetUnderline(IDWriteTextLayout* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetStrikethrough(IDWriteTextLayout* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetDrawingEffect(IDWriteTextLayout* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetInlineObject(IDWriteTextLayout* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetInlineObject(This,position,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetTypography(IDWriteTextLayout* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetTypography(This,position,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetLocaleNameLength(IDWriteTextLayout* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetLocaleName(IDWriteTextLayout* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_Draw(IDWriteTextLayout* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
+    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetLineMetrics(IDWriteTextLayout* This,DWRITE_LINE_METRICS *metrics,UINT32 max_count,UINT32 *actual_count) {
+    return This->lpVtbl->GetLineMetrics(This,metrics,max_count,actual_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetMetrics(IDWriteTextLayout* This,DWRITE_TEXT_METRICS *metrics) {
+    return This->lpVtbl->GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetOverhangMetrics(IDWriteTextLayout* This,DWRITE_OVERHANG_METRICS *overhangs) {
+    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_GetClusterMetrics(IDWriteTextLayout* This,DWRITE_CLUSTER_METRICS *metrics,UINT32 max_count,UINT32 *act_count) {
+    return This->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_DetermineMinWidth(IDWriteTextLayout* This,FLOAT *min_width) {
+    return This->lpVtbl->DetermineMinWidth(This,min_width);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_HitTestPoint(IDWriteTextLayout* This,FLOAT pointX,FLOAT pointY,WINBOOL *is_trailinghit,WINBOOL *is_inside,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_HitTestTextPosition(IDWriteTextLayout* This,UINT32 textPosition,WINBOOL is_trailinghit,FLOAT *pointX,FLOAT *pointY,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout_HitTestTextRange(IDWriteTextLayout* This,UINT32 textPosition,UINT32 textLength,FLOAT originX,FLOAT originY,DWRITE_HIT_TEST_METRICS *metrics,UINT32 max_metricscount,UINT32 *actual_metricscount) {
+    return This->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextLayout_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteNumberSubstitution interface
+ */
+#ifndef __IDWriteNumberSubstitution_INTERFACE_DEFINED__
+#define __IDWriteNumberSubstitution_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteNumberSubstitution, 0x14885cc9, 0xbab0, 0x4f90, 0xb6,0xed, 0x5c,0x36,0x6a,0x2c,0xd0,0x3d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("14885cc9-bab0-4f90-b6ed-5c366a2cd03d")
+IDWriteNumberSubstitution : public IUnknown
+{
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteNumberSubstitution, 0x14885cc9, 0xbab0, 0x4f90, 0xb6,0xed, 0x5c,0x36,0x6a,0x2c,0xd0,0x3d)
+#endif
+#else
+typedef struct IDWriteNumberSubstitutionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteNumberSubstitution *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteNumberSubstitution *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteNumberSubstitution *This);
+
+    END_INTERFACE
+} IDWriteNumberSubstitutionVtbl;
+
+interface IDWriteNumberSubstitution {
+    CONST_VTBL IDWriteNumberSubstitutionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteNumberSubstitution_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteNumberSubstitution_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteNumberSubstitution_Release(This) (This)->lpVtbl->Release(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteNumberSubstitution_QueryInterface(IDWriteNumberSubstitution* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteNumberSubstitution_AddRef(IDWriteNumberSubstitution* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteNumberSubstitution_Release(IDWriteNumberSubstitution* This) {
+    return This->lpVtbl->Release(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteNumberSubstitution_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalysisSource interface
+ */
+#ifndef __IDWriteTextAnalysisSource_INTERFACE_DEFINED__
+#define __IDWriteTextAnalysisSource_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalysisSource, 0x688e1a58, 0x5094, 0x47c8, 0xad,0xc8, 0xfb,0xce,0xa6,0x0a,0xe9,0x2b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("688e1a58-5094-47c8-adc8-fbcea60ae92b")
+IDWriteTextAnalysisSource : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetTextAtPosition(
+        UINT32 position,
+        const WCHAR **text,
+        UINT32 *text_len) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTextBeforePosition(
+        UINT32 position,
+        const WCHAR **text,
+        UINT32 *text_len) = 0;
+
+    virtual DWRITE_READING_DIRECTION STDMETHODCALLTYPE GetParagraphReadingDirection(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleName(
+        UINT32 position,
+        UINT32 *text_len,
+        const WCHAR **locale) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetNumberSubstitution(
+        UINT32 position,
+        UINT32 *text_len,
+        IDWriteNumberSubstitution **substitution) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalysisSource, 0x688e1a58, 0x5094, 0x47c8, 0xad,0xc8, 0xfb,0xce,0xa6,0x0a,0xe9,0x2b)
+#endif
+#else
+typedef struct IDWriteTextAnalysisSourceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalysisSource *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalysisSource *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalysisSource *This);
+
+    /*** IDWriteTextAnalysisSource methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTextAtPosition)(
+        IDWriteTextAnalysisSource *This,
+        UINT32 position,
+        const WCHAR **text,
+        UINT32 *text_len);
+
+    HRESULT (STDMETHODCALLTYPE *GetTextBeforePosition)(
+        IDWriteTextAnalysisSource *This,
+        UINT32 position,
+        const WCHAR **text,
+        UINT32 *text_len);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetParagraphReadingDirection)(
+        IDWriteTextAnalysisSource *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextAnalysisSource *This,
+        UINT32 position,
+        UINT32 *text_len,
+        const WCHAR **locale);
+
+    HRESULT (STDMETHODCALLTYPE *GetNumberSubstitution)(
+        IDWriteTextAnalysisSource *This,
+        UINT32 position,
+        UINT32 *text_len,
+        IDWriteNumberSubstitution **substitution);
+
+    END_INTERFACE
+} IDWriteTextAnalysisSourceVtbl;
+
+interface IDWriteTextAnalysisSource {
+    CONST_VTBL IDWriteTextAnalysisSourceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalysisSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalysisSource_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalysisSource_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalysisSource methods ***/
+#define IDWriteTextAnalysisSource_GetTextAtPosition(This,position,text,text_len) (This)->lpVtbl->GetTextAtPosition(This,position,text,text_len)
+#define IDWriteTextAnalysisSource_GetTextBeforePosition(This,position,text,text_len) (This)->lpVtbl->GetTextBeforePosition(This,position,text,text_len)
+#define IDWriteTextAnalysisSource_GetParagraphReadingDirection(This) (This)->lpVtbl->GetParagraphReadingDirection(This)
+#define IDWriteTextAnalysisSource_GetLocaleName(This,position,text_len,locale) (This)->lpVtbl->GetLocaleName(This,position,text_len,locale)
+#define IDWriteTextAnalysisSource_GetNumberSubstitution(This,position,text_len,substitution) (This)->lpVtbl->GetNumberSubstitution(This,position,text_len,substitution)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource_QueryInterface(IDWriteTextAnalysisSource* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSource_AddRef(IDWriteTextAnalysisSource* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSource_Release(IDWriteTextAnalysisSource* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalysisSource methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource_GetTextAtPosition(IDWriteTextAnalysisSource* This,UINT32 position,const WCHAR **text,UINT32 *text_len) {
+    return This->lpVtbl->GetTextAtPosition(This,position,text,text_len);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource_GetTextBeforePosition(IDWriteTextAnalysisSource* This,UINT32 position,const WCHAR **text,UINT32 *text_len) {
+    return This->lpVtbl->GetTextBeforePosition(This,position,text,text_len);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextAnalysisSource_GetParagraphReadingDirection(IDWriteTextAnalysisSource* This) {
+    return This->lpVtbl->GetParagraphReadingDirection(This);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource_GetLocaleName(IDWriteTextAnalysisSource* This,UINT32 position,UINT32 *text_len,const WCHAR **locale) {
+    return This->lpVtbl->GetLocaleName(This,position,text_len,locale);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource_GetNumberSubstitution(IDWriteTextAnalysisSource* This,UINT32 position,UINT32 *text_len,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->GetNumberSubstitution(This,position,text_len,substitution);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalysisSource_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalysisSink interface
+ */
+#ifndef __IDWriteTextAnalysisSink_INTERFACE_DEFINED__
+#define __IDWriteTextAnalysisSink_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalysisSink, 0x5810cd44, 0x0ca0, 0x4701, 0xb3,0xfa, 0xbe,0xc5,0x18,0x2a,0xe4,0xf6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5810cd44-0ca0-4701-b3fa-bec5182ae4f6")
+IDWriteTextAnalysisSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetScriptAnalysis(
+        UINT32 position,
+        UINT32 length,
+        const DWRITE_SCRIPT_ANALYSIS *scriptanalysis) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLineBreakpoints(
+        UINT32 position,
+        UINT32 length,
+        const DWRITE_LINE_BREAKPOINT *breakpoints) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetBidiLevel(
+        UINT32 position,
+        UINT32 length,
+        UINT8 explicitLevel,
+        UINT8 resolvedLevel) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetNumberSubstitution(
+        UINT32 position,
+        UINT32 length,
+        IDWriteNumberSubstitution *substitution) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalysisSink, 0x5810cd44, 0x0ca0, 0x4701, 0xb3,0xfa, 0xbe,0xc5,0x18,0x2a,0xe4,0xf6)
+#endif
+#else
+typedef struct IDWriteTextAnalysisSinkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalysisSink *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalysisSink *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalysisSink *This);
+
+    /*** IDWriteTextAnalysisSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetScriptAnalysis)(
+        IDWriteTextAnalysisSink *This,
+        UINT32 position,
+        UINT32 length,
+        const DWRITE_SCRIPT_ANALYSIS *scriptanalysis);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineBreakpoints)(
+        IDWriteTextAnalysisSink *This,
+        UINT32 position,
+        UINT32 length,
+        const DWRITE_LINE_BREAKPOINT *breakpoints);
+
+    HRESULT (STDMETHODCALLTYPE *SetBidiLevel)(
+        IDWriteTextAnalysisSink *This,
+        UINT32 position,
+        UINT32 length,
+        UINT8 explicitLevel,
+        UINT8 resolvedLevel);
+
+    HRESULT (STDMETHODCALLTYPE *SetNumberSubstitution)(
+        IDWriteTextAnalysisSink *This,
+        UINT32 position,
+        UINT32 length,
+        IDWriteNumberSubstitution *substitution);
+
+    END_INTERFACE
+} IDWriteTextAnalysisSinkVtbl;
+
+interface IDWriteTextAnalysisSink {
+    CONST_VTBL IDWriteTextAnalysisSinkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalysisSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalysisSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalysisSink_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalysisSink methods ***/
+#define IDWriteTextAnalysisSink_SetScriptAnalysis(This,position,length,scriptanalysis) (This)->lpVtbl->SetScriptAnalysis(This,position,length,scriptanalysis)
+#define IDWriteTextAnalysisSink_SetLineBreakpoints(This,position,length,breakpoints) (This)->lpVtbl->SetLineBreakpoints(This,position,length,breakpoints)
+#define IDWriteTextAnalysisSink_SetBidiLevel(This,position,length,explicitLevel,resolvedLevel) (This)->lpVtbl->SetBidiLevel(This,position,length,explicitLevel,resolvedLevel)
+#define IDWriteTextAnalysisSink_SetNumberSubstitution(This,position,length,substitution) (This)->lpVtbl->SetNumberSubstitution(This,position,length,substitution)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink_QueryInterface(IDWriteTextAnalysisSink* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSink_AddRef(IDWriteTextAnalysisSink* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSink_Release(IDWriteTextAnalysisSink* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalysisSink methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink_SetScriptAnalysis(IDWriteTextAnalysisSink* This,UINT32 position,UINT32 length,const DWRITE_SCRIPT_ANALYSIS *scriptanalysis) {
+    return This->lpVtbl->SetScriptAnalysis(This,position,length,scriptanalysis);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink_SetLineBreakpoints(IDWriteTextAnalysisSink* This,UINT32 position,UINT32 length,const DWRITE_LINE_BREAKPOINT *breakpoints) {
+    return This->lpVtbl->SetLineBreakpoints(This,position,length,breakpoints);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink_SetBidiLevel(IDWriteTextAnalysisSink* This,UINT32 position,UINT32 length,UINT8 explicitLevel,UINT8 resolvedLevel) {
+    return This->lpVtbl->SetBidiLevel(This,position,length,explicitLevel,resolvedLevel);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink_SetNumberSubstitution(IDWriteTextAnalysisSink* This,UINT32 position,UINT32 length,IDWriteNumberSubstitution *substitution) {
+    return This->lpVtbl->SetNumberSubstitution(This,position,length,substitution);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalysisSink_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalyzer interface
+ */
+#ifndef __IDWriteTextAnalyzer_INTERFACE_DEFINED__
+#define __IDWriteTextAnalyzer_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalyzer, 0xb7e6163e, 0x7f46, 0x43b4, 0x84,0xb3, 0xe4,0xe6,0x24,0x9c,0x36,0x5d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d")
+IDWriteTextAnalyzer : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AnalyzeScript(
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AnalyzeBidi(
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AnalyzeNumberSubstitution(
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AnalyzeLineBreakpoints(
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphs(
+        const WCHAR *text,
+        UINT32 length,
+        IDWriteFontFace *font_face,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        IDWriteNumberSubstitution *substitution,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        UINT32 max_glyph_count,
+        UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *text_props,
+        UINT16 *glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 *actual_glyph_count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphPlacements(
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGdiCompatibleGlyphPlacements(
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_lengths,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalyzer, 0xb7e6163e, 0x7f46, 0x43b4, 0x84,0xb3, 0xe4,0xe6,0x24,0x9c,0x36,0x5d)
+#endif
+#else
+typedef struct IDWriteTextAnalyzerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalyzer *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalyzer *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalyzer *This);
+
+    /*** IDWriteTextAnalyzer methods ***/
+    HRESULT (STDMETHODCALLTYPE *AnalyzeScript)(
+        IDWriteTextAnalyzer *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeBidi)(
+        IDWriteTextAnalyzer *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeNumberSubstitution)(
+        IDWriteTextAnalyzer *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeLineBreakpoints)(
+        IDWriteTextAnalyzer *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphs)(
+        IDWriteTextAnalyzer *This,
+        const WCHAR *text,
+        UINT32 length,
+        IDWriteFontFace *font_face,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        IDWriteNumberSubstitution *substitution,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        UINT32 max_glyph_count,
+        UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *text_props,
+        UINT16 *glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 *actual_glyph_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphPlacements)(
+        IDWriteTextAnalyzer *This,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphPlacements)(
+        IDWriteTextAnalyzer *This,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_lengths,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets);
+
+    END_INTERFACE
+} IDWriteTextAnalyzerVtbl;
+
+interface IDWriteTextAnalyzer {
+    CONST_VTBL IDWriteTextAnalyzerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalyzer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalyzer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalyzer_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalyzer methods ***/
+#define IDWriteTextAnalyzer_AnalyzeScript(This,source,position,length,sink) (This)->lpVtbl->AnalyzeScript(This,source,position,length,sink)
+#define IDWriteTextAnalyzer_AnalyzeBidi(This,source,position,length,sink) (This)->lpVtbl->AnalyzeBidi(This,source,position,length,sink)
+#define IDWriteTextAnalyzer_AnalyzeNumberSubstitution(This,source,position,length,sink) (This)->lpVtbl->AnalyzeNumberSubstitution(This,source,position,length,sink)
+#define IDWriteTextAnalyzer_AnalyzeLineBreakpoints(This,source,position,length,sink) (This)->lpVtbl->AnalyzeLineBreakpoints(This,source,position,length,sink)
+#define IDWriteTextAnalyzer_GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count) (This)->lpVtbl->GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count)
+#define IDWriteTextAnalyzer_GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets) (This)->lpVtbl->GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets)
+#define IDWriteTextAnalyzer_GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets) (This)->lpVtbl->GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_QueryInterface(IDWriteTextAnalyzer* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalyzer_AddRef(IDWriteTextAnalyzer* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalyzer_Release(IDWriteTextAnalyzer* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalyzer methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_AnalyzeScript(IDWriteTextAnalyzer* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeScript(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_AnalyzeBidi(IDWriteTextAnalyzer* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeBidi(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_AnalyzeNumberSubstitution(IDWriteTextAnalyzer* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeNumberSubstitution(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_AnalyzeLineBreakpoints(IDWriteTextAnalyzer* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeLineBreakpoints(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_GetGlyphs(IDWriteTextAnalyzer* This,const WCHAR *text,UINT32 length,IDWriteFontFace *font_face,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,IDWriteNumberSubstitution *substitution,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_len,UINT32 feature_ranges,UINT32 max_glyph_count,UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *text_props,UINT16 *glyph_indices,DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 *actual_glyph_count) {
+    return This->lpVtbl->GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_GetGlyphPlacements(IDWriteTextAnalyzer* This,const WCHAR *text,const UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *props,UINT32 text_len,const UINT16 *glyph_indices,const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 glyph_count,IDWriteFontFace *font_face,FLOAT fontEmSize,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_len,UINT32 feature_ranges,FLOAT *glyph_advances,DWRITE_GLYPH_OFFSET *glyph_offsets) {
+    return This->lpVtbl->GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer_GetGdiCompatibleGlyphPlacements(IDWriteTextAnalyzer* This,const WCHAR *text,const UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *props,UINT32 text_len,const UINT16 *glyph_indices,const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 glyph_count,IDWriteFontFace *font_face,FLOAT fontEmSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_lengths,UINT32 feature_ranges,FLOAT *glyph_advances,DWRITE_GLYPH_OFFSET *glyph_offsets) {
+    return This->lpVtbl->GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalyzer_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteGlyphRunAnalysis interface
+ */
+#ifndef __IDWriteGlyphRunAnalysis_INTERFACE_DEFINED__
+#define __IDWriteGlyphRunAnalysis_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteGlyphRunAnalysis, 0x7d97dbf7, 0xe085, 0x42d4, 0x81,0xe3, 0x6a,0x88,0x3b,0xde,0xd1,0x18);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118")
+IDWriteGlyphRunAnalysis : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetAlphaTextureBounds(
+        DWRITE_TEXTURE_TYPE type,
+        RECT *bounds) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateAlphaTexture(
+        DWRITE_TEXTURE_TYPE type,
+        const RECT *bounds,
+        BYTE *alphaValues,
+        UINT32 bufferSize) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAlphaBlendParams(
+        IDWriteRenderingParams *renderingParams,
+        FLOAT *blendGamma,
+        FLOAT *blendEnhancedContrast,
+        FLOAT *blendClearTypeLevel) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteGlyphRunAnalysis, 0x7d97dbf7, 0xe085, 0x42d4, 0x81,0xe3, 0x6a,0x88,0x3b,0xde,0xd1,0x18)
+#endif
+#else
+typedef struct IDWriteGlyphRunAnalysisVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteGlyphRunAnalysis *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteGlyphRunAnalysis *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteGlyphRunAnalysis *This);
+
+    /*** IDWriteGlyphRunAnalysis methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetAlphaTextureBounds)(
+        IDWriteGlyphRunAnalysis *This,
+        DWRITE_TEXTURE_TYPE type,
+        RECT *bounds);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAlphaTexture)(
+        IDWriteGlyphRunAnalysis *This,
+        DWRITE_TEXTURE_TYPE type,
+        const RECT *bounds,
+        BYTE *alphaValues,
+        UINT32 bufferSize);
+
+    HRESULT (STDMETHODCALLTYPE *GetAlphaBlendParams)(
+        IDWriteGlyphRunAnalysis *This,
+        IDWriteRenderingParams *renderingParams,
+        FLOAT *blendGamma,
+        FLOAT *blendEnhancedContrast,
+        FLOAT *blendClearTypeLevel);
+
+    END_INTERFACE
+} IDWriteGlyphRunAnalysisVtbl;
+
+interface IDWriteGlyphRunAnalysis {
+    CONST_VTBL IDWriteGlyphRunAnalysisVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteGlyphRunAnalysis_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteGlyphRunAnalysis_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteGlyphRunAnalysis_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteGlyphRunAnalysis methods ***/
+#define IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(This,type,bounds) (This)->lpVtbl->GetAlphaTextureBounds(This,type,bounds)
+#define IDWriteGlyphRunAnalysis_CreateAlphaTexture(This,type,bounds,alphaValues,bufferSize) (This)->lpVtbl->CreateAlphaTexture(This,type,bounds,alphaValues,bufferSize)
+#define IDWriteGlyphRunAnalysis_GetAlphaBlendParams(This,renderingParams,blendGamma,blendEnhancedContrast,blendClearTypeLevel) (This)->lpVtbl->GetAlphaBlendParams(This,renderingParams,blendGamma,blendEnhancedContrast,blendClearTypeLevel)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteGlyphRunAnalysis_QueryInterface(IDWriteGlyphRunAnalysis* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteGlyphRunAnalysis_AddRef(IDWriteGlyphRunAnalysis* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteGlyphRunAnalysis_Release(IDWriteGlyphRunAnalysis* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteGlyphRunAnalysis methods ***/
+static FORCEINLINE HRESULT IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(IDWriteGlyphRunAnalysis* This,DWRITE_TEXTURE_TYPE type,RECT *bounds) {
+    return This->lpVtbl->GetAlphaTextureBounds(This,type,bounds);
+}
+static FORCEINLINE HRESULT IDWriteGlyphRunAnalysis_CreateAlphaTexture(IDWriteGlyphRunAnalysis* This,DWRITE_TEXTURE_TYPE type,const RECT *bounds,BYTE *alphaValues,UINT32 bufferSize) {
+    return This->lpVtbl->CreateAlphaTexture(This,type,bounds,alphaValues,bufferSize);
+}
+static FORCEINLINE HRESULT IDWriteGlyphRunAnalysis_GetAlphaBlendParams(IDWriteGlyphRunAnalysis* This,IDWriteRenderingParams *renderingParams,FLOAT *blendGamma,FLOAT *blendEnhancedContrast,FLOAT *blendClearTypeLevel) {
+    return This->lpVtbl->GetAlphaBlendParams(This,renderingParams,blendGamma,blendEnhancedContrast,blendClearTypeLevel);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteGlyphRunAnalysis_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory interface
+ */
+#ifndef __IDWriteFactory_INTERFACE_DEFINED__
+#define __IDWriteFactory_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory, 0xb859ee5a, 0xd838, 0x4b5b, 0xa2,0xe8, 0x1a,0xdc,0x7d,0x93,0xdb,0x48);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48")
+IDWriteFactory : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontCollection(
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates = FALSE) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomFontCollection(
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterFontCollectionLoader(
+        IDWriteFontCollectionLoader *loader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterFontCollectionLoader(
+        IDWriteFontCollectionLoader *loader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFileReference(
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomFontFileReference(
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateRenderingParams(
+        IDWriteRenderingParams **params) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateMonitorRenderingParams(
+        HMONITOR monitor,
+        IDWriteRenderingParams **params) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomRenderingParams(
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterFontFileLoader(
+        IDWriteFontFileLoader *loader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterFontFileLoader(
+        IDWriteFontFileLoader *loader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateTextFormat(
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateTypography(
+        IDWriteTypography **typography) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGdiInterop(
+        IDWriteGdiInterop **gdi_interop) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateTextLayout(
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateGdiCompatibleTextLayout(
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateEllipsisTrimmingSign(
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateTextAnalyzer(
+        IDWriteTextAnalyzer **analyzer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateNumberSubstitution(
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateGlyphRunAnalysis(
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory, 0xb859ee5a, 0xd838, 0x4b5b, 0xa2,0xe8, 0x1a,0xdc,0x7d,0x93,0xdb,0x48)
+#endif
+#else
+typedef struct IDWriteFactoryVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory *This);
+
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory *This,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    END_INTERFACE
+} IDWriteFactoryVtbl;
+
+interface IDWriteFactory {
+    CONST_VTBL IDWriteFactoryVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory_GetSystemFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetSystemFontCollection(This,collection,check_for_updates)
+#define IDWriteFactory_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory_CreateCustomRenderingParams(This,gamma,enhancedContrast,cleartype_level,geometry,mode,params) (This)->lpVtbl->CreateCustomRenderingParams(This,gamma,enhancedContrast,cleartype_level,geometry,mode,params)
+#define IDWriteFactory_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory_CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format) (This)->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format)
+#define IDWriteFactory_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+#define IDWriteFactory_CreateGlyphRunAnalysis(This,glyph_run,pixels_per_dip,transform,rendering_mode,measuring_mode,baseline_x,baseline_y,analysis) (This)->lpVtbl->CreateGlyphRunAnalysis(This,glyph_run,pixels_per_dip,transform,rendering_mode,measuring_mode,baseline_x,baseline_y,analysis)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory_QueryInterface(IDWriteFactory* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory_AddRef(IDWriteFactory* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory_Release(IDWriteFactory* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory_GetSystemFontCollection(IDWriteFactory* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetSystemFontCollection(This,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateCustomFontCollection(IDWriteFactory* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory_RegisterFontCollectionLoader(IDWriteFactory* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory_UnregisterFontCollectionLoader(IDWriteFactory* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateFontFileReference(IDWriteFactory* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateCustomFontFileReference(IDWriteFactory* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateFontFace(IDWriteFactory* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateRenderingParams(IDWriteFactory* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateMonitorRenderingParams(IDWriteFactory* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateCustomRenderingParams(IDWriteFactory* This,FLOAT gamma,FLOAT enhancedContrast,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY geometry,DWRITE_RENDERING_MODE mode,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateCustomRenderingParams(This,gamma,enhancedContrast,cleartype_level,geometry,mode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory_RegisterFontFileLoader(IDWriteFactory* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory_UnregisterFontFileLoader(IDWriteFactory* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateTextFormat(IDWriteFactory* This,const WCHAR *family_name,IDWriteFontCollection *collection,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STYLE style,DWRITE_FONT_STRETCH stretch,FLOAT size,const WCHAR *locale,IDWriteTextFormat **format) {
+    return This->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateTypography(IDWriteFactory* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory_GetGdiInterop(IDWriteFactory* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateTextLayout(IDWriteFactory* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateGdiCompatibleTextLayout(IDWriteFactory* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateEllipsisTrimmingSign(IDWriteFactory* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateTextAnalyzer(IDWriteFactory* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateNumberSubstitution(IDWriteFactory* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+static FORCEINLINE HRESULT IDWriteFactory_CreateGlyphRunAnalysis(IDWriteFactory* This,const DWRITE_GLYPH_RUN *glyph_run,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE rendering_mode,DWRITE_MEASURING_MODE measuring_mode,FLOAT baseline_x,FLOAT baseline_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->CreateGlyphRunAnalysis(This,glyph_run,pixels_per_dip,transform,rendering_mode,measuring_mode,baseline_x,baseline_y,analysis);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFactory_INTERFACE_DEFINED__ */
+
+HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE,REFIID,IUnknown**);
+#define FACILITY_DWRITE 0x898
+#define DWRITE_ERR_BASE 0x5000
+#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))
+#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
 
-DEFINE_GUID(IID_IDWriteFactory, 0xb859ee5a,0xd838,0x4b5b,0xa2,0xe8,0x1a,0xdc,0x7d,0x93,0xdb,0x48);
-__CRT_UUID_DECL(IDWriteBitmapRenderTarget, 0x5e5a32a3,0x8dff,0x4773,0x9f,0xf6,0x06,0x96,0xea,0xb7,0x72,0x67);
-__CRT_UUID_DECL(IDWriteFactory, 0xb859ee5a,0xd838,0x4b5b,0xa2,0xe8,0x1a,0xdc,0x7d,0x93,0xdb,0x48);
-__CRT_UUID_DECL(IDWriteFont, 0xacd16696,0x8c14,0x4f5d,0x87,0x7e,0xfe,0x3f,0xc1,0xd3,0x27,0x37);
-__CRT_UUID_DECL(IDWriteFontCollection, 0xa84cee02,0x3eea,0x4eee,0xa8,0x27,0x87,0xc1,0xa0,0x2a,0x0f,0xcc);
-__CRT_UUID_DECL(IDWriteFontFace, 0x5f49804d,0x7024,0x4d43,0xbf,0xa9,0xd2,0x59,0x84,0xf5,0x38,0x49);
-__CRT_UUID_DECL(IDWriteFontList, 0x1a0d8438,0x1d97,0x4ec1,0xae,0xf9,0xa2,0xfb,0x86,0xed,0x6a,0xcb);
-__CRT_UUID_DECL(IDWriteFontFamily, 0xda20d8ef,0x812a,0x4c43,0x98,0x02,0x62,0xec,0x4a,0xbd,0x7a,0xdd);
-__CRT_UUID_DECL(IDWriteFontFile, 0x739d886a,0xcef5,0x47dc,0x87,0x69,0x1a,0x8b,0x41,0xbe,0xbb,0xb0);
-__CRT_UUID_DECL(IDWriteFontFileLoader, 0x727cad4e,0xd6af,0x4c9e,0x8a,0x08,0xd6,0x95,0xb1,0x1c,0xaa,0x49);
-__CRT_UUID_DECL(IDWriteFontFileStream, 0x6d4865fe,0x0ab8,0x4d91,0x8f,0x62,0x5d,0xd6,0xbe,0x34,0xa3,0xe0);
-__CRT_UUID_DECL(IDWriteGdiInterop, 0x1edd9491,0x9853,0x4299,0x89,0x8f,0x64,0x32,0x98,0x3b,0x6f,0x3a);
-__CRT_UUID_DECL(IDWriteGlyphRunAnalysis, 0x7d97dbf7,0xe085,0x42d4,0x81,0xe3,0x6a,0x88,0x3b,0xde,0xd1,0x18);
-__CRT_UUID_DECL(IDWriteLocalizedStrings, 0x08256209,0x099a,0x4b34,0xb8,0x6d,0xc2,0x2b,0x11,0x0e,0x77,0x71);
-__CRT_UUID_DECL(IDWriteRenderingParams, 0x2f0da53a,0x2add,0x47cd,0x82,0xee,0xd9,0xec,0x34,0x68,0x8e,0x75);
-__CRT_UUID_DECL(IDWriteTextAnalysisSink, 0x5810cd44,0x0ca0,0x4701,0xb3,0xfa,0xbe,0xc5,0x18,0x2a,0xe4,0xf6);
-__CRT_UUID_DECL(IDWriteTextAnalysisSource, 0x688e1a58,0x5094,0x47c8,0xad,0xc8,0xfb,0xce,0xa6,0x0a,0xe9,0x2b);
-__CRT_UUID_DECL(IDWriteTextAnalyzer, 0xb7e6163e,0x7f46,0x43b4,0x84,0xb3,0xe4,0xe6,0x24,0x9c,0x36,0x5d);
-__CRT_UUID_DECL(IDWritePixelSnapping, 0xeaf3a2da,0xecf4,0x4d24,0xb6,0x44,0xb3,0x4f,0x68,0x42,0x02,0x4b);
-__CRT_UUID_DECL(IDWriteTextRenderer, 0xef8a8135,0x5cc6,0x45fe,0x88,0x25,0xc5,0xa0,0x72,0x4e,0xb8,0x19);
-__CRT_UUID_DECL(IDWriteInlineObject, 0x8339fde3,0x106f,0x47ab,0x83,0x73,0x1c,0x62,0x95,0xeb,0x10,0xb3);
-__CRT_UUID_DECL(IDWriteTextFormat, 0x9c906818,0x31d7,0x4fd3,0xa1,0x51,0x7c,0x5e,0x22,0x5d,0xb5,0x5a);
-__CRT_UUID_DECL(IDWriteTextLayout, 0x53737037,0x6d14,0x410b,0x9b,0xfe,0x0b,0x18,0x2b,0xb7,0x09,0x61);
-__CRT_UUID_DECL(IDWriteFontFileEnumerator, 0x72755049,0x5ff7,0x435d,0x83,0x48,0x4b,0xe9,0x7c,0xfa,0x6c,0x7c);
-__CRT_UUID_DECL(IDWriteFontCollectionLoader, 0xcca920e4,0x52f0,0x492b,0xbf,0xa8,0x29,0xc7,0x2e,0xe0,0xa4,0x68);
-__CRT_UUID_DECL(IDWriteTypography, 0x55f1112b,0x1dc2,0x4b3c,0x95,0x41,0xf4,0x68,0x94,0xed,0x85,0xb6);
-__CRT_UUID_DECL(IDWriteLocalFontFileLoader,0xb2d9f3ec,0xc9fe,0x4a11,0xa2,0xec,0xd8,0x62,0x08,0xf7,0xc0,0xa2);
-
-#endif /* __INC_DWRITE__ */
+#endif /* __dwrite_h__ */
diff --git a/mingw-w64-headers/include/dwrite.idl b/mingw-w64-headers/include/dwrite.idl
new file mode 100644
index 0000000..180dc97
--- /dev/null
+++ b/mingw-w64-headers/include/dwrite.idl
@@ -0,0 +1,1465 @@
+/*
+ * Copyright 2012 Nikolay Sivov for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "unknwn.idl";
+import "dcommon.idl";
+
+interface IDWriteFactory;
+interface IDWriteFontCollection;
+interface IDWriteFontFamily;
+interface IDWriteFontFace;
+interface IDWriteInlineObject;
+
+interface ID2D1SimplifiedGeometrySink;
+typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
+
+cpp_quote("#ifndef _WINDEF_")
+/* already defined in windef.h but needed for WIDL */
+typedef void *HMONITOR;
+cpp_quote("#endif /* _WINDEF_ */")
+
+cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
+cpp_quote("#undef GetGlyphIndices")
+cpp_quote("#endif")
+
+typedef enum DWRITE_FACTORY_TYPE
+{
+    DWRITE_FACTORY_TYPE_SHARED,
+    DWRITE_FACTORY_TYPE_ISOLATED
+} DWRITE_FACTORY_TYPE;
+
+typedef enum DWRITE_FONT_FILE_TYPE
+{
+    DWRITE_FONT_FILE_TYPE_UNKNOWN,
+    DWRITE_FONT_FILE_TYPE_CFF,
+    DWRITE_FONT_FILE_TYPE_TRUETYPE,
+    DWRITE_FONT_FILE_TYPE_OPENTYPE_COLLECTION,
+    DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
+    DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
+    DWRITE_FONT_FILE_TYPE_VECTOR,
+    DWRITE_FONT_FILE_TYPE_BITMAP,
+    DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION = DWRITE_FONT_FILE_TYPE_OPENTYPE_COLLECTION
+} DWRITE_FONT_FILE_TYPE;
+
+typedef enum DWRITE_FONT_FACE_TYPE
+{
+    DWRITE_FONT_FACE_TYPE_CFF,
+    DWRITE_FONT_FACE_TYPE_TRUETYPE,
+    DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION,
+    DWRITE_FONT_FACE_TYPE_TYPE1,
+    DWRITE_FONT_FACE_TYPE_VECTOR,
+    DWRITE_FONT_FACE_TYPE_BITMAP,
+    DWRITE_FONT_FACE_TYPE_UNKNOWN,
+    DWRITE_FONT_FACE_TYPE_RAW_CFF,
+    DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION = DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION
+} DWRITE_FONT_FACE_TYPE;
+
+typedef enum DWRITE_FONT_WEIGHT
+{
+    DWRITE_FONT_WEIGHT_THIN = 100,
+    DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
+    DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
+    DWRITE_FONT_WEIGHT_LIGHT = 300,
+    DWRITE_FONT_WEIGHT_SEMI_LIGHT = 350,
+    DWRITE_FONT_WEIGHT_NORMAL = 400,
+    DWRITE_FONT_WEIGHT_REGULAR = 400,
+    DWRITE_FONT_WEIGHT_MEDIUM = 500,
+    DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
+    DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
+    DWRITE_FONT_WEIGHT_BOLD = 700,
+    DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
+    DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
+    DWRITE_FONT_WEIGHT_BLACK = 900,
+    DWRITE_FONT_WEIGHT_HEAVY = 900,
+    DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
+    DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
+} DWRITE_FONT_WEIGHT;
+
+typedef enum DWRITE_FONT_STRETCH
+{
+    DWRITE_FONT_STRETCH_UNDEFINED = 0,
+    DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
+    DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
+    DWRITE_FONT_STRETCH_CONDENSED = 3,
+    DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
+    DWRITE_FONT_STRETCH_NORMAL = 5,
+    DWRITE_FONT_STRETCH_MEDIUM = 5,
+    DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
+    DWRITE_FONT_STRETCH_EXPANDED = 7,
+    DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
+    DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
+} DWRITE_FONT_STRETCH;
+
+typedef enum DWRITE_FONT_STYLE
+{
+    DWRITE_FONT_STYLE_NORMAL,
+    DWRITE_FONT_STYLE_OBLIQUE,
+    DWRITE_FONT_STYLE_ITALIC
+} DWRITE_FONT_STYLE;
+
+typedef enum DWRITE_INFORMATIONAL_STRING_ID
+{
+    DWRITE_INFORMATIONAL_STRING_NONE,
+    DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
+    DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
+    DWRITE_INFORMATIONAL_STRING_TRADEMARK,
+    DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
+    DWRITE_INFORMATIONAL_STRING_DESIGNER,
+    DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
+    DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
+    DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
+    DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
+    DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
+    DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_FAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_SUBFAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT,
+    DWRITE_INFORMATIONAL_STRING_FULL_NAME,
+    DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME,
+    DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME,
+    DWRITE_INFORMATIONAL_STRING_WEIGHT_STRETCH_STYLE_FAMILY_NAME,
+    DWRITE_INFORMATIONAL_STRING_DESIGN_SCRIPT_LANGUAGE_TAG,
+    DWRITE_INFORMATIONAL_STRING_SUPPORTED_SCRIPT_LANGUAGE_TAG,
+    DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES = DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_FAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES = DWRITE_INFORMATIONAL_STRING_TYPOGRAPHIC_SUBFAMILY_NAMES,
+    DWRITE_INFORMATIONAL_STRING_WWS_FAMILY_NAME = DWRITE_INFORMATIONAL_STRING_WEIGHT_STRETCH_STYLE_FAMILY_NAME,
+} DWRITE_INFORMATIONAL_STRING_ID;
+
+typedef enum DWRITE_FONT_SIMULATIONS
+{
+    DWRITE_FONT_SIMULATIONS_NONE,
+    DWRITE_FONT_SIMULATIONS_BOLD,
+    DWRITE_FONT_SIMULATIONS_OBLIQUE
+} DWRITE_FONT_SIMULATIONS;
+
+cpp_quote("#ifdef DEFINE_ENUM_FLAG_OPERATORS")
+cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);")
+cpp_quote("#endif")
+
+typedef enum DWRITE_PIXEL_GEOMETRY
+{
+    DWRITE_PIXEL_GEOMETRY_FLAT,
+    DWRITE_PIXEL_GEOMETRY_RGB,
+    DWRITE_PIXEL_GEOMETRY_BGR
+} DWRITE_PIXEL_GEOMETRY;
+
+typedef enum DWRITE_RENDERING_MODE
+{
+    DWRITE_RENDERING_MODE_DEFAULT,
+    DWRITE_RENDERING_MODE_ALIASED,
+    DWRITE_RENDERING_MODE_GDI_CLASSIC,
+    DWRITE_RENDERING_MODE_GDI_NATURAL,
+    DWRITE_RENDERING_MODE_NATURAL,
+    DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
+    DWRITE_RENDERING_MODE_OUTLINE,
+    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC = DWRITE_RENDERING_MODE_GDI_CLASSIC,
+    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL = DWRITE_RENDERING_MODE_GDI_NATURAL,
+    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL = DWRITE_RENDERING_MODE_NATURAL,
+    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC
+} DWRITE_RENDERING_MODE;
+
+typedef enum DWRITE_TEXT_ALIGNMENT
+{
+    DWRITE_TEXT_ALIGNMENT_LEADING,
+    DWRITE_TEXT_ALIGNMENT_TRAILING,
+    DWRITE_TEXT_ALIGNMENT_CENTER,
+    DWRITE_TEXT_ALIGNMENT_JUSTIFIED
+} DWRITE_TEXT_ALIGNMENT;
+
+typedef enum DWRITE_PARAGRAPH_ALIGNMENT
+{
+    DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
+    DWRITE_PARAGRAPH_ALIGNMENT_FAR,
+    DWRITE_PARAGRAPH_ALIGNMENT_CENTER
+} DWRITE_PARAGRAPH_ALIGNMENT;
+
+typedef enum DWRITE_WORD_WRAPPING
+{
+    DWRITE_WORD_WRAPPING_WRAP,
+    DWRITE_WORD_WRAPPING_NO_WRAP,
+    DWRITE_WORD_WRAPPING_EMERGENCY_BREAK,
+    DWRITE_WORD_WRAPPING_WHOLE_WORD,
+    DWRITE_WORD_WRAPPING_CHARACTER
+} DWRITE_WORD_WRAPPING;
+
+typedef enum DWRITE_READING_DIRECTION
+{
+    DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,
+    DWRITE_READING_DIRECTION_RIGHT_TO_LEFT,
+    DWRITE_READING_DIRECTION_TOP_TO_BOTTOM,
+    DWRITE_READING_DIRECTION_BOTTOM_TO_TOP
+} DWRITE_READING_DIRECTION;
+
+typedef enum DWRITE_FLOW_DIRECTION
+{
+    DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM,
+    DWRITE_FLOW_DIRECTION_BOTTOM_TO_TOP,
+    DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT,
+    DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT
+} DWRITE_FLOW_DIRECTION;
+
+typedef enum DWRITE_TRIMMING_GRANULARITY
+{
+    DWRITE_TRIMMING_GRANULARITY_NONE,
+    DWRITE_TRIMMING_GRANULARITY_CHARACTER,
+    DWRITE_TRIMMING_GRANULARITY_WORD
+} DWRITE_TRIMMING_GRANULARITY;
+
+typedef enum DWRITE_BREAK_CONDITION
+{
+    DWRITE_BREAK_CONDITION_NEUTRAL,
+    DWRITE_BREAK_CONDITION_CAN_BREAK,
+    DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
+    DWRITE_BREAK_CONDITION_MUST_BREAK
+} DWRITE_BREAK_CONDITION;
+
+typedef enum DWRITE_LINE_SPACING_METHOD
+{
+    DWRITE_LINE_SPACING_METHOD_DEFAULT,
+    DWRITE_LINE_SPACING_METHOD_UNIFORM,
+    DWRITE_LINE_SPACING_METHOD_PROPORTIONAL
+} DWRITE_LINE_SPACING_METHOD;
+
+cpp_quote("#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \\")
+cpp_quote("    ((UINT32)(UINT8)(d) << 24) | \\")
+cpp_quote("    ((UINT32)(UINT8)(c) << 16) | \\")
+cpp_quote("    ((UINT32)(UINT8)(b) <<  8) | \\")
+cpp_quote("     (UINT32)(UINT8)(a))")
+
+typedef enum DWRITE_FONT_FEATURE_TAG
+{
+    DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS           = 0x63726661, /* 'afrc' */
+    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS   = 0x63703263, /* 'c2pc' */
+    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS    = 0x63733263, /* 'c2sc' */
+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES           = 0x746c6163, /* 'calt' */
+    DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS            = 0x65736163, /* 'case' */
+    DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, /* 'ccmp' */
+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES            = 0x67696c63, /* 'clig' */
+    DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING                 = 0x70737063, /* 'cpsp' */
+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH                = 0x68777363, /* 'cswh' */
+    DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING             = 0x73727563, /* 'curs' */
+    DWRITE_FONT_FEATURE_TAG_DEFAULT                         = 0x746c6664, /* 'dflt' */
+    DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES         = 0x67696c64, /* 'dlig' */
+    DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS                    = 0x74707865, /* 'expt' */
+    DWRITE_FONT_FEATURE_TAG_FRACTIONS                       = 0x63617266, /* 'frac' */
+    DWRITE_FONT_FEATURE_TAG_FULL_WIDTH                      = 0x64697766, /* 'fwid' */
+    DWRITE_FONT_FEATURE_TAG_HALF_FORMS                      = 0x666c6168, /* 'half' */
+    DWRITE_FONT_FEATURE_TAG_HALANT_FORMS                    = 0x6e6c6168, /* 'haln' */
+    DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH            = 0x746c6168, /* 'halt' */
+    DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS                = 0x74736968, /* 'hist' */
+    DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES      = 0x616e6b68, /* 'hkna' */
+    DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES            = 0x67696c68, /* 'hlig' */
+    DWRITE_FONT_FEATURE_TAG_HALF_WIDTH                      = 0x64697768, /* 'hwid' */
+    DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS                = 0x6f6a6f68, /* 'hojo' */
+    DWRITE_FONT_FEATURE_TAG_JIS04_FORMS                     = 0x3430706a, /* 'jp04' */
+    DWRITE_FONT_FEATURE_TAG_JIS78_FORMS                     = 0x3837706a, /* 'jp78' */
+    DWRITE_FONT_FEATURE_TAG_JIS83_FORMS                     = 0x3338706a, /* 'jp83' */
+    DWRITE_FONT_FEATURE_TAG_JIS90_FORMS                     = 0x3039706a, /* 'jp90' */
+    DWRITE_FONT_FEATURE_TAG_KERNING                         = 0x6e72656b, /* 'kern' */
+    DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES              = 0x6167696c, /* 'liga' */
+    DWRITE_FONT_FEATURE_TAG_LINING_FIGURES                  = 0x6d756e6c, /* 'lnum' */
+    DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS                 = 0x6c636f6c, /* 'locl' */
+    DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING                = 0x6b72616d, /* 'mark' */
+    DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK              = 0x6b72676d, /* 'mgrk' */
+    DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING        = 0x6b6d6b6d, /* 'mkmk' */
+    DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS      = 0x746c616e, /* 'nalt' */
+    DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS                 = 0x6b636c6e, /* 'nlck' */
+    DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES               = 0x6d756e6f, /* 'onum' */
+    DWRITE_FONT_FEATURE_TAG_ORDINALS                        = 0x6e64726f, /* 'ordn' */
+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH    = 0x746c6170, /* 'palt' */
+    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS                 = 0x70616370, /* 'pcap' */
+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES            = 0x6d756e70, /* 'pnum' */
+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS             = 0x64697770, /* 'pwid' */
+    DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS                  = 0x64697771, /* 'qwid' */
+    DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES              = 0x67696c72, /* 'rlig' */
+    DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS             = 0x79627572, /* 'ruby' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES            = 0x746c6173, /* 'salt' */
+    DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS            = 0x666e6973, /* 'sinf' */
+    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS                  = 0x70636d73, /* 'smcp' */
+    DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS                = 0x6c706d73, /* 'smpl' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1                 = 0x31307373, /* 'ss01' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2                 = 0x32307373, /* 'ss02' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3                 = 0x33307373, /* 'ss03' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4                 = 0x34307373, /* 'ss04' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5                 = 0x35307373, /* 'ss05' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6                 = 0x36307373, /* 'ss06' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7                 = 0x37307373, /* 'ss07' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8                 = 0x38307373, /* 'ss08' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9                 = 0x39307373, /* 'ss09' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10                = 0x30317373, /* 'ss10' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11                = 0x31317373, /* 'ss11' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12                = 0x32317373, /* 'ss12' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13                = 0x33317373, /* 'ss13' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14                = 0x34317373, /* 'ss14' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15                = 0x35317373, /* 'ss15' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16                = 0x36317373, /* 'ss16' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17                = 0x37317373, /* 'ss17' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18                = 0x38317373, /* 'ss18' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19                = 0x39317373, /* 'ss19' */
+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20                = 0x30327373, /* 'ss20' */
+    DWRITE_FONT_FEATURE_TAG_SUBSCRIPT                       = 0x73627573, /* 'subs' */
+    DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT                     = 0x73707573, /* 'sups' */
+    DWRITE_FONT_FEATURE_TAG_SWASH                           = 0x68737773, /* 'swsh' */
+    DWRITE_FONT_FEATURE_TAG_TITLING                         = 0x6c746974, /* 'titl' */
+    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS          = 0x6d616e74, /* 'tnam' */
+    DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES                 = 0x6d756e74, /* 'tnum' */
+    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS               = 0x64617274, /* 'trad' */
+    DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS                    = 0x64697774, /* 'twid' */
+    DWRITE_FONT_FEATURE_TAG_UNICASE                         = 0x63696e75, /* 'unic' */
+    DWRITE_FONT_FEATURE_TAG_VERTICAL_WRITING                = 0x74726576, /* 'vert' */
+    DWRITE_FONT_FEATURE_TAG_VERTICAL_ALTERNATES_AND_ROTATION= 0x32747276, /* 'vrt2' */
+    DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO                    = 0x6f72657a, /* 'zero' */
+} DWRITE_FONT_FEATURE_TAG;
+
+typedef enum DWRITE_SCRIPT_SHAPES
+{
+    DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
+    DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
+} DWRITE_SCRIPT_SHAPES;
+
+typedef enum DWRITE_NUMBER_SUBSTITUTION_METHOD
+{
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
+    DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
+} DWRITE_NUMBER_SUBSTITUTION_METHOD;
+
+cpp_quote("#define DWRITE_ALPHA_MAX 255")
+
+typedef enum DWRITE_TEXTURE_TYPE
+{
+    DWRITE_TEXTURE_ALIASED_1x1,
+    DWRITE_TEXTURE_CLEARTYPE_3x1
+} DWRITE_TEXTURE_TYPE;
+
+typedef struct DWRITE_FONT_METRICS
+{
+    UINT16 designUnitsPerEm;
+    UINT16 ascent;
+    UINT16 descent;
+    INT16 lineGap;
+    UINT16 capHeight;
+    UINT16 xHeight;
+    INT16 underlinePosition;
+    UINT16 underlineThickness;
+    INT16 strikethroughPosition;
+    UINT16 strikethroughThickness;
+} DWRITE_FONT_METRICS;
+
+typedef struct DWRITE_GLYPH_METRICS
+{
+    INT32 leftSideBearing;
+    UINT32 advanceWidth;
+    INT32 rightSideBearing;
+    INT32 topSideBearing;
+    UINT32 advanceHeight;
+    INT32 bottomSideBearing;
+    INT32 verticalOriginY;
+} DWRITE_GLYPH_METRICS;
+
+typedef struct DWRITE_GLYPH_OFFSET
+{
+    FLOAT advanceOffset;
+    FLOAT ascenderOffset;
+} DWRITE_GLYPH_OFFSET;
+
+typedef struct DWRITE_MATRIX
+{
+    FLOAT m11;
+    FLOAT m12;
+    FLOAT m21;
+    FLOAT m22;
+    FLOAT dx;
+    FLOAT dy;
+} DWRITE_MATRIX;
+
+typedef struct DWRITE_TRIMMING
+{
+    DWRITE_TRIMMING_GRANULARITY granularity;
+    UINT32 delimiter;
+    UINT32 delimiterCount;
+} DWRITE_TRIMMING;
+
+cpp_quote("#ifndef __d2d1_h__")
+typedef struct DWRITE_GLYPH_RUN DWRITE_GLYPH_RUN;
+cpp_quote("#endif /* __d2d1_h__ */")
+
+struct DWRITE_GLYPH_RUN
+{
+    IDWriteFontFace* fontFace;
+    FLOAT fontEmSize;
+    UINT32 glyphCount;
+    UINT16 const* glyphIndices;
+    FLOAT const* glyphAdvances;
+    DWRITE_GLYPH_OFFSET const* glyphOffsets;
+    BOOL isSideways;
+    UINT32 bidiLevel;
+};
+
+cpp_quote("#ifndef __d2d1_1_h__")
+typedef struct DWRITE_GLYPH_RUN_DESCRIPTION DWRITE_GLYPH_RUN_DESCRIPTION;
+cpp_quote("#endif /* __d2d1_1_h__ */")
+
+struct DWRITE_GLYPH_RUN_DESCRIPTION
+{
+    WCHAR const* localeName;
+    WCHAR const* string;
+    UINT32 stringLength;
+    UINT16 const* clusterMap;
+    UINT32 textPosition;
+};
+
+typedef struct DWRITE_UNDERLINE
+{
+    FLOAT width;
+    FLOAT thickness;
+    FLOAT offset;
+    FLOAT runHeight;
+    DWRITE_READING_DIRECTION readingDirection;
+    DWRITE_FLOW_DIRECTION flowDirection;
+    WCHAR const* localeName;
+    DWRITE_MEASURING_MODE measuringMode;
+} DWRITE_UNDERLINE;
+
+typedef struct DWRITE_STRIKETHROUGH
+{
+    FLOAT width;
+    FLOAT thickness;
+    FLOAT offset;
+    DWRITE_READING_DIRECTION readingDirection;
+    DWRITE_FLOW_DIRECTION flowDirection;
+    WCHAR const* localeName;
+    DWRITE_MEASURING_MODE measuringMode;
+} DWRITE_STRIKETHROUGH;
+
+typedef struct DWRITE_INLINE_OBJECT_METRICS
+{
+    FLOAT width;
+    FLOAT height;
+    FLOAT baseline;
+    BOOL  supportsSideways;
+} DWRITE_INLINE_OBJECT_METRICS;
+
+typedef struct DWRITE_OVERHANG_METRICS
+{
+    FLOAT left;
+    FLOAT top;
+    FLOAT right;
+    FLOAT bottom;
+} DWRITE_OVERHANG_METRICS;
+
+typedef struct DWRITE_FONT_FEATURE
+{
+    DWRITE_FONT_FEATURE_TAG nameTag;
+    UINT32 parameter;
+} DWRITE_FONT_FEATURE;
+
+typedef struct DWRITE_TEXT_RANGE
+{
+    UINT32 startPosition;
+    UINT32 length;
+} DWRITE_TEXT_RANGE;
+
+typedef struct DWRITE_LINE_METRICS
+{
+    UINT32 length;
+    UINT32 trailingWhitespaceLength;
+    UINT32 newlineLength;
+    FLOAT height;
+    FLOAT baseline;
+    BOOL isTrimmed;
+} DWRITE_LINE_METRICS;
+
+typedef struct DWRITE_TEXT_METRICS
+{
+    FLOAT left;
+    FLOAT top;
+    FLOAT width;
+    FLOAT widthIncludingTrailingWhitespace;
+    FLOAT height;
+    FLOAT layoutWidth;
+    FLOAT layoutHeight;
+    UINT32 maxBidiReorderingDepth;
+    UINT32 lineCount;
+} DWRITE_TEXT_METRICS;
+
+typedef struct DWRITE_CLUSTER_METRICS
+{
+    FLOAT width;
+    UINT16 length;
+    UINT16 canWrapLineAfter : 1;
+    UINT16 isWhitespace : 1;
+    UINT16 isNewline : 1;
+    UINT16 isSoftHyphen : 1;
+    UINT16 isRightToLeft : 1;
+    UINT16 padding : 11;
+} DWRITE_CLUSTER_METRICS;
+
+typedef struct DWRITE_HIT_TEST_METRICS
+{
+    UINT32 textPosition;
+    UINT32 length;
+    FLOAT left;
+    FLOAT top;
+    FLOAT width;
+    FLOAT height;
+    UINT32 bidiLevel;
+    BOOL isText;
+    BOOL isTrimmed;
+} DWRITE_HIT_TEST_METRICS;
+
+typedef struct DWRITE_SCRIPT_ANALYSIS
+{
+    UINT16 script;
+    DWRITE_SCRIPT_SHAPES shapes;
+} DWRITE_SCRIPT_ANALYSIS;
+
+typedef struct DWRITE_LINE_BREAKPOINT
+{
+    UINT8 breakConditionBefore : 2;
+    UINT8 breakConditionAfter : 2;
+    UINT8 isWhitespace : 1;
+    UINT8 isSoftHyphen : 1;
+    UINT8 padding : 2;
+} DWRITE_LINE_BREAKPOINT;
+
+typedef struct DWRITE_TYPOGRAPHIC_FEATURES
+{
+    DWRITE_FONT_FEATURE* features;
+    UINT32 featureCount;
+} DWRITE_TYPOGRAPHIC_FEATURES;
+
+typedef struct DWRITE_SHAPING_TEXT_PROPERTIES
+{
+    UINT16 isShapedAlone : 1;
+    UINT16 reserved1 : 1;
+    UINT16 canBreakShapingAfter : 1;
+    UINT16 reserved : 13;
+} DWRITE_SHAPING_TEXT_PROPERTIES;
+
+typedef struct DWRITE_SHAPING_GLYPH_PROPERTIES
+{
+    UINT16 justification : 4;
+    UINT16 isClusterStart : 1;
+    UINT16 isDiacritic : 1;
+    UINT16 isZeroWidthSpace : 1;
+    UINT16 reserved : 9;
+} DWRITE_SHAPING_GLYPH_PROPERTIES;
+
+[
+local,
+object,
+uuid(6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0)
+]
+interface IDWriteFontFileStream : IUnknown
+{
+    HRESULT ReadFileFragment(
+        void const **fragment_start,
+        UINT64 offset,
+        UINT64 fragment_size,
+        void **fragment_context);
+
+    void ReleaseFileFragment(void *fragment_context);
+    HRESULT GetFileSize(UINT64 *size);
+    HRESULT GetLastWriteTime(UINT64 *last_writetime);
+}
+
+[
+local,
+object,
+uuid(727cad4e-d6af-4c9e-8a08-d695b11caa49)
+]
+interface IDWriteFontFileLoader : IUnknown
+{
+    HRESULT CreateStreamFromKey(
+        void const *key,
+        UINT32 key_size,
+        IDWriteFontFileStream **stream);
+}
+
+[
+local,
+object,
+uuid(b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2)
+]
+interface IDWriteLocalFontFileLoader : IDWriteFontFileLoader
+{
+    HRESULT GetFilePathLengthFromKey(void const *key, UINT32 key_size, UINT32 *length);
+    HRESULT GetFilePathFromKey(void const *key, UINT32 key_size, WCHAR *path, UINT32 length);
+    HRESULT GetLastWriteTimeFromKey(void const *key, UINT32 key_size, FILETIME *writetime);
+}
+
+[
+local,
+object,
+uuid(739d886a-cef5-47dc-8769-1a8b41bebbb0)
+]
+interface IDWriteFontFile : IUnknown
+{
+    HRESULT GetReferenceKey(
+        void const **key,
+        UINT32 *key_size);
+
+    HRESULT GetLoader(IDWriteFontFileLoader **loader);
+
+    HRESULT Analyze(
+        BOOL *is_supported_fonttype,
+        DWRITE_FONT_FILE_TYPE *file_type,
+        DWRITE_FONT_FACE_TYPE *face_type,
+        UINT32 *faces_num);
+}
+
+[
+local,
+object,
+uuid(72755049-5ff7-435d-8348-4be97cfa6c7c)
+]
+interface IDWriteFontFileEnumerator : IUnknown
+{
+    HRESULT MoveNext(BOOL *has_current_file);
+    HRESULT GetCurrentFontFile(IDWriteFontFile **font_file);
+}
+
+[
+local,
+object,
+uuid(cca920e4-52f0-492b-bfa8-29c72ee0a468)
+]
+interface IDWriteFontCollectionLoader : IUnknown
+{
+    HRESULT CreateEnumeratorFromKey(
+        IDWriteFactory* factory,
+        void const* key,
+        UINT32 key_size,
+        IDWriteFontFileEnumerator **enumerator);
+}
+
+[
+local,
+object,
+uuid(08256209-099a-4b34-b86d-c22b110e7771)
+]
+interface IDWriteLocalizedStrings : IUnknown
+{
+    UINT32 GetCount();
+
+    HRESULT FindLocaleName(
+        WCHAR const *locale_name,
+        UINT32 *index,
+        BOOL *exists);
+
+    HRESULT GetLocaleNameLength(UINT32 index, UINT32 *length);
+    HRESULT GetLocaleName(UINT32 index, WCHAR *locale_name, UINT32 size);
+    HRESULT GetStringLength(UINT32 index, UINT32 *length);
+    HRESULT GetString(UINT32 index, WCHAR *buffer, UINT32 size);
+}
+
+[
+local,
+object,
+uuid(2f0da53a-2add-47cd-82ee-d9ec34688e75)
+]
+interface IDWriteRenderingParams : IUnknown
+{
+    FLOAT GetGamma();
+    FLOAT GetEnhancedContrast();
+    FLOAT GetClearTypeLevel();
+    DWRITE_PIXEL_GEOMETRY GetPixelGeometry();
+    DWRITE_RENDERING_MODE GetRenderingMode();
+}
+
+[
+local,
+object,
+uuid(5f49804d-7024-4d43-bfa9-d25984f53849)
+]
+interface IDWriteFontFace : IUnknown
+{
+    DWRITE_FONT_FACE_TYPE GetType();
+    HRESULT GetFiles(UINT32 *number_of_files, IDWriteFontFile **fontfiles);
+    UINT32 GetIndex();
+    DWRITE_FONT_SIMULATIONS GetSimulations();
+    BOOL IsSymbolFont();
+    void GetMetrics(DWRITE_FONT_METRICS *metrics);
+    UINT16 GetGlyphCount();
+
+    HRESULT GetDesignGlyphMetrics(
+        UINT16 const *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        [defaultvalue(FALSE)] BOOL is_sideways);
+
+    HRESULT GetGlyphIndices(
+        UINT32 const *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT TryGetFontTable(
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        BOOL *exists);
+
+    void ReleaseFontTable(void *table_context);
+
+    HRESULT GetGlyphRunOutline(
+        FLOAT emSize,
+        UINT16 const *glyph_indices,
+        FLOAT const* glyph_advances,
+        DWRITE_GLYPH_OFFSET const *glyph_offsets,
+        UINT32 glyph_count,
+        BOOL is_sideways,
+        BOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
+
+    HRESULT GetRecommendedRenderingMode(
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams* params,
+        DWRITE_RENDERING_MODE* rendering_mode);
+
+    HRESULT GetGdiCompatibleMetrics(
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MATRIX const *transform,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT GetGdiCompatibleGlyphMetrics(
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MATRIX const *transform,
+        BOOL use_gdi_natural,
+        UINT16 const *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        [defaultvalue(FALSE)] BOOL is_sideways);
+}
+
+[
+local,
+object,
+uuid(acd16696-8c14-4f5d-877e-fe3fc1d32737)
+]
+interface IDWriteFont : IUnknown
+{
+    HRESULT GetFontFamily(IDWriteFontFamily **family);
+    DWRITE_FONT_WEIGHT GetWeight();
+    DWRITE_FONT_STRETCH GetStretch();
+    DWRITE_FONT_STYLE GetStyle();
+    BOOL IsSymbolFont();
+
+    HRESULT GetFaceNames(IDWriteLocalizedStrings **names);
+    HRESULT GetInformationalStrings(
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        BOOL *exists);
+
+    DWRITE_FONT_SIMULATIONS GetSimulations();
+    void GetMetrics(DWRITE_FONT_METRICS *metrics);
+    HRESULT HasCharacter(UINT32 value, BOOL *exists);
+    HRESULT CreateFontFace(IDWriteFontFace **face);
+}
+
+[
+local,
+object,
+uuid(1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb)
+]
+interface IDWriteFontList : IUnknown
+{
+    HRESULT GetFontCollection(IDWriteFontCollection **collection);
+    UINT32 GetFontCount();
+    HRESULT GetFont(UINT32 index, IDWriteFont **font);
+}
+
+[
+local,
+object,
+uuid(da20d8ef-812a-4c43-9802-62ec4abd7add)
+]
+interface IDWriteFontFamily : IDWriteFontList
+{
+    HRESULT GetFamilyNames(IDWriteLocalizedStrings **names);
+
+    HRESULT GetFirstMatchingFont(
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFont **font);
+
+    HRESULT GetMatchingFonts(
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontList **fonts);
+}
+
+[
+local,
+object,
+uuid(a84cee02-3eea-4eee-a827-87c1a02a0fcc)
+]
+interface IDWriteFontCollection : IUnknown
+{
+    UINT32 GetFontFamilyCount();
+    HRESULT GetFontFamily(UINT32 index, IDWriteFontFamily **family);
+    HRESULT FindFamilyName(WCHAR const *name, UINT32 *index, BOOL *exists);
+    HRESULT GetFontFromFontFace(IDWriteFontFace *face, IDWriteFont **font);
+}
+
+[
+local,
+object,
+uuid(eaf3a2da-ecf4-4d24-b644-b34f6842024b)
+]
+interface IDWritePixelSnapping : IUnknown
+{
+    HRESULT IsPixelSnappingDisabled(
+        void *client_drawingcontext,
+        BOOL *disabled);
+
+    HRESULT GetCurrentTransform(
+        void *client_drawingcontext,
+        DWRITE_MATRIX *transform);
+
+    HRESULT GetPixelsPerDip(
+        void *client_drawingcontext,
+        FLOAT *pixels_per_dip);
+}
+
+[
+local,
+object,
+uuid(ef8a8135-5cc6-45fe-8825-c5a0724eb819)
+]
+interface IDWriteTextRenderer : IDWritePixelSnapping
+{
+    HRESULT DrawGlyphRun(
+        void* client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE mode,
+        DWRITE_GLYPH_RUN const *glyph_run,
+        DWRITE_GLYPH_RUN_DESCRIPTION const *run_descr,
+        IUnknown *drawing_effect);
+
+    HRESULT DrawUnderline(
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_UNDERLINE const* underline,
+        IUnknown *drawing_effect);
+
+    HRESULT DrawStrikethrough(
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_STRIKETHROUGH const* strikethrough,
+        IUnknown *drawing_effect);
+
+    HRESULT DrawInlineObject(
+        void *client_drawingcontext,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteInlineObject *object,
+        BOOL is_sideways,
+        BOOL is_rtl,
+        IUnknown *drawing_effect);
+}
+
+[
+local,
+object,
+uuid(8339fde3-106f-47ab-8373-1c6295eb10b3)
+]
+interface IDWriteInlineObject : IUnknown
+{
+    HRESULT Draw(
+        void* client_drawingontext,
+        IDWriteTextRenderer* renderer,
+        FLOAT originX,
+        FLOAT originY,
+        BOOL is_sideways,
+        BOOL is_rtl,
+        IUnknown *drawing_effect);
+
+    HRESULT GetMetrics(DWRITE_INLINE_OBJECT_METRICS *metrics);
+    HRESULT GetOverhangMetrics(DWRITE_OVERHANG_METRICS *overhangs);
+    HRESULT GetBreakConditions(
+        DWRITE_BREAK_CONDITION* condition_before,
+        DWRITE_BREAK_CONDITION* condition_after);
+}
+
+[
+local,
+object,
+uuid(9c906818-31d7-4fd3-a151-7c5e225db55a)
+]
+interface IDWriteTextFormat : IUnknown
+{
+    HRESULT SetTextAlignment(DWRITE_TEXT_ALIGNMENT alignment);
+    HRESULT SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT alignment);
+    HRESULT SetWordWrapping(DWRITE_WORD_WRAPPING wrapping);
+    HRESULT SetReadingDirection(DWRITE_READING_DIRECTION direction);
+    HRESULT SetFlowDirection(DWRITE_FLOW_DIRECTION direction);
+    HRESULT SetIncrementalTabStop(FLOAT tabstop);
+    HRESULT SetTrimming(DWRITE_TRIMMING const *trimming, IDWriteInlineObject *trimming_sign);
+    HRESULT SetLineSpacing(DWRITE_LINE_SPACING_METHOD spacing, FLOAT line_spacing, FLOAT baseline);
+    DWRITE_TEXT_ALIGNMENT GetTextAlignment();
+    DWRITE_PARAGRAPH_ALIGNMENT GetParagraphAlignment();
+    DWRITE_WORD_WRAPPING GetWordWrapping();
+    DWRITE_READING_DIRECTION GetReadingDirection();
+    DWRITE_FLOW_DIRECTION GetFlowDirection();
+    FLOAT GetIncrementalTabStop();
+    HRESULT GetTrimming(DWRITE_TRIMMING *options, IDWriteInlineObject **trimming_sign);
+
+    HRESULT GetLineSpacing(
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT GetFontCollection(IDWriteFontCollection **collection);
+    UINT32 GetFontFamilyNameLength();
+    HRESULT GetFontFamilyName(WCHAR *name, UINT32 size);
+    DWRITE_FONT_WEIGHT GetFontWeight();
+    DWRITE_FONT_STYLE GetFontStyle();
+    DWRITE_FONT_STRETCH GetFontStretch();
+    FLOAT GetFontSize();
+    UINT32 GetLocaleNameLength();
+    HRESULT GetLocaleName(WCHAR *name, UINT32 size);
+}
+
+[
+local,
+object,
+uuid(55f1112b-1dc2-4b3c-9541-f46894ed85b6)
+]
+interface IDWriteTypography : IUnknown
+{
+    HRESULT AddFontFeature(DWRITE_FONT_FEATURE feature);
+    UINT32 GetFontFeatureCount();
+    HRESULT GetFontFeature(UINT32 index, DWRITE_FONT_FEATURE *feature);
+}
+
+[
+local,
+object,
+uuid(5e5a32a3-8dff-4773-9ff6-0696eab77267)
+]
+interface IDWriteBitmapRenderTarget : IUnknown
+{
+    HRESULT DrawGlyphRun(
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GLYPH_RUN const* glyph_run,
+        IDWriteRenderingParams* params,
+        COLORREF textColor,
+        [defaultvalue(NULL)] RECT *blackbox_rect);
+
+    HDC GetMemoryDC();
+    FLOAT GetPixelsPerDip();
+    HRESULT SetPixelsPerDip(FLOAT pixels_per_dip);
+    HRESULT GetCurrentTransform(DWRITE_MATRIX *transform);
+    HRESULT SetCurrentTransform(DWRITE_MATRIX const *transform);
+    HRESULT GetSize(SIZE *size);
+    HRESULT Resize(UINT32 width, UINT32 height);
+}
+
+cpp_quote("#ifndef _WINGDI_")
+/* already defined in wingdi.h but needed for WIDL */
+#define LF_FACESIZE     32
+
+    typedef struct tagLOGFONTW
+    {
+        LONG   lfHeight;
+        LONG   lfWidth;
+        LONG   lfEscapement;
+        LONG   lfOrientation;
+        LONG   lfWeight;
+        BYTE   lfItalic;
+        BYTE   lfUnderline;
+        BYTE   lfStrikeOut;
+        BYTE   lfCharSet;
+        BYTE   lfOutPrecision;
+        BYTE   lfClipPrecision;
+        BYTE   lfQuality;
+        BYTE   lfPitchAndFamily;
+        WCHAR  lfFaceName[LF_FACESIZE];
+    } LOGFONTW, *PLOGFONTW, *LPLOGFONTW;
+cpp_quote("#endif /* _WINGDI_ */")
+
+[
+local,
+object,
+uuid(1edd9491-9853-4299-898f-6432983b6f3a)
+]
+interface IDWriteGdiInterop : IUnknown
+{
+    HRESULT CreateFontFromLOGFONT(LOGFONTW const *logfont, IDWriteFont **font);
+    HRESULT ConvertFontToLOGFONT(
+        IDWriteFont* font,
+        LOGFONTW* logfont,
+        BOOL *is_systemfont);
+
+    HRESULT ConvertFontFaceToLOGFONT(IDWriteFontFace* font, LOGFONTW* logfont);
+    HRESULT CreateFontFaceFromHdc(HDC hdc, IDWriteFontFace **fontface);
+    HRESULT CreateBitmapRenderTarget(HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **target);
+}
+
+[
+local,
+object,
+uuid(53737037-6d14-410b-9bfe-0b182bb70961)
+]
+interface IDWriteTextLayout : IDWriteTextFormat
+{
+    HRESULT SetMaxWidth(FLOAT maxWidth);
+    HRESULT SetMaxHeight(FLOAT maxHeight);
+    HRESULT SetFontCollection(IDWriteFontCollection* collection, DWRITE_TEXT_RANGE range);
+    HRESULT SetFontFamilyName(WCHAR const *name, DWRITE_TEXT_RANGE range);
+    HRESULT SetFontWeight(DWRITE_FONT_WEIGHT weight, DWRITE_TEXT_RANGE range);
+    HRESULT SetFontStyle(DWRITE_FONT_STYLE style, DWRITE_TEXT_RANGE range);
+    HRESULT SetFontStretch(DWRITE_FONT_STRETCH stretch, DWRITE_TEXT_RANGE range);
+    HRESULT SetFontSize(FLOAT size, DWRITE_TEXT_RANGE range);
+    HRESULT SetUnderline(BOOL underline, DWRITE_TEXT_RANGE range);
+    HRESULT SetStrikethrough(BOOL strikethrough, DWRITE_TEXT_RANGE range);
+    HRESULT SetDrawingEffect(IUnknown* effect, DWRITE_TEXT_RANGE range);
+    HRESULT SetInlineObject(IDWriteInlineObject *object, DWRITE_TEXT_RANGE range);
+    HRESULT SetTypography(IDWriteTypography* typography, DWRITE_TEXT_RANGE range);
+    HRESULT SetLocaleName(WCHAR const* locale, DWRITE_TEXT_RANGE range);
+
+    FLOAT GetMaxWidth();
+    FLOAT GetMaxHeight();
+    HRESULT GetFontCollection(
+        UINT32 pos,
+        IDWriteFontCollection** collection,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetFontFamilyNameLength(
+        UINT32 pos,
+        UINT32* len,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetFontFamilyName(
+        UINT32 position,
+        WCHAR* name,
+        UINT32 name_size,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetFontWeight(
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetFontStyle(
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetFontStretch(
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetFontSize(
+        UINT32 position,
+        FLOAT *size,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetUnderline(
+        UINT32 position,
+        BOOL *has_underline,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetStrikethrough(
+        UINT32 position,
+        BOOL *has_strikethrough,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetDrawingEffect(
+        UINT32 position,
+        IUnknown **effect,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetInlineObject(
+        UINT32 position,
+        IDWriteInlineObject **object,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetTypography(
+        UINT32 position,
+        IDWriteTypography** typography,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetLocaleNameLength(
+        UINT32 position,
+        UINT32* length,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT GetLocaleName(
+        UINT32 position,
+        WCHAR* name,
+        UINT32 name_size,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+
+    HRESULT Draw(
+        void *context,
+        IDWriteTextRenderer* renderer,
+        FLOAT originX,
+        FLOAT originY);
+
+    HRESULT GetLineMetrics(
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count);
+
+    HRESULT GetMetrics(DWRITE_TEXT_METRICS *metrics);
+    HRESULT GetOverhangMetrics(DWRITE_OVERHANG_METRICS *overhangs);
+    HRESULT GetClusterMetrics(
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32* act_count);
+
+    HRESULT DetermineMinWidth(FLOAT* min_width);
+    HRESULT HitTestPoint(
+        FLOAT pointX,
+        FLOAT pointY,
+        BOOL* is_trailinghit,
+        BOOL* is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT HitTestTextPosition(
+        UINT32 textPosition,
+        BOOL is_trailinghit,
+        FLOAT* pointX,
+        FLOAT* pointY,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT HitTestTextRange(
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32* actual_metricscount);
+}
+
+[
+local,
+object,
+uuid(14885cc9-bab0-4f90-b6ed-5c366a2cd03d)
+]
+interface IDWriteNumberSubstitution : IUnknown
+{
+}
+
+[
+local,
+object,
+uuid(688e1a58-5094-47c8-adc8-fbcea60ae92b)
+]
+interface IDWriteTextAnalysisSource : IUnknown
+{
+    HRESULT GetTextAtPosition(
+        UINT32 position,
+        WCHAR const** text,
+        UINT32* text_len);
+
+    HRESULT GetTextBeforePosition(
+        UINT32 position,
+        WCHAR const** text,
+        UINT32* text_len);
+
+    DWRITE_READING_DIRECTION GetParagraphReadingDirection();
+    HRESULT GetLocaleName(
+        UINT32 position,
+        UINT32* text_len,
+        WCHAR const** locale);
+
+    HRESULT GetNumberSubstitution(
+        UINT32 position,
+        UINT32* text_len,
+        IDWriteNumberSubstitution **substitution);
+}
+
+[
+local,
+object,
+uuid(5810cd44-0ca0-4701-b3fa-bec5182ae4f6)
+]
+interface IDWriteTextAnalysisSink : IUnknown
+{
+    HRESULT SetScriptAnalysis(
+        UINT32 position,
+        UINT32 length,
+        DWRITE_SCRIPT_ANALYSIS const* scriptanalysis);
+
+    HRESULT SetLineBreakpoints(
+        UINT32 position,
+        UINT32 length,
+        DWRITE_LINE_BREAKPOINT const* breakpoints);
+
+    HRESULT SetBidiLevel(
+        UINT32 position,
+        UINT32 length,
+        UINT8 explicitLevel,
+        UINT8 resolvedLevel);
+
+    HRESULT SetNumberSubstitution(
+        UINT32 position,
+        UINT32 length,
+        IDWriteNumberSubstitution* substitution);
+}
+
+[
+local,
+object,
+uuid(b7e6163e-7f46-43b4-84b3-e4e6249c365d)
+]
+interface IDWriteTextAnalyzer : IUnknown
+{
+    HRESULT AnalyzeScript(
+        IDWriteTextAnalysisSource* source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink* sink);
+
+    HRESULT AnalyzeBidi(
+        IDWriteTextAnalysisSource* source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink* sink);
+
+    HRESULT AnalyzeNumberSubstitution(
+        IDWriteTextAnalysisSource* source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink* sink);
+
+    HRESULT AnalyzeLineBreakpoints(
+        IDWriteTextAnalysisSource* source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink* sink);
+
+    HRESULT GetGlyphs(
+        WCHAR const* text,
+        UINT32 length,
+        IDWriteFontFace* font_face,
+        BOOL is_sideways,
+        BOOL is_rtl,
+        DWRITE_SCRIPT_ANALYSIS const* analysis,
+        WCHAR const* locale,
+        IDWriteNumberSubstitution* substitution,
+        DWRITE_TYPOGRAPHIC_FEATURES const** features,
+        UINT32 const* feature_range_len,
+        UINT32 feature_ranges,
+        UINT32 max_glyph_count,
+        UINT16* clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES* text_props,
+        UINT16* glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES* glyph_props,
+        UINT32* actual_glyph_count);
+
+    HRESULT GetGlyphPlacements(
+        WCHAR const* text,
+        UINT16 const* clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES* props,
+        UINT32 text_len,
+        UINT16 const* glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace * font_face,
+        FLOAT fontEmSize,
+        BOOL is_sideways,
+        BOOL is_rtl,
+        DWRITE_SCRIPT_ANALYSIS const* analysis,
+        WCHAR const* locale,
+        DWRITE_TYPOGRAPHIC_FEATURES const** features,
+        UINT32 const* feature_range_len,
+        UINT32 feature_ranges,
+        FLOAT* glyph_advances,
+        DWRITE_GLYPH_OFFSET* glyph_offsets);
+
+    HRESULT GetGdiCompatibleGlyphPlacements(
+        WCHAR const* text,
+        UINT16 const* clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES* props,
+        UINT32 text_len,
+        UINT16 const* glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace * font_face,
+        FLOAT fontEmSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MATRIX const* transform,
+        BOOL use_gdi_natural,
+        BOOL is_sideways,
+        BOOL is_rtl,
+        DWRITE_SCRIPT_ANALYSIS const* analysis,
+        WCHAR const* locale,
+        DWRITE_TYPOGRAPHIC_FEATURES const** features,
+        UINT32 const* feature_range_lengths,
+        UINT32 feature_ranges,
+        FLOAT* glyph_advances,
+        DWRITE_GLYPH_OFFSET* glyph_offsets);
+}
+
+[
+local,
+object,
+uuid(7d97dbf7-e085-42d4-81e3-6a883bded118)
+]
+interface IDWriteGlyphRunAnalysis : IUnknown
+{
+    HRESULT GetAlphaTextureBounds(DWRITE_TEXTURE_TYPE type, RECT* bounds);
+    HRESULT CreateAlphaTexture(DWRITE_TEXTURE_TYPE type, RECT const* bounds, BYTE* alphaValues, UINT32 bufferSize);
+    HRESULT GetAlphaBlendParams(
+        IDWriteRenderingParams* renderingParams,
+        FLOAT* blendGamma,
+        FLOAT* blendEnhancedContrast,
+        FLOAT* blendClearTypeLevel);
+}
+
+[
+local,
+object,
+uuid(b859ee5a-d838-4b5b-a2e8-1adc7d93db48)
+]
+interface IDWriteFactory : IUnknown
+{
+    HRESULT GetSystemFontCollection(IDWriteFontCollection **collection,
+                                    [defaultvalue(FALSE)] BOOL check_for_updates);
+
+    HRESULT CreateCustomFontCollection(
+        IDWriteFontCollectionLoader *loader,
+        void const *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT RegisterFontCollectionLoader(IDWriteFontCollectionLoader *loader);
+
+    HRESULT UnregisterFontCollectionLoader(IDWriteFontCollectionLoader *loader);
+
+    HRESULT CreateFontFileReference(
+        WCHAR const *path,
+        FILETIME const *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT CreateCustomFontFileReference(
+        void const *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT CreateFontFace(
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile* const* font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT CreateRenderingParams(IDWriteRenderingParams **params);
+
+    HRESULT CreateMonitorRenderingParams(
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT CreateCustomRenderingParams(
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT RegisterFontFileLoader(IDWriteFontFileLoader *loader);
+
+    HRESULT UnregisterFontFileLoader(IDWriteFontFileLoader *loader);
+
+    HRESULT CreateTextFormat(
+        WCHAR const* family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        WCHAR const *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT CreateTypography(IDWriteTypography **typography);
+
+    HRESULT GetGdiInterop(IDWriteGdiInterop **gdi_interop);
+
+    HRESULT CreateTextLayout(
+        WCHAR const* string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT CreateGdiCompatibleTextLayout(
+        WCHAR const* string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        DWRITE_MATRIX const* transform,
+        BOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT CreateEllipsisTrimmingSign(
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT CreateTextAnalyzer(IDWriteTextAnalyzer **analyzer);
+
+    HRESULT CreateNumberSubstitution(
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        WCHAR const* locale,
+        BOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT CreateGlyphRunAnalysis(
+        DWRITE_GLYPH_RUN const *glyph_run,
+        FLOAT pixels_per_dip,
+        DWRITE_MATRIX const* transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+}
+
+cpp_quote("HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE,REFIID,IUnknown**);")
+
+/* error codes */
+cpp_quote("#define FACILITY_DWRITE 0x898")
+cpp_quote("#define DWRITE_ERR_BASE 0x5000")
+cpp_quote("#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))")
+cpp_quote("#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)")
diff --git a/mingw-w64-headers/include/dwrite_1.h b/mingw-w64-headers/include/dwrite_1.h
index 527c80f..c226af2 100644
--- a/mingw-w64-headers/include/dwrite_1.h
+++ b/mingw-w64-headers/include/dwrite_1.h
@@ -1,114 +1,464 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
+/*** Autogenerated by WIDL 5.13 from include/dwrite_1.idl - Do not edit ***/
 
-#ifndef DWRITE_1_H_INCLUDED
-#define DWRITE_1_H_INCLUDED
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#endif
 
-#include <dwrite.h>
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
 
-#ifndef __IDWriteFont1_FWD_DEFINED__
-#define __IDWriteFont1_FWD_DEFINED__
-typedef struct IDWriteFont1 IDWriteFont1;
+#ifndef __dwrite_1_h__
+#define __dwrite_1_h__
+
+/* Forward declarations */
+
+#ifndef __IDWriteFactory1_FWD_DEFINED__
+#define __IDWriteFactory1_FWD_DEFINED__
+typedef interface IDWriteFactory1 IDWriteFactory1;
+#ifdef __cplusplus
+interface IDWriteFactory1;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteFontFace1_FWD_DEFINED__
 #define __IDWriteFontFace1_FWD_DEFINED__
-typedef struct IDWriteFontFace1 IDWriteFontFace1;
+typedef interface IDWriteFontFace1 IDWriteFontFace1;
+#ifdef __cplusplus
+interface IDWriteFontFace1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFont1_FWD_DEFINED__
+#define __IDWriteFont1_FWD_DEFINED__
+typedef interface IDWriteFont1 IDWriteFont1;
+#ifdef __cplusplus
+interface IDWriteFont1;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteRenderingParams1_FWD_DEFINED__
 #define __IDWriteRenderingParams1_FWD_DEFINED__
-typedef struct IDWriteRenderingParams1 IDWriteRenderingParams1;
-#endif
-
-#ifndef __IDWriteTextAnalysisSource1_FWD_DEFINED__
-#define __IDWriteTextAnalysisSource1_FWD_DEFINED__
-typedef struct IDWriteTextAnalysisSource1 IDWriteTextAnalysisSource1;
-#endif
-
-#ifndef __IDWriteTextAnalysisSink1_FWD_DEFINED__
-#define __IDWriteTextAnalysisSink1_FWD_DEFINED__
-typedef struct IDWriteTextAnalysisSink1 IDWriteTextAnalysisSink1;
+typedef interface IDWriteRenderingParams1 IDWriteRenderingParams1;
+#ifdef __cplusplus
+interface IDWriteRenderingParams1;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteTextAnalyzer1_FWD_DEFINED__
 #define __IDWriteTextAnalyzer1_FWD_DEFINED__
-typedef struct IDWriteTextAnalyzer1 IDWriteTextAnalyzer1;
+typedef interface IDWriteTextAnalyzer1 IDWriteTextAnalyzer1;
+#ifdef __cplusplus
+interface IDWriteTextAnalyzer1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextAnalysisSource1_FWD_DEFINED__
+#define __IDWriteTextAnalysisSource1_FWD_DEFINED__
+typedef interface IDWriteTextAnalysisSource1 IDWriteTextAnalysisSource1;
+#ifdef __cplusplus
+interface IDWriteTextAnalysisSource1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextAnalysisSink1_FWD_DEFINED__
+#define __IDWriteTextAnalysisSink1_FWD_DEFINED__
+typedef interface IDWriteTextAnalysisSink1 IDWriteTextAnalysisSink1;
+#ifdef __cplusplus
+interface IDWriteTextAnalysisSink1;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteTextLayout1_FWD_DEFINED__
 #define __IDWriteTextLayout1_FWD_DEFINED__
-typedef struct IDWriteTextLayout1 IDWriteTextLayout1;
-#endif
-
-#ifndef __IDWriteFactory1_FWD_DEFINED__
-#define __IDWriteFactory1_FWD_DEFINED__
-typedef struct IDWriteFactory1 IDWriteFactory1;
+typedef interface IDWriteTextLayout1 IDWriteTextLayout1;
+#ifdef __cplusplus
+interface IDWriteTextLayout1;
+#endif /* __cplusplus */
 #endif
 
 #ifndef __IDWriteBitmapRenderTarget1_FWD_DEFINED__
 #define __IDWriteBitmapRenderTarget1_FWD_DEFINED__
-typedef struct IDWriteBitmapRenderTarget1 IDWriteBitmapRenderTarget1;
-#endif
-
-enum DWRITE_OUTLINE_THRESHOLD {
-    DWRITE_OUTLINE_THRESHOLD_ANTIALIASED,
-    DWRITE_OUTLINE_THRESHOLD_ALIASED
-};
-
-enum DWRITE_BASELINE
-{
-    DWRITE_BASELINE_DEFAULT,
-    DWRITE_BASELINE_ROMAN,
-    DWRITE_BASELINE_CENTRAL,
-    DWRITE_BASELINE_MATH,
-    DWRITE_BASELINE_HANGING,
-    DWRITE_BASELINE_IDEOGRAPHIC_BOTTOM,
-    DWRITE_BASELINE_IDEOGRAPHIC_TOP,
-    DWRITE_BASELINE_MINIMUM,
-    DWRITE_BASELINE_MAXIMUM,
-};
-
-enum DWRITE_GLYPH_ORIENTATION_ANGLE
-{
-    DWRITE_GLYPH_ORIENTATION_ANGLE_0_DEGREES,
-    DWRITE_GLYPH_ORIENTATION_ANGLE_90_DEGREES,
-    DWRITE_GLYPH_ORIENTATION_ANGLE_180_DEGREES,
-    DWRITE_GLYPH_ORIENTATION_ANGLE_270_DEGREES,
-};
-
-enum DWRITE_TEXT_ANTIALIAS_MODE
-{
-    DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
-    DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE
-};
-
-enum DWRITE_VERTICAL_GLYPH_ORIENTATION
-{
-    DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT,
-    DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED
-};
-
-struct DWRITE_CARET_METRICS {
-    INT16 slopeRise;
-    INT16 slopeRun;
-    INT16 offset;
-};
-
-struct DWRITE_UNICODE_RANGE {
-    UINT32 first;
-    UINT32 last;
-};
-
-struct DWRITE_FONT_METRICS1
+typedef interface IDWriteBitmapRenderTarget1 IDWriteBitmapRenderTarget1;
 #ifdef __cplusplus
-    : public DWRITE_FONT_METRICS
+interface IDWriteBitmapRenderTarget1;
+#endif /* __cplusplus */
 #endif
-{
-#ifndef __cplusplus
+
+/* Headers for imported files */
+
+#include <dwrite.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum DWRITE_PANOSE_FAMILY {
+    DWRITE_PANOSE_FAMILY_ANY = 0,
+    DWRITE_PANOSE_FAMILY_NO_FIT = 1,
+    DWRITE_PANOSE_FAMILY_TEXT_DISPLAY = 2,
+    DWRITE_PANOSE_FAMILY_SCRIPT = 3,
+    DWRITE_PANOSE_FAMILY_DECORATIVE = 4,
+    DWRITE_PANOSE_FAMILY_SYMBOL = 5,
+    DWRITE_PANOSE_FAMILY_PICTORIAL = DWRITE_PANOSE_FAMILY_SYMBOL
+} DWRITE_PANOSE_FAMILY;
+typedef enum DWRITE_PANOSE_SERIF_STYLE {
+    DWRITE_PANOSE_SERIF_STYLE_ANY = 0,
+    DWRITE_PANOSE_SERIF_STYLE_NO_FIT = 1,
+    DWRITE_PANOSE_SERIF_STYLE_COVE = 2,
+    DWRITE_PANOSE_SERIF_STYLE_OBTUSE_COVE = 3,
+    DWRITE_PANOSE_SERIF_STYLE_SQUARE_COVE = 4,
+    DWRITE_PANOSE_SERIF_STYLE_OBTUSE_SQUARE_COVE = 5,
+    DWRITE_PANOSE_SERIF_STYLE_SQUARE = 6,
+    DWRITE_PANOSE_SERIF_STYLE_THIN = 7,
+    DWRITE_PANOSE_SERIF_STYLE_OVAL = 8,
+    DWRITE_PANOSE_SERIF_STYLE_EXAGGERATED = 9,
+    DWRITE_PANOSE_SERIF_STYLE_TRIANGLE = 10,
+    DWRITE_PANOSE_SERIF_STYLE_NORMAL_SANS = 11,
+    DWRITE_PANOSE_SERIF_STYLE_OBTUSE_SANS = 12,
+    DWRITE_PANOSE_SERIF_STYLE_PERPENDICULAR_SANS = 13,
+    DWRITE_PANOSE_SERIF_STYLE_FLARED = 14,
+    DWRITE_PANOSE_SERIF_STYLE_ROUNDED = 15,
+    DWRITE_PANOSE_SERIF_STYLE_SCRIPT = 16,
+    DWRITE_PANOSE_SERIF_STYLE_PERP_SANS = DWRITE_PANOSE_SERIF_STYLE_PERPENDICULAR_SANS,
+    DWRITE_PANOSE_SERIF_STYLE_BONE = DWRITE_PANOSE_SERIF_STYLE_OVAL
+} DWRITE_PANOSE_SERIF_STYLE;
+typedef enum DWRITE_PANOSE_WEIGHT {
+    DWRITE_PANOSE_WEIGHT_ANY = 0,
+    DWRITE_PANOSE_WEIGHT_NO_FIT = 1,
+    DWRITE_PANOSE_WEIGHT_VERY_LIGHT = 2,
+    DWRITE_PANOSE_WEIGHT_LIGHT = 3,
+    DWRITE_PANOSE_WEIGHT_THIN = 4,
+    DWRITE_PANOSE_WEIGHT_BOOK = 5,
+    DWRITE_PANOSE_WEIGHT_MEDIUM = 6,
+    DWRITE_PANOSE_WEIGHT_DEMI = 7,
+    DWRITE_PANOSE_WEIGHT_BOLD = 8,
+    DWRITE_PANOSE_WEIGHT_HEAVY = 9,
+    DWRITE_PANOSE_WEIGHT_BLACK = 10,
+    DWRITE_PANOSE_WEIGHT_EXTRA_BLACK = 11,
+    DWRITE_PANOSE_WEIGHT_NORD = DWRITE_PANOSE_WEIGHT_EXTRA_BLACK
+} DWRITE_PANOSE_WEIGHT;
+typedef enum DWRITE_PANOSE_PROPORTION {
+    DWRITE_PANOSE_PROPORTION_ANY = 0,
+    DWRITE_PANOSE_PROPORTION_NO_FIT = 1,
+    DWRITE_PANOSE_PROPORTION_OLD_STYLE = 2,
+    DWRITE_PANOSE_PROPORTION_MODERN = 3,
+    DWRITE_PANOSE_PROPORTION_EVEN_WIDTH = 4,
+    DWRITE_PANOSE_PROPORTION_EXPANDED = 5,
+    DWRITE_PANOSE_PROPORTION_CONDENSED = 6,
+    DWRITE_PANOSE_PROPORTION_VERY_EXPANDED = 7,
+    DWRITE_PANOSE_PROPORTION_VERY_CONDENSED = 8,
+    DWRITE_PANOSE_PROPORTION_MONOSPACED = 9
+} DWRITE_PANOSE_PROPORTION;
+typedef enum DWRITE_PANOSE_CONTRAST {
+    DWRITE_PANOSE_CONTRAST_ANY = 0,
+    DWRITE_PANOSE_CONTRAST_NO_FIT = 1,
+    DWRITE_PANOSE_CONTRAST_NONE = 2,
+    DWRITE_PANOSE_CONTRAST_VERY_LOW = 3,
+    DWRITE_PANOSE_CONTRAST_LOW = 4,
+    DWRITE_PANOSE_CONTRAST_MEDIUM_LOW = 5,
+    DWRITE_PANOSE_CONTRAST_MEDIUM = 6,
+    DWRITE_PANOSE_CONTRAST_MEDIUM_HIGH = 7,
+    DWRITE_PANOSE_CONTRAST_HIGH = 8,
+    DWRITE_PANOSE_CONTRAST_VERY_HIGH = 9,
+    DWRITE_PANOSE_CONTRAST_HORIZONTAL_LOW = 10,
+    DWRITE_PANOSE_CONTRAST_HORIZONTAL_MEDIUM = 11,
+    DWRITE_PANOSE_CONTRAST_HORIZONTAL_HIGH = 12,
+    DWRITE_PANOSE_CONTRAST_BROKEN = 13
+} DWRITE_PANOSE_CONTRAST;
+typedef enum DWRITE_PANOSE_STROKE_VARIATION {
+    DWRITE_PANOSE_STROKE_VARIATION_ANY = 0,
+    DWRITE_PANOSE_STROKE_VARIATION_NO_FIT = 1,
+    DWRITE_PANOSE_STROKE_VARIATION_NO_VARIATION = 2,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_DIAGONAL = 3,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_TRANSITIONAL = 4,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_VERTICAL = 5,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_HORIZONTAL = 6,
+    DWRITE_PANOSE_STROKE_VARIATION_RAPID_VERTICAL = 7,
+    DWRITE_PANOSE_STROKE_VARIATION_RAPID_HORIZONTAL = 8,
+    DWRITE_PANOSE_STROKE_VARIATION_INSTANT_VERTICAL = 9,
+    DWRITE_PANOSE_STROKE_VARIATION_INSTANT_HORIZONTAL = 10
+} DWRITE_PANOSE_STROKE_VARIATION;
+typedef enum DWRITE_PANOSE_ARM_STYLE {
+    DWRITE_PANOSE_ARM_STYLE_ANY = 0,
+    DWRITE_PANOSE_ARM_STYLE_NO_FIT = 1,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_HORIZONTAL = 2,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_WEDGE = 3,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERTICAL = 4,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_SINGLE_SERIF = 5,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_DOUBLE_SERIF = 6,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_HORIZONTAL = 7,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_WEDGE = 8,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_VERTICAL = 9,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_SINGLE_SERIF = 10,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_DOUBLE_SERIF = 11,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_HORZ = DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_HORIZONTAL,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERT = DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERTICAL,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_HORZ = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_HORIZONTAL,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_WEDGE = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_WEDGE,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_VERT = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_VERTICAL,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_SINGLE_SERIF = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_SINGLE_SERIF,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_DOUBLE_SERIF = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_DOUBLE_SERIF
+} DWRITE_PANOSE_ARM_STYLE;
+typedef enum DWRITE_PANOSE_LETTERFORM {
+    DWRITE_PANOSE_LETTERFORM_ANY = 0,
+    DWRITE_PANOSE_LETTERFORM_NO_FIT = 1,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_CONTACT = 2,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_WEIGHTED = 3,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_BOXED = 4,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_FLATTENED = 5,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_ROUNDED = 6,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_OFF_CENTER = 7,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_SQUARE = 8,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_CONTACT = 9,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_WEIGHTED = 10,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_BOXED = 11,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_FLATTENED = 12,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_ROUNDED = 13,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_OFF_CENTER = 14,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_SQUARE = 15
+} DWRITE_PANOSE_LETTERFORM;
+typedef enum DWRITE_PANOSE_MIDLINE {
+    DWRITE_PANOSE_MIDLINE_ANY = 0,
+    DWRITE_PANOSE_MIDLINE_NO_FIT = 1,
+    DWRITE_PANOSE_MIDLINE_STANDARD_TRIMMED = 2,
+    DWRITE_PANOSE_MIDLINE_STANDARD_POINTED = 3,
+    DWRITE_PANOSE_MIDLINE_STANDARD_SERIFED = 4,
+    DWRITE_PANOSE_MIDLINE_HIGH_TRIMMED = 5,
+    DWRITE_PANOSE_MIDLINE_HIGH_POINTED = 6,
+    DWRITE_PANOSE_MIDLINE_HIGH_SERIFED = 7,
+    DWRITE_PANOSE_MIDLINE_CONSTANT_TRIMMED = 8,
+    DWRITE_PANOSE_MIDLINE_CONSTANT_POINTED = 9,
+    DWRITE_PANOSE_MIDLINE_CONSTANT_SERIFED = 10,
+    DWRITE_PANOSE_MIDLINE_LOW_TRIMMED = 11,
+    DWRITE_PANOSE_MIDLINE_LOW_POINTED = 12,
+    DWRITE_PANOSE_MIDLINE_LOW_SERIFED = 13
+} DWRITE_PANOSE_MIDLINE;
+typedef enum DWRITE_PANOSE_XHEIGHT {
+    DWRITE_PANOSE_XHEIGHT_ANY = 0,
+    DWRITE_PANOSE_XHEIGHT_NO_FIT = 1,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_SMALL = 2,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_STANDARD = 3,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_LARGE = 4,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_SMALL = 5,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_STANDARD = 6,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_LARGE = 7,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_STD = DWRITE_PANOSE_XHEIGHT_CONSTANT_STANDARD,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_STD = DWRITE_PANOSE_XHEIGHT_DUCKING_STANDARD
+} DWRITE_PANOSE_XHEIGHT;
+typedef enum DWRITE_PANOSE_TOOL_KIND {
+    DWRITE_PANOSE_TOOL_KIND_ANY = 0,
+    DWRITE_PANOSE_TOOL_KIND_NO_FIT = 1,
+    DWRITE_PANOSE_TOOL_KIND_FLAT_NIB = 2,
+    DWRITE_PANOSE_TOOL_KIND_PRESSURE_POINT = 3,
+    DWRITE_PANOSE_TOOL_KIND_ENGRAVED = 4,
+    DWRITE_PANOSE_TOOL_KIND_BALL = 5,
+    DWRITE_PANOSE_TOOL_KIND_BRUSH = 6,
+    DWRITE_PANOSE_TOOL_KIND_ROUGH = 7,
+    DWRITE_PANOSE_TOOL_KIND_FELT_PEN_BRUSH_TIP = 8,
+    DWRITE_PANOSE_TOOL_KIND_WILD_BRUSH = 9
+} DWRITE_PANOSE_TOOL_KIND;
+typedef enum DWRITE_PANOSE_SPACING {
+    DWRITE_PANOSE_SPACING_ANY = 0,
+    DWRITE_PANOSE_SPACING_NO_FIT = 1,
+    DWRITE_PANOSE_SPACING_PROPORTIONAL_SPACED = 2,
+    DWRITE_PANOSE_SPACING_MONOSPACED = 3
+} DWRITE_PANOSE_SPACING;
+typedef enum DWRITE_PANOSE_ASPECT_RATIO {
+    DWRITE_PANOSE_ASPECT_RATIO_ANY = 0,
+    DWRITE_PANOSE_ASPECT_RATIO_NO_FIT = 1,
+    DWRITE_PANOSE_ASPECT_RATIO_VERY_CONDENSED = 2,
+    DWRITE_PANOSE_ASPECT_RATIO_CONDENSED = 3,
+    DWRITE_PANOSE_ASPECT_RATIO_NORMAL = 4,
+    DWRITE_PANOSE_ASPECT_RATIO_EXPANDED = 5,
+    DWRITE_PANOSE_ASPECT_RATIO_VERY_EXPANDED = 6
+} DWRITE_PANOSE_ASPECT_RATIO;
+typedef enum DWRITE_PANOSE_SCRIPT_TOPOLOGY {
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ANY = 0,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_NO_FIT = 1,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ROMAN_DISCONNECTED = 2,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ROMAN_TRAILING = 3,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ROMAN_CONNECTED = 4,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_CURSIVE_DISCONNECTED = 5,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_CURSIVE_TRAILING = 6,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_CURSIVE_CONNECTED = 7,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_BLACKLETTER_DISCONNECTED = 8,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_BLACKLETTER_TRAILING = 9,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_BLACKLETTER_CONNECTED = 10
+} DWRITE_PANOSE_SCRIPT_TOPOLOGY;
+typedef enum DWRITE_PANOSE_SCRIPT_FORM {
+    DWRITE_PANOSE_SCRIPT_FORM_ANY = 0,
+    DWRITE_PANOSE_SCRIPT_FORM_NO_FIT = 1,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_NO_WRAPPING = 2,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_SOME_WRAPPING = 3,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_MORE_WRAPPING = 4,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_EXTREME_WRAPPING = 5,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_NO_WRAPPING = 6,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_SOME_WRAPPING = 7,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_MORE_WRAPPING = 8,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_EXTREME_WRAPPING = 9,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_NO_WRAPPING = 10,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_SOME_WRAPPING = 11,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_MORE_WRAPPING = 12,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_EXTREME_WRAPPING = 13
+} DWRITE_PANOSE_SCRIPT_FORM;
+typedef enum DWRITE_PANOSE_FINIALS {
+    DWRITE_PANOSE_FINIALS_ANY = 0,
+    DWRITE_PANOSE_FINIALS_NO_FIT = 1,
+    DWRITE_PANOSE_FINIALS_NONE_NO_LOOPS = 2,
+    DWRITE_PANOSE_FINIALS_NONE_CLOSED_LOOPS = 3,
+    DWRITE_PANOSE_FINIALS_NONE_OPEN_LOOPS = 4,
+    DWRITE_PANOSE_FINIALS_SHARP_NO_LOOPS = 5,
+    DWRITE_PANOSE_FINIALS_SHARP_CLOSED_LOOPS = 6,
+    DWRITE_PANOSE_FINIALS_SHARP_OPEN_LOOPS = 7,
+    DWRITE_PANOSE_FINIALS_TAPERED_NO_LOOPS = 8,
+    DWRITE_PANOSE_FINIALS_TAPERED_CLOSED_LOOPS = 9,
+    DWRITE_PANOSE_FINIALS_TAPERED_OPEN_LOOPS = 10,
+    DWRITE_PANOSE_FINIALS_ROUND_NO_LOOPS = 11,
+    DWRITE_PANOSE_FINIALS_ROUND_CLOSED_LOOPS = 12,
+    DWRITE_PANOSE_FINIALS_ROUND_OPEN_LOOPS = 13
+} DWRITE_PANOSE_FINIALS;
+typedef enum DWRITE_PANOSE_XASCENT {
+    DWRITE_PANOSE_XASCENT_ANY = 0,
+    DWRITE_PANOSE_XASCENT_NO_FIT = 1,
+    DWRITE_PANOSE_XASCENT_VERY_LOW = 2,
+    DWRITE_PANOSE_XASCENT_LOW = 3,
+    DWRITE_PANOSE_XASCENT_MEDIUM = 4,
+    DWRITE_PANOSE_XASCENT_HIGH = 5,
+    DWRITE_PANOSE_XASCENT_VERY_HIGH = 6
+} DWRITE_PANOSE_XASCENT;
+typedef enum DWRITE_PANOSE_DECORATIVE_CLASS {
+    DWRITE_PANOSE_DECORATIVE_CLASS_ANY = 0,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NO_FIT = 1,
+    DWRITE_PANOSE_DECORATIVE_CLASS_DERIVATIVE = 2,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NONSTANDARD_TOPOLOGY = 3,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NONSTANDARD_ELEMENTS = 4,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NONSTANDARD_ASPECT = 5,
+    DWRITE_PANOSE_DECORATIVE_CLASS_INITIALS = 6,
+    DWRITE_PANOSE_DECORATIVE_CLASS_CARTOON = 7,
+    DWRITE_PANOSE_DECORATIVE_CLASS_PICTURE_STEMS = 8,
+    DWRITE_PANOSE_DECORATIVE_CLASS_ORNAMENTED = 9,
+    DWRITE_PANOSE_DECORATIVE_CLASS_TEXT_AND_BACKGROUND = 10,
+    DWRITE_PANOSE_DECORATIVE_CLASS_COLLAGE = 11,
+    DWRITE_PANOSE_DECORATIVE_CLASS_MONTAGE = 12
+} DWRITE_PANOSE_DECORATIVE_CLASS;
+typedef enum DWRITE_PANOSE_ASPECT {
+    DWRITE_PANOSE_ASPECT_ANY = 0,
+    DWRITE_PANOSE_ASPECT_NO_FIT = 1,
+    DWRITE_PANOSE_ASPECT_SUPER_CONDENSED = 2,
+    DWRITE_PANOSE_ASPECT_VERY_CONDENSED = 3,
+    DWRITE_PANOSE_ASPECT_CONDENSED = 4,
+    DWRITE_PANOSE_ASPECT_NORMAL = 5,
+    DWRITE_PANOSE_ASPECT_EXTENDED = 6,
+    DWRITE_PANOSE_ASPECT_VERY_EXTENDED = 7,
+    DWRITE_PANOSE_ASPECT_SUPER_EXTENDED = 8,
+    DWRITE_PANOSE_ASPECT_MONOSPACED = 9
+} DWRITE_PANOSE_ASPECT;
+typedef enum DWRITE_PANOSE_FILL {
+    DWRITE_PANOSE_FILL_ANY = 0,
+    DWRITE_PANOSE_FILL_NO_FIT = 1,
+    DWRITE_PANOSE_FILL_STANDARD_SOLID_FILL = 2,
+    DWRITE_PANOSE_FILL_NO_FILL = 3,
+    DWRITE_PANOSE_FILL_PATTERNED_FILL = 4,
+    DWRITE_PANOSE_FILL_COMPLEX_FILL = 5,
+    DWRITE_PANOSE_FILL_SHAPED_FILL = 6,
+    DWRITE_PANOSE_FILL_DRAWN_DISTRESSED = 7
+} DWRITE_PANOSE_FILL;
+typedef enum DWRITE_PANOSE_LINING {
+    DWRITE_PANOSE_LINING_ANY = 0,
+    DWRITE_PANOSE_LINING_NO_FIT = 1,
+    DWRITE_PANOSE_LINING_NONE = 2,
+    DWRITE_PANOSE_LINING_INLINE = 3,
+    DWRITE_PANOSE_LINING_OUTLINE = 4,
+    DWRITE_PANOSE_LINING_ENGRAVED = 5,
+    DWRITE_PANOSE_LINING_SHADOW = 6,
+    DWRITE_PANOSE_LINING_RELIEF = 7,
+    DWRITE_PANOSE_LINING_BACKDROP = 8
+} DWRITE_PANOSE_LINING;
+typedef enum DWRITE_PANOSE_DECORATIVE_TOPOLOGY {
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_ANY = 0,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_NO_FIT = 1,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_STANDARD = 2,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_SQUARE = 3,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_MULTIPLE_SEGMENT = 4,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_ART_DECO = 5,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_UNEVEN_WEIGHTING = 6,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_DIVERSE_ARMS = 7,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_DIVERSE_FORMS = 8,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_LOMBARDIC_FORMS = 9,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_UPPER_CASE_IN_LOWER_CASE = 10,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_IMPLIED_TOPOLOGY = 11,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_HORSESHOE_E_AND_A = 12,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_CURSIVE = 13,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_BLACKLETTER = 14,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_SWASH_VARIANCE = 15
+} DWRITE_PANOSE_DECORATIVE_TOPOLOGY;
+typedef enum DWRITE_PANOSE_CHARACTER_RANGES {
+    DWRITE_PANOSE_CHARACTER_RANGES_ANY = 0,
+    DWRITE_PANOSE_CHARACTER_RANGES_NO_FIT = 1,
+    DWRITE_PANOSE_CHARACTER_RANGES_EXTENDED_COLLECTION = 2,
+    DWRITE_PANOSE_CHARACTER_RANGES_LITERALS = 3,
+    DWRITE_PANOSE_CHARACTER_RANGES_NO_LOWER_CASE = 4,
+    DWRITE_PANOSE_CHARACTER_RANGES_SMALL_CAPS = 5
+} DWRITE_PANOSE_CHARACTER_RANGES;
+typedef enum DWRITE_PANOSE_SYMBOL_KIND {
+    DWRITE_PANOSE_SYMBOL_KIND_ANY = 0,
+    DWRITE_PANOSE_SYMBOL_KIND_NO_FIT = 1,
+    DWRITE_PANOSE_SYMBOL_KIND_MONTAGES = 2,
+    DWRITE_PANOSE_SYMBOL_KIND_PICTURES = 3,
+    DWRITE_PANOSE_SYMBOL_KIND_SHAPES = 4,
+    DWRITE_PANOSE_SYMBOL_KIND_SCIENTIFIC = 5,
+    DWRITE_PANOSE_SYMBOL_KIND_MUSIC = 6,
+    DWRITE_PANOSE_SYMBOL_KIND_EXPERT = 7,
+    DWRITE_PANOSE_SYMBOL_KIND_PATTERNS = 8,
+    DWRITE_PANOSE_SYMBOL_KIND_BOARDERS = 9,
+    DWRITE_PANOSE_SYMBOL_KIND_ICONS = 10,
+    DWRITE_PANOSE_SYMBOL_KIND_LOGOS = 11,
+    DWRITE_PANOSE_SYMBOL_KIND_INDUSTRY_SPECIFIC = 12
+} DWRITE_PANOSE_SYMBOL_KIND;
+typedef enum DWRITE_PANOSE_SYMBOL_ASPECT_RATIO {
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_ANY = 0,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NO_FIT = 1,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NO_WIDTH = 2,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_EXCEPTIONALLY_WIDE = 3,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_SUPER_WIDE = 4,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_VERY_WIDE = 5,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_WIDE = 6,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NORMAL = 7,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NARROW = 8,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_VERY_NARROW = 9
+} DWRITE_PANOSE_SYMBOL_ASPECT_RATIO;
+typedef enum DWRITE_OUTLINE_THRESHOLD {
+    DWRITE_OUTLINE_THRESHOLD_ANTIALIASED = 0,
+    DWRITE_OUTLINE_THRESHOLD_ALIASED = 1
+} DWRITE_OUTLINE_THRESHOLD;
+typedef enum DWRITE_BASELINE {
+    DWRITE_BASELINE_DEFAULT = 0,
+    DWRITE_BASELINE_ROMAN = 1,
+    DWRITE_BASELINE_CENTRAL = 2,
+    DWRITE_BASELINE_MATH = 3,
+    DWRITE_BASELINE_HANGING = 4,
+    DWRITE_BASELINE_IDEOGRAPHIC_BOTTOM = 5,
+    DWRITE_BASELINE_IDEOGRAPHIC_TOP = 6,
+    DWRITE_BASELINE_MINIMUM = 7,
+    DWRITE_BASELINE_MAXIMUM = 8
+} DWRITE_BASELINE;
+typedef enum DWRITE_VERTICAL_GLYPH_ORIENTATION {
+    DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT = 0,
+    DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED = 1
+} DWRITE_VERTICAL_GLYPH_ORIENTATION;
+typedef enum DWRITE_GLYPH_ORIENTATION_ANGLE {
+    DWRITE_GLYPH_ORIENTATION_ANGLE_0_DEGREES = 0,
+    DWRITE_GLYPH_ORIENTATION_ANGLE_90_DEGREES = 1,
+    DWRITE_GLYPH_ORIENTATION_ANGLE_180_DEGREES = 2,
+    DWRITE_GLYPH_ORIENTATION_ANGLE_270_DEGREES = 3
+} DWRITE_GLYPH_ORIENTATION_ANGLE;
+typedef struct DWRITE_FONT_METRICS1 {
     UINT16 designUnitsPerEm;
     UINT16 ascent;
     UINT16 descent;
@@ -119,7 +469,6 @@
     UINT16 underlineThickness;
     INT16 strikethroughPosition;
     UINT16 strikethroughThickness;
-#endif
     INT16 glyphBoxLeft;
     INT16 glyphBoxTop;
     INT16 glyphBoxRight;
@@ -133,39 +482,13 @@
     INT16 superscriptSizeX;
     INT16 superscriptSizeY;
     WINBOOL hasTypographicMetrics;
-};
-
-struct DWRITE_SCRIPT_PROPERTIES
-{
-    UINT32 isoScriptCode;
-    UINT32 isoScriptNumber;
-    UINT32 clusterLookahead;
-    UINT32 justificationCharacter;
-    UINT32 restrictCaretToClusters      : 1;
-    UINT32 usesWordDividers             : 1;
-    UINT32 isDiscreteWriting            : 1;
-    UINT32 isBlockWriting               : 1;
-    UINT32 isDistributedWithinCluster   : 1;
-    UINT32 isConnectedWriting           : 1;
-    UINT32 isCursiveWriting             : 1;
-    UINT32 reserved                     : 25;
-};
-
-struct DWRITE_JUSTIFICATION_OPPORTUNITY
-{
-    FLOAT expansionMinimum;
-    FLOAT expansionMaximum;
-    FLOAT compressionMaximum;
-    UINT32 expansionPriority         : 8;
-    UINT32 compressionPriority       : 8;
-    UINT32 allowResidualExpansion    : 1;
-    UINT32 allowResidualCompression  : 1;
-    UINT32 applyToLeadingEdge        : 1;
-    UINT32 applyToTrailingEdge       : 1;
-    UINT32 reserved                  : 12;
-};
-
-union DWRITE_PANOSE {
+} DWRITE_FONT_METRICS1;
+typedef struct DWRITE_CARET_METRICS {
+    INT16 slopeRise;
+    INT16 slopeRun;
+    INT16 offset;
+} DWRITE_CARET_METRICS;
+typedef union DWRITE_PANOSE {
     UINT8 values[10];
     UINT8 familyKind;
     struct {
@@ -216,594 +539,2585 @@
         UINT8 aspectRatio163;
         UINT8 aspectRatio211;
     } symbol;
-};
+} DWRITE_PANOSE;
+typedef struct DWRITE_UNICODE_RANGE {
+    UINT32 first;
+    UINT32 last;
+} DWRITE_UNICODE_RANGE;
+typedef struct DWRITE_SCRIPT_PROPERTIES {
+    UINT32 isoScriptCode;
+    UINT32 isoScriptNumber;
+    UINT32 clusterLookahead;
+    UINT32 justificationCharacter;
+    UINT32 restrictCaretToClusters : 1;
+    UINT32 usesWordDividers : 1;
+    UINT32 isDiscreteWriting : 1;
+    UINT32 isBlockWriting : 1;
+    UINT32 isDistributedWithinCluster : 1;
+    UINT32 isConnectedWriting : 1;
+    UINT32 isCursiveWriting : 1;
+    UINT32 reserved : 25;
+} DWRITE_SCRIPT_PROPERTIES;
+typedef struct DWRITE_JUSTIFICATION_OPPORTUNITY {
+    FLOAT expansionMinimum;
+    FLOAT expansionMaximum;
+    FLOAT compressionMaximum;
+    UINT32 expansionPriority : 8;
+    UINT32 compressionPriority : 8;
+    UINT32 allowResidualExpansion : 1;
+    UINT32 allowResidualCompression : 1;
+    UINT32 applyToLeadingEdge : 1;
+    UINT32 applyToTrailingEdge : 1;
+    UINT32 reserved : 12;
+} DWRITE_JUSTIFICATION_OPPORTUNITY;
+#ifndef __IDWriteTextAnalysisSource1_FWD_DEFINED__
+#define __IDWriteTextAnalysisSource1_FWD_DEFINED__
+typedef interface IDWriteTextAnalysisSource1 IDWriteTextAnalysisSource1;
+#ifdef __cplusplus
+interface IDWriteTextAnalysisSource1;
+#endif /* __cplusplus */
+#endif
 
-#ifndef D2D_USE_C_DEFINITIONS
+#ifndef __IDWriteTextAnalysisSink1_FWD_DEFINED__
+#define __IDWriteTextAnalysisSink1_FWD_DEFINED__
+typedef interface IDWriteTextAnalysisSink1 IDWriteTextAnalysisSink1;
+#ifdef __cplusplus
+interface IDWriteTextAnalysisSink1;
+#endif /* __cplusplus */
+#endif
 
-#undef  INTERFACE
-#define INTERFACE IDWriteFont1
-DECLARE_INTERFACE_(IDWriteFont1,IDWriteFont)
+#ifndef __IDWriteRenderingParams1_FWD_DEFINED__
+#define __IDWriteRenderingParams1_FWD_DEFINED__
+typedef interface IDWriteRenderingParams1 IDWriteRenderingParams1;
+#ifdef __cplusplus
+interface IDWriteRenderingParams1;
+#endif /* __cplusplus */
+#endif
+
+/*****************************************************************************
+ * IDWriteFactory1 interface
+ */
+#ifndef __IDWriteFactory1_INTERFACE_DEFINED__
+#define __IDWriteFactory1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory1, 0x30572f99, 0xdac6, 0x41db, 0xa1,0x6e, 0x04,0x86,0x30,0x7e,0x60,0x6a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("30572f99-dac6-41db-a16e-0486307e606a")
+IDWriteFactory1 : public IDWriteFactory
 {
+    virtual HRESULT STDMETHODCALLTYPE GetEudcFontCollection(
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates = FALSE) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomRenderingParams(
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory1, 0x30572f99, 0xdac6, 0x41db, 0xa1,0x6e, 0x04,0x86,0x30,0x7e,0x60,0x6a)
+#endif
+#else
+typedef struct IDWriteFactory1Vtbl {
     BEGIN_INTERFACE
 
-    STDMETHOD_(void, GetMetrics)(DWRITE_FONT_METRICS1 *fontMetrics) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory1 *This,
+        REFIID riid,
+        void **ppvObject);
 
-    STDMETHOD_(void, GetPanose)(DWRITE_PANOSE *panose) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory1 *This);
 
-    STDMETHOD(GetUnicodeRanges)(UINT32 maxCount,
-        DWRITE_UNICODE_RANGE *ranges,
-        UINT32 *actualCount) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory1 *This);
 
-    END_INTERFACE
-};
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory1 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
 
-#else  /* D2D_USE_C_DEFINITIONS */
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory1 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
 
-typedef struct IDWriteFont1Vtbl
-{
-    IDWriteFontVtbl Base;
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory1 *This,
+        IDWriteFontCollectionLoader *loader);
 
-    STDMETHOD_(void, GetMetrics)(IDWriteFont1 *This,
-        struct DWRITE_FONT_METRICS1 *fontMetrics) PURE;
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory1 *This,
+        IDWriteFontCollectionLoader *loader);
 
-    STDMETHOD_(void, GetPanose)(IDWriteFont1 *This,
-        union DWRITE_PANOSE *panose) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory1 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
 
-    STDMETHOD(GetUnicodeRanges)(IDWriteFont1 *This,
-        UINT32 maxCount,
-        struct DWRITE_UNICODE_RANGE *ranges,
-        UINT32 *actualCount) PURE;
-}
-IDWriteFont1Vtbl;
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory1 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
 
-interface IDWriteFont1
-{
-    const IDWriteFont1Vtbl *lpVtbl;
-};
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory1 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
 
-#endif  /* D2D_USE_C_DEFINITIONS */
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory1 *This,
+        IDWriteRenderingParams **params);
 
-__CRT_UUID_DECL(IDWriteFont1, 0xacd16696,0x8c14,0x4f5d,0x87,0x7e,0xfe,0x3f,0xc1,0xd3,0x27,0x38);
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory1 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
 
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFace1
-DECLARE_INTERFACE_(IDWriteFontFace1, IDWriteFontFace)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD_(void, GetMetrics)(DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD(GetGdiCompatibleMetrics)(FLOAT,FLOAT,DWRITE_MATRIX const*,DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD_(void, GetCaretMetrics)(DWRITE_CARET_METRICS*) PURE;
-    STDMETHOD(GetUnicodeRanges)(UINT32, DWRITE_UNICODE_RANGE*,UINT32*) PURE;
-    STDMETHOD_(BOOL, IsMonospacedFont)(void) PURE;
-    STDMETHOD(GetDesignGlyphAdvances)(UINT32,UINT16 const*,INT32*,BOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-    STDMETHOD(GetGdiCompatibleGlyphAdvances)(FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,BOOL,UINT32,
-            UINT16 const*,INT32*) PURE;
-    STDMETHOD(GetKerningPairAdjustments)(UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(void);
-    STDMETHOD(GetRecommendedRenderingMode)(FLOAT,FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,
-            DWRITE_OUTLINE_THRESHOLD,DWRITE_MEASURING_MODE,DWRITE_RENDERING_MODE*) PURE;
-    STDMETHOD(GetVerticalGlyphVariants)(UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(void);
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteFontFace1Vtbl
-{
-    IDWriteFontFaceVtbl Base;
-
-    STDMETHOD_(void, GetMetrics)(IDWriteFontFace1 *This, struct DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD(GetGdiCompatibleMetrics)(IDWriteFontFace1 *This, FLOAT,FLOAT,DWRITE_MATRIX const*,struct DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD_(void, GetCaretMetrics)(IDWriteFontFace1 *This, struct DWRITE_CARET_METRICS*) PURE;
-    STDMETHOD(GetUnicodeRanges)(IDWriteFontFace1 *This, UINT32, struct DWRITE_UNICODE_RANGE*,UINT32*) PURE;
-    STDMETHOD_(BOOL, IsMonospacedFont)(IDWriteFontFace1 *This) PURE;
-    STDMETHOD(GetDesignGlyphAdvances)(IDWriteFontFace1 *This, UINT32,UINT16 const*,INT32*,BOOL isSideways) PURE;
-    STDMETHOD(GetGdiCompatibleGlyphAdvances)(IDWriteFontFace1 *This, FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,BOOL,UINT32,
-            UINT16 const*,INT32*) PURE;
-    STDMETHOD(GetKerningPairAdjustments)(IDWriteFontFace1 *This, UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(IDWriteFontFace1 *This);
-    STDMETHOD(GetRecommendedRenderingMode)(IDWriteFontFace1 *This, FLOAT,FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,
-            enum DWRITE_OUTLINE_THRESHOLD,DWRITE_MEASURING_MODE,DWRITE_RENDERING_MODE*) PURE;
-    STDMETHOD(GetVerticalGlyphVariants)(IDWriteFontFace1 *This, UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(IDWriteFontFace1 *This);
-}
-IDWriteFontFace1Vtbl;
-
-interface IDWriteFontFace1
-{
-    const IDWriteFontFace1Vtbl *lpVtbl;
-};
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-__CRT_UUID_DECL(IDWriteFontFace1, 0xa71efdb4,0x9fdb,0x4838,0xad,0x90,0xcf,0xc3,0xbe,0x8c,0x3d,0xaf);
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteRenderingParams1
-DECLARE_INTERFACE_(IDWriteRenderingParams1,IDWriteRenderingParams)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD_(FLOAT, GetGrayscaleEnhancedContrast)(void) PURE;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteRenderingParams1Vtbl
-{
-    IDWriteRenderingParamsVtbl Base;
-
-    STDMETHOD_(FLOAT, GetGrayscaleEnhancedContrast)(IDWriteRenderingParams1 *This) PURE;
-}
-IDWriteRenderingParams1Vtbl;
-
-interface IDWriteRenderingParams1
-{
-    const IDWriteRenderingParams1Vtbl *lpVtbl;
-};
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-__CRT_UUID_DECL(IDWriteRenderingParams1, 0x94413cf4,0xa6fc,0x4248,0x8b,0x50,0x66,0x74,0x34,0x8f,0xca,0xd3)
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextAnalysisSource1
-DECLARE_INTERFACE_(IDWriteTextAnalysisSource1,IDWriteTextAnalysisSource)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD(GetVerticalGlyphOrientation)(
-        UINT32 textPosition,
-        UINT32 *textLength,
-        DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,
-        UINT8 *bidiLevel) PURE;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteTextAnalysisSource1Vtbl
-{
-    IDWriteTextAnalysisSourceVtbl Base;
-
-    STDMETHOD(GetVerticalGlyphOrientation)(IDWriteTextAnalysisSource1 *This,
-        UINT32 textPosition,
-        UINT32 *textLength,
-        enum DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,
-        UINT8 *bidiLevel) PURE;
-}
-IDWriteTextAnalysisSource1Vtbl;
-
-interface IDWriteTextAnalysisSource1
-{
-    const IDWriteTextAnalysisSource1Vtbl *lpVtbl;
-};
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-__CRT_UUID_DECL(IDWriteTextAnalysisSource1, 0x639cfad8,0x0fb4,0x4b21,0xa5,0x8a,0x06,0x79,0x20,0x12,0x00,0x09);
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextAnalysisSink1
-DECLARE_INTERFACE_(IDWriteTextAnalysisSink1,IDWriteTextAnalysisSink)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD(SetGlyphOrientation)(
-            UINT32 textPosition,
-            UINT32 textLength,
-            DWRITE_GLYPH_ORIENTATION_ANGLE angle,
-            UINT8 adjustedBidilevel,
-            WINBOOL isSideways,
-            WINBOOL isRtl) PURE;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteTextAnalysisSink1Vtbl
-{
-    IDWriteTextAnalysisSinkVtbl Base;
-
-    STDMETHOD(SetGlyphOrientation)(IDWriteTextAnalysisSink1 *This,
-            UINT32 textPosition,
-            UINT32 textLength,
-            enum DWRITE_GLYPH_ORIENTATION_ANGLE angle,
-            UINT8 adjustedBidilevel,
-            WINBOOL isSideways,
-            WINBOOL isRtl) PURE;
-}
-IDWriteTextAnalysisSink1Vtbl;
-
-interface IDWriteTextAnalysisSink1
-{
-    const IDWriteTextAnalysisSink1Vtbl *lpVtbl;
-};
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-__CRT_UUID_DECL(IDWriteTextAnalysisSink1, 0xb0d941a0,0x85e7,0x4d8b,0x9f,0xd3,0x5c,0xed,0x99,0x34,0x48,0x2a);
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextAnalyzer1
-DECLARE_INTERFACE_(IDWriteTextAnalyzer1,IDWriteTextAnalyzer)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD(ApplyCharacterSpacing)(
-        FLOAT leadingSpacing,
-        FLOAT trailingSpacing,
-        FLOAT minimumAdvanceWidth,
-        UINT32 textLength,
-        UINT32 glyphCount,
-        UINT16 const* clusterMap,
-        FLOAT const* glyphAdvances,
-        DWRITE_GLYPH_OFFSET const* glyphOffsets,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProperties,
-        FLOAT* modifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets) PURE;
-
-    STDMETHOD(GetBaseline)(
-        IDWriteFontFace* fontFace,
-        DWRITE_BASELINE baseline,
-        BOOL isVertical,
-        BOOL isSimulationAllowed,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        WCHAR const* localeName,
-        INT32* baselineCoordinate,
-        BOOL* exists
-        ) PURE;
-
-    STDMETHOD(AnalyzeVerticalGlyphOrientation)(
-        IDWriteTextAnalysisSource1* analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteTextAnalysisSink1* analysisSink
-        ) PURE;
-
-    STDMETHOD(GetGlyphOrientationTransform)(
-        DWRITE_GLYPH_ORIENTATION_ANGLE glyphOrientationAngle,
-        BOOL isSideways,
-        DWRITE_MATRIX* transform
-        ) PURE;
-
-    STDMETHOD(GetScriptProperties)(
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        DWRITE_SCRIPT_PROPERTIES* scriptProperties
-        ) PURE;
-
-    STDMETHOD(GetTextComplexity)(
-        WCHAR const* textString,
-        UINT32 textLength,
-        IDWriteFontFace* fontFace,
-        BOOL* isTextSimple,
-        UINT32* textLengthRead,
-        UINT16* glyphIndices
-        ) PURE;
-
-    STDMETHOD(GetJustificationOpportunities)(
-        IDWriteFontFace* fontFace,
-        FLOAT fontEmSize,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        UINT32 textLength,
-        UINT32 glyphCount,
-        WCHAR const* textString,
-        UINT16 const* clusterMap,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProperties,
-        DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities
-        ) PURE;
-
-    STDMETHOD(JustifyGlyphAdvances)(
-        FLOAT lineWidth,
-        UINT32 glyphCount,
-        DWRITE_JUSTIFICATION_OPPORTUNITY const* justificationOpportunities,
-        FLOAT const* glyphAdvances,
-        DWRITE_GLYPH_OFFSET const* glyphOffsets,
-        FLOAT* justifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets
-        ) PURE;
-
-    STDMETHOD(GetJustifiedGlyphs)(
-        IDWriteFontFace* fontFace,
-        FLOAT fontEmSize,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        UINT32 textLength,
-        UINT32 glyphCount,
-        UINT32 maxGlyphCount,
-        UINT16 const* clusterMap,
-        UINT16 const* glyphIndices,
-        FLOAT const* glyphAdvances,
-        FLOAT const* justifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET const* justifiedGlyphOffsets,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProperties,
-        UINT32* actualGlyphCount,
-        UINT16* modifiedClusterMap,
-        UINT16* modifiedGlyphIndices,
-        FLOAT* modifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets
-        ) PURE;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteTextAnalyzer1Vtbl
-{
-    IDWriteTextAnalyzerVtbl Base;
-
-    STDMETHOD(ApplyCharacterSpacing)(IDWriteTextAnalyzer1 *This,
-        FLOAT leadingSpacing,
-        FLOAT trailingSpacing,
-        FLOAT minimumAdvanceWidth,
-        UINT32 textLength,
-        UINT32 glyphCount,
-        UINT16 const* clusterMap,
-        FLOAT const* glyphAdvances,
-        DWRITE_GLYPH_OFFSET const* glyphOffsets,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProperties,
-        FLOAT* modifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets) PURE;
-
-    STDMETHOD(GetBaseline)(IDWriteTextAnalyzer1 *This,
-        IDWriteFontFace* fontFace,
-        enum DWRITE_BASELINE baseline,
-        BOOL isVertical,
-        BOOL isSimulationAllowed,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        WCHAR const* localeName,
-        INT32* baselineCoordinate,
-        BOOL* exists
-        ) PURE;
-
-    STDMETHOD(AnalyzeVerticalGlyphOrientation)(IDWriteTextAnalyzer1 *This,
-        IDWriteTextAnalysisSource1* analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteTextAnalysisSink1* analysisSink
-        ) PURE;
-
-    STDMETHOD(GetGlyphOrientationTransform)(IDWriteTextAnalyzer1 *This,
-        enum DWRITE_GLYPH_ORIENTATION_ANGLE glyphOrientationAngle,
-        BOOL isSideways,
-        DWRITE_MATRIX* transform
-        ) PURE;
-
-    STDMETHOD(GetScriptProperties)(IDWriteTextAnalyzer1 *This,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        struct DWRITE_SCRIPT_PROPERTIES* scriptProperties
-        ) PURE;
-
-    STDMETHOD(GetTextComplexity)(IDWriteTextAnalyzer1 *This,
-        WCHAR const* textString,
-        UINT32 textLength,
-        IDWriteFontFace* fontFace,
-        BOOL* isTextSimple,
-        UINT32* textLengthRead,
-        UINT16* glyphIndices
-        ) PURE;
-
-    STDMETHOD(GetJustificationOpportunities)(IDWriteTextAnalyzer1 *This,
-        IDWriteFontFace* fontFace,
-        FLOAT fontEmSize,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        UINT32 textLength,
-        UINT32 glyphCount,
-        WCHAR const* textString,
-        UINT16 const* clusterMap,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProperties,
-        struct DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities
-        ) PURE;
-
-    STDMETHOD(JustifyGlyphAdvances)(IDWriteTextAnalyzer1 *This,
-        FLOAT lineWidth,
-        UINT32 glyphCount,
-        struct DWRITE_JUSTIFICATION_OPPORTUNITY const* justificationOpportunities,
-        FLOAT const* glyphAdvances,
-        DWRITE_GLYPH_OFFSET const* glyphOffsets,
-        FLOAT* justifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets
-        ) PURE;
-
-    STDMETHOD(GetJustifiedGlyphs)(IDWriteTextAnalyzer1 *This,
-        IDWriteFontFace* fontFace,
-        FLOAT fontEmSize,
-        DWRITE_SCRIPT_ANALYSIS scriptAnalysis,
-        UINT32 textLength,
-        UINT32 glyphCount,
-        UINT32 maxGlyphCount,
-        UINT16 const* clusterMap,
-        UINT16 const* glyphIndices,
-        FLOAT const* glyphAdvances,
-        FLOAT const* justifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET const* justifiedGlyphOffsets,
-        DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProperties,
-        UINT32* actualGlyphCount,
-        UINT16* modifiedClusterMap,
-        UINT16* modifiedGlyphIndices,
-        FLOAT* modifiedGlyphAdvances,
-        DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets
-        ) PURE;
-}
-IDWriteTextAnalyzer1Vtbl;
-
-interface IDWriteTextAnalyzer1
-{
-    const IDWriteTextAnalyzer1Vtbl *lpVtbl;
-};
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-__CRT_UUID_DECL(IDWriteTextAnalyzer1, 0x80dad800,0xe21f,0x4e83,0x4e,0xce,0xbf,0xcc,0xe5,0x00,0xdb,0x7c);
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteTextLayout1
-DECLARE_INTERFACE_(IDWriteTextLayout1,IDWriteTextLayout)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD(SetPairKerning)(WINBOOL isPairKerningEnabled,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(GetPairKerning)(UINT32 position,
-            WINBOOL *isPairKerningEnabled,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(SetCharacterSpacing)(FLOAT leadingSpacing,
-            FLOAT trailingSpacing,
-            FLOAT minimumAdvance,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(GetCharacterSpacing)(FLOAT *leadingSpacing,
-            FLOAT *trailingSpacing,
-            FLOAT *minimumAdvance,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteTextLayout1Vtbl
-{
-    IDWriteTextLayoutVtbl Base;
-
-    STDMETHOD(SetPairKerning)(IDWriteTextLayout1 *This,
-            WINBOOL isPairKerningEnabled,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(GetPairKerning)(IDWriteTextLayout1 *This,
-            UINT32 position,
-            WINBOOL *isPairKerningEnabled,
-            DWRITE_TEXT_RANGE *textRange) PURE;
-    STDMETHOD(SetCharacterSpacing)(IDWriteTextLayout1 *This,
-            FLOAT leadingSpacing,
-            FLOAT trailingSpacing,
-            FLOAT minimumAdvance,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(GetCharacterSpacing)(IDWriteTextLayout1 *This,
-            FLOAT *leadingSpacing,
-            FLOAT *trailingSpacing,
-            FLOAT *minimumAdvance,
-            DWRITE_TEXT_RANGE *textRange) PURE;
-}
-IDWriteTextLayout1Vtbl;
-
-interface IDWriteTextLayout1
-{
-    const IDWriteTextLayout1Vtbl *lpVtbl;
-};
-
-#endif  /* D2D_USE_C_DEFINITIONS */
-
-__CRT_UUID_DECL(IDWriteTextLayout1, 0x9064d822,0x80a7,0x465c,0xa9,0x86,0xdf,0x65,0xf7,0x8b,0x8f,0xeb)
-
-#ifndef D2D_USE_C_DEFINITIONS
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFactory1
-DECLARE_INTERFACE_(IDWriteFactory1,IDWriteFactory)
-{
-    BEGIN_INTERFACE
-
-    STDMETHOD(GetEudcFontCollection)(IDWriteFontCollection **fontCollection,
-        BOOL checkForUpdates __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(CreateCustomRenderingParams)(FLOAT gamma,
-        FLOAT enhancedContrast,
-        FLOAT enhancedContrastGrayscale,
-        FLOAT clearTypeLevel,
-        DWRITE_PIXEL_GEOMETRY pixelGeometry,
-        DWRITE_RENDERING_MODE renderingMode,
-        IDWriteRenderingParams1 **renderingParams) PURE;
-
-    using IDWriteFactory::CreateCustomRenderingParams;
-
-    END_INTERFACE
-};
-
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteFactory1Vtbl
-{
-    IDWriteFactoryVtbl Base;
-
-    STDMETHOD(GetEudcFontCollection)(IDWriteFactory1 *This,
-        IDWriteFontCollection **fontCollection,
-        BOOL checkForUpdates) PURE;
-
-    STDMETHOD(CreateCustomRenderingParams)(IDWriteFactory1 *This,
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory1 *This,
         FLOAT gamma,
         FLOAT enhancedContrast,
-        FLOAT enhancedContrastGrayscale,
-        FLOAT clearTypeLevel,
-        DWRITE_PIXEL_GEOMETRY pixelGeometry,
-        DWRITE_RENDERING_MODE renderingMode,
-        IDWriteRenderingParams1 **renderingParams) PURE;
-}
-IDWriteFactory1Vtbl;
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
 
-interface IDWriteFactory1
-{
-    const IDWriteFactory1Vtbl *lpVtbl;
-};
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory1 *This,
+        IDWriteFontFileLoader *loader);
 
-#endif  /* D2D_USE_C_DEFINITIONS */
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory1 *This,
+        IDWriteFontFileLoader *loader);
 
-DEFINE_GUID(IID_IDWriteFactory1, 0x30572f99,0xdac6,0x41db,0xa1,0x6e,0x04,0x86,0x30,0x7e,0x60,0x6a);
-__CRT_UUID_DECL(IDWriteFactory1, 0x30572f99,0xdac6,0x41db,0xa1,0x6e,0x04,0x86,0x30,0x7e,0x60,0x6a)
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory1 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
 
-#ifndef D2D_USE_C_DEFINITIONS
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory1 *This,
+        IDWriteTypography **typography);
 
-#undef  INTERFACE
-#define INTERFACE IDWriteBitmapRenderTarget1
-DECLARE_INTERFACE_(IDWriteBitmapRenderTarget1,IDWriteBitmapRenderTarget)
-{
-    BEGIN_INTERFACE
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory1 *This,
+        IDWriteGdiInterop **gdi_interop);
 
-    STDMETHOD_(DWRITE_TEXT_ANTIALIAS_MODE, GetTextAntialiasMode)(void) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory1 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
 
-    STDMETHOD(SetTextAntialiasMode)(
-        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory1 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory1 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory1 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory1 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory1 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory1 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory1 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
 
     END_INTERFACE
+} IDWriteFactory1Vtbl;
+
+interface IDWriteFactory1 {
+    CONST_VTBL IDWriteFactory1Vtbl* lpVtbl;
 };
 
-#else  /* D2D_USE_C_DEFINITIONS */
-
-typedef struct IDWriteBitmapRenderTarget1Vtbl
-{
-    IDWriteBitmapRenderTargetVtbl Base;
-
-    STDMETHOD_(enum DWRITE_TEXT_ANTIALIAS_MODE, GetTextAntialiasMode)(IDWriteBitmapRenderTarget1 *This) PURE;
-
-    STDMETHOD(SetTextAntialiasMode)(IDWriteBitmapRenderTarget1 *This,
-        enum DWRITE_TEXT_ANTIALIAS_MODE antialiasMode) PURE;
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory1_GetSystemFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetSystemFontCollection(This,collection,check_for_updates)
+#define IDWriteFactory1_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory1_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory1_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory1_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory1_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory1_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory1_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory1_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory1_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory1_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory1_CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format) (This)->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format)
+#define IDWriteFactory1_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory1_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory1_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory1_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory1_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory1_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory1_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+#define IDWriteFactory1_CreateGlyphRunAnalysis(This,glyph_run,pixels_per_dip,transform,rendering_mode,measuring_mode,baseline_x,baseline_y,analysis) (This)->lpVtbl->CreateGlyphRunAnalysis(This,glyph_run,pixels_per_dip,transform,rendering_mode,measuring_mode,baseline_x,baseline_y,analysis)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory1_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+#define IDWriteFactory1_CreateCustomRenderingParams(This,gamma,enhcontrast,enhcontrast_grayscale,cleartype_level,geometry,mode,params) (This)->lpVtbl->IDWriteFactory1_CreateCustomRenderingParams(This,gamma,enhcontrast,enhcontrast_grayscale,cleartype_level,geometry,mode,params)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory1_QueryInterface(IDWriteFactory1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-IDWriteBitmapRenderTarget1Vtbl;
+static FORCEINLINE ULONG IDWriteFactory1_AddRef(IDWriteFactory1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory1_Release(IDWriteFactory1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory1_GetSystemFontCollection(IDWriteFactory1* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetSystemFontCollection(This,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateCustomFontCollection(IDWriteFactory1* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_RegisterFontCollectionLoader(IDWriteFactory1* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_UnregisterFontCollectionLoader(IDWriteFactory1* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateFontFileReference(IDWriteFactory1* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateCustomFontFileReference(IDWriteFactory1* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateFontFace(IDWriteFactory1* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateRenderingParams(IDWriteFactory1* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateMonitorRenderingParams(IDWriteFactory1* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_RegisterFontFileLoader(IDWriteFactory1* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_UnregisterFontFileLoader(IDWriteFactory1* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateTextFormat(IDWriteFactory1* This,const WCHAR *family_name,IDWriteFontCollection *collection,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STYLE style,DWRITE_FONT_STRETCH stretch,FLOAT size,const WCHAR *locale,IDWriteTextFormat **format) {
+    return This->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateTypography(IDWriteFactory1* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_GetGdiInterop(IDWriteFactory1* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateTextLayout(IDWriteFactory1* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateGdiCompatibleTextLayout(IDWriteFactory1* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateEllipsisTrimmingSign(IDWriteFactory1* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateTextAnalyzer(IDWriteFactory1* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateNumberSubstitution(IDWriteFactory1* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateGlyphRunAnalysis(IDWriteFactory1* This,const DWRITE_GLYPH_RUN *glyph_run,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE rendering_mode,DWRITE_MEASURING_MODE measuring_mode,FLOAT baseline_x,FLOAT baseline_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->CreateGlyphRunAnalysis(This,glyph_run,pixels_per_dip,transform,rendering_mode,measuring_mode,baseline_x,baseline_y,analysis);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory1_GetEudcFontCollection(IDWriteFactory1* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory1_CreateCustomRenderingParams(IDWriteFactory1* This,FLOAT gamma,FLOAT enhcontrast,FLOAT enhcontrast_grayscale,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY geometry,DWRITE_RENDERING_MODE mode,IDWriteRenderingParams1 **params) {
+    return This->lpVtbl->IDWriteFactory1_CreateCustomRenderingParams(This,gamma,enhcontrast,enhcontrast_grayscale,cleartype_level,geometry,mode,params);
+}
+#endif
+#endif
 
-interface IDWriteBitmapRenderTarget1
+#endif
+
+
+#endif  /* __IDWriteFactory1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFace1 interface
+ */
+#ifndef __IDWriteFontFace1_INTERFACE_DEFINED__
+#define __IDWriteFontFace1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFace1, 0xa71efdb4, 0x9fdb, 0x4838, 0xad,0x90, 0xcf,0xc3,0xbe,0x8c,0x3d,0xaf);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a71efdb4-9fdb-4838-ad90-cfc3be8c3daf")
+IDWriteFontFace1 : public IDWriteFontFace
 {
-    const IDWriteBitmapRenderTarget1Vtbl *lpVtbl;
+    virtual void STDMETHODCALLTYPE GetMetrics(
+        DWRITE_FONT_METRICS1 *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGdiCompatibleMetrics(
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS1 *metrics) = 0;
+
+    virtual void STDMETHODCALLTYPE GetCaretMetrics(
+        DWRITE_CARET_METRICS *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetUnicodeRanges(
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsMonospacedFont(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDesignGlyphAdvances(
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances,
+        WINBOOL is_sideways = FALSE) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGdiCompatibleGlyphAdvances(
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetKerningPairAdjustments(
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *adjustments) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE HasKerningPairs(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRecommendedRenderingMode(
+        FLOAT font_emsize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_RENDERING_MODE *rendering_mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetVerticalGlyphVariants(
+        UINT32 glyph_count,
+        const UINT16 *nominal_indices,
+        UINT16 *vertical_indices) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE HasVerticalGlyphVariants(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFace1, 0xa71efdb4, 0x9fdb, 0x4838, 0xad,0x90, 0xcf,0xc3,0xbe,0x8c,0x3d,0xaf)
+#endif
+#else
+typedef struct IDWriteFontFace1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFace1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFace1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFace1 *This);
+
+    /*** IDWriteFontFace methods ***/
+    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
+        IDWriteFontFace1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiles)(
+        IDWriteFontFace1 *This,
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles);
+
+    UINT32 (STDMETHODCALLTYPE *GetIndex)(
+        IDWriteFontFace1 *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFace1 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFontFace1 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFontFace1 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
+        IDWriteFontFace1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
+        IDWriteFontFace1 *This,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
+        IDWriteFontFace1 *This,
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
+        IDWriteFontFace1 *This,
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists);
+
+    void (STDMETHODCALLTYPE *ReleaseFontTable)(
+        IDWriteFontFace1 *This,
+        void *table_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
+        IDWriteFontFace1 *This,
+        FLOAT emSize,
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
+
+    HRESULT (STDMETHODCALLTYPE *GetRecommendedRenderingMode)(
+        IDWriteFontFace1 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
+        IDWriteFontFace1 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
+        IDWriteFontFace1 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    /*** IDWriteFontFace1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFontFace1_GetMetrics)(
+        IDWriteFontFace1 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
+        IDWriteFontFace1 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetCaretMetrics)(
+        IDWriteFontFace1 *This,
+        DWRITE_CARET_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFontFace1 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFontFace1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
+        IDWriteFontFace1 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
+        IDWriteFontFace1 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances);
+
+    HRESULT (STDMETHODCALLTYPE *GetKerningPairAdjustments)(
+        IDWriteFontFace1 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *adjustments);
+
+    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
+        IDWriteFontFace1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
+        IDWriteFontFace1 *This,
+        FLOAT font_emsize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetVerticalGlyphVariants)(
+        IDWriteFontFace1 *This,
+        UINT32 glyph_count,
+        const UINT16 *nominal_indices,
+        UINT16 *vertical_indices);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
+        IDWriteFontFace1 *This);
+
+    END_INTERFACE
+} IDWriteFontFace1Vtbl;
+
+interface IDWriteFontFace1 {
+    CONST_VTBL IDWriteFontFace1Vtbl* lpVtbl;
 };
 
-#endif  /* D2D_USE_C_DEFINITIONS */
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFace1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFace1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFace1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFace methods ***/
+#define IDWriteFontFace1_GetType(This) (This)->lpVtbl->GetType(This)
+#define IDWriteFontFace1_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
+#define IDWriteFontFace1_GetIndex(This) (This)->lpVtbl->GetIndex(This)
+#define IDWriteFontFace1_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFace1_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFontFace1_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
+#define IDWriteFontFace1_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
+#define IDWriteFontFace1_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
+#define IDWriteFontFace1_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
+#define IDWriteFontFace1_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
+#define IDWriteFontFace1_GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink)
+#define IDWriteFontFace1_GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways)
+/*** IDWriteFontFace1 methods ***/
+#define IDWriteFontFace1_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
+#define IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
+#define IDWriteFontFace1_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
+#define IDWriteFontFace1_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFontFace1_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+#define IDWriteFontFace1_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
+#define IDWriteFontFace1_GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances) (This)->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances)
+#define IDWriteFontFace1_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
+#define IDWriteFontFace1_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
+#define IDWriteFontFace1_GetRecommendedRenderingMode(This,font_emsize,dpiX,dpiY,transform,is_sideways,threshold,measuring_mode,rendering_mode) (This)->lpVtbl->IDWriteFontFace1_GetRecommendedRenderingMode(This,font_emsize,dpiX,dpiY,transform,is_sideways,threshold,measuring_mode,rendering_mode)
+#define IDWriteFontFace1_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
+#define IDWriteFontFace1_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace1_QueryInterface(IDWriteFontFace1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFace1_AddRef(IDWriteFontFace1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFace1_Release(IDWriteFontFace1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFace methods ***/
+static FORCEINLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace1_GetType(IDWriteFontFace1* This) {
+    return This->lpVtbl->GetType(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetFiles(IDWriteFontFace1* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
+    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
+}
+static FORCEINLINE UINT32 IDWriteFontFace1_GetIndex(IDWriteFontFace1* This) {
+    return This->lpVtbl->GetIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace1_GetSimulations(IDWriteFontFace1* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace1_IsSymbolFont(IDWriteFontFace1* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE UINT16 IDWriteFontFace1_GetGlyphCount(IDWriteFontFace1* This) {
+    return This->lpVtbl->GetGlyphCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetDesignGlyphMetrics(IDWriteFontFace1* This,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetGlyphIndices(IDWriteFontFace1* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
+    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_TryGetFontTable(IDWriteFontFace1* This,UINT32 table_tag,const void **table_data,UINT32 *table_size,void **context,WINBOOL *exists) {
+    return This->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists);
+}
+static FORCEINLINE void IDWriteFontFace1_ReleaseFontTable(IDWriteFontFace1* This,void *table_context) {
+    This->lpVtbl->ReleaseFontTable(This,table_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetGlyphRunOutline(IDWriteFontFace1* This,FLOAT emSize,const UINT16 *glyph_indices,const FLOAT *glyph_advances,const DWRITE_GLYPH_OFFSET *glyph_offsets,UINT32 glyph_count,WINBOOL is_sideways,WINBOOL is_rtl,IDWriteGeometrySink *geometrysink) {
+    return This->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetGdiCompatibleGlyphMetrics(IDWriteFontFace1* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways);
+}
+/*** IDWriteFontFace1 methods ***/
+static FORCEINLINE void IDWriteFontFace1_GetMetrics(IDWriteFontFace1* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetGdiCompatibleMetrics(IDWriteFontFace1* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_FONT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics);
+}
+static FORCEINLINE void IDWriteFontFace1_GetCaretMetrics(IDWriteFontFace1* This,DWRITE_CARET_METRICS *metrics) {
+    This->lpVtbl->GetCaretMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetUnicodeRanges(IDWriteFontFace1* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace1_IsMonospacedFont(IDWriteFontFace1* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetDesignGlyphAdvances(IDWriteFontFace1* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetGdiCompatibleGlyphAdvances(IDWriteFontFace1* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,UINT32 glyph_count,const UINT16 *indices,INT32 *advances) {
+    return This->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetKerningPairAdjustments(IDWriteFontFace1* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
+    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace1_HasKerningPairs(IDWriteFontFace1* This) {
+    return This->lpVtbl->HasKerningPairs(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetRecommendedRenderingMode(IDWriteFontFace1* This,FLOAT font_emsize,FLOAT dpiX,FLOAT dpiY,const DWRITE_MATRIX *transform,WINBOOL is_sideways,DWRITE_OUTLINE_THRESHOLD threshold,DWRITE_MEASURING_MODE measuring_mode,DWRITE_RENDERING_MODE *rendering_mode) {
+    return This->lpVtbl->IDWriteFontFace1_GetRecommendedRenderingMode(This,font_emsize,dpiX,dpiY,transform,is_sideways,threshold,measuring_mode,rendering_mode);
+}
+static FORCEINLINE HRESULT IDWriteFontFace1_GetVerticalGlyphVariants(IDWriteFontFace1* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
+    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace1_HasVerticalGlyphVariants(IDWriteFontFace1* This) {
+    return This->lpVtbl->HasVerticalGlyphVariants(This);
+}
+#endif
+#endif
 
-__CRT_UUID_DECL(IDWriteBitmapRenderTarget1, 0x791e8298,0x3ef3,0x4230,0x98,0x80,0xc9,0xbd,0xec,0xc4,0x20,0x64)
+#endif
 
-#endif /* DWRITE_1_H_INCLUDED */
+
+#endif  /* __IDWriteFontFace1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFont1 interface
+ */
+#ifndef __IDWriteFont1_INTERFACE_DEFINED__
+#define __IDWriteFont1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFont1, 0xacd16696, 0x8c14, 0x4f5d, 0x87,0x7e, 0xfe,0x3f,0xc1,0xd3,0x27,0x38);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32738")
+IDWriteFont1 : public IDWriteFont
+{
+    virtual void STDMETHODCALLTYPE GetMetrics(
+        DWRITE_FONT_METRICS1 *metrics) = 0;
+
+    virtual void STDMETHODCALLTYPE GetPanose(
+        DWRITE_PANOSE *panose) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetUnicodeRanges(
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsMonospacedFont(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFont1, 0xacd16696, 0x8c14, 0x4f5d, 0x87,0x7e, 0xfe,0x3f,0xc1,0xd3,0x27,0x38)
+#endif
+#else
+typedef struct IDWriteFont1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFont1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFont1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFont1 *This);
+
+    /*** IDWriteFont methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFont1 *This,
+        IDWriteFontFamily **family);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFont1 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFont1 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFont1 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFont1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFont1 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFont1 *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFont1 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFont1 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFont1 *This,
+        UINT32 value,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFont1 *This,
+        IDWriteFontFace **face);
+
+    /*** IDWriteFont1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFont1_GetMetrics)(
+        IDWriteFont1 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetPanose)(
+        IDWriteFont1 *This,
+        DWRITE_PANOSE *panose);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFont1 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFont1 *This);
+
+    END_INTERFACE
+} IDWriteFont1Vtbl;
+
+interface IDWriteFont1 {
+    CONST_VTBL IDWriteFont1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFont1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFont1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFont1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFont methods ***/
+#define IDWriteFont1_GetFontFamily(This,family) (This)->lpVtbl->GetFontFamily(This,family)
+#define IDWriteFont1_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFont1_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFont1_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFont1_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFont1_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFont1_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFont1_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFont1_HasCharacter(This,value,exists) (This)->lpVtbl->HasCharacter(This,value,exists)
+#define IDWriteFont1_CreateFontFace(This,face) (This)->lpVtbl->CreateFontFace(This,face)
+/*** IDWriteFont1 methods ***/
+#define IDWriteFont1_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFont1_GetMetrics(This,metrics)
+#define IDWriteFont1_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
+#define IDWriteFont1_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFont1_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFont1_QueryInterface(IDWriteFont1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFont1_AddRef(IDWriteFont1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFont1_Release(IDWriteFont1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFont methods ***/
+static FORCEINLINE HRESULT IDWriteFont1_GetFontFamily(IDWriteFont1* This,IDWriteFontFamily **family) {
+    return This->lpVtbl->GetFontFamily(This,family);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFont1_GetWeight(IDWriteFont1* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFont1_GetStretch(IDWriteFont1* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFont1_GetStyle(IDWriteFont1* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE WINBOOL IDWriteFont1_IsSymbolFont(IDWriteFont1* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFont1_GetFaceNames(IDWriteFont1* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFont1_GetInformationalStrings(IDWriteFont1* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFont1_GetSimulations(IDWriteFont1* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE HRESULT IDWriteFont1_HasCharacter(IDWriteFont1* This,UINT32 value,WINBOOL *exists) {
+    return This->lpVtbl->HasCharacter(This,value,exists);
+}
+static FORCEINLINE HRESULT IDWriteFont1_CreateFontFace(IDWriteFont1* This,IDWriteFontFace **face) {
+    return This->lpVtbl->CreateFontFace(This,face);
+}
+/*** IDWriteFont1 methods ***/
+static FORCEINLINE void IDWriteFont1_GetMetrics(IDWriteFont1* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFont1_GetMetrics(This,metrics);
+}
+static FORCEINLINE void IDWriteFont1_GetPanose(IDWriteFont1* This,DWRITE_PANOSE *panose) {
+    This->lpVtbl->GetPanose(This,panose);
+}
+static FORCEINLINE HRESULT IDWriteFont1_GetUnicodeRanges(IDWriteFont1* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFont1_IsMonospacedFont(IDWriteFont1* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFont1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteRenderingParams1 interface
+ */
+#ifndef __IDWriteRenderingParams1_INTERFACE_DEFINED__
+#define __IDWriteRenderingParams1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteRenderingParams1, 0x94413cf4, 0xa6fc, 0x4248, 0x8b,0x50, 0x66,0x74,0x34,0x8f,0xca,0xd3);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("94413cf4-a6fc-4248-8b50-6674348fcad3")
+IDWriteRenderingParams1 : public IDWriteRenderingParams
+{
+    virtual FLOAT STDMETHODCALLTYPE GetGrayscaleEnhancedContrast(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteRenderingParams1, 0x94413cf4, 0xa6fc, 0x4248, 0x8b,0x50, 0x66,0x74,0x34,0x8f,0xca,0xd3)
+#endif
+#else
+typedef struct IDWriteRenderingParams1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteRenderingParams1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteRenderingParams1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteRenderingParams1 *This);
+
+    /*** IDWriteRenderingParams methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGamma)(
+        IDWriteRenderingParams1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetEnhancedContrast)(
+        IDWriteRenderingParams1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetClearTypeLevel)(
+        IDWriteRenderingParams1 *This);
+
+    DWRITE_PIXEL_GEOMETRY (STDMETHODCALLTYPE *GetPixelGeometry)(
+        IDWriteRenderingParams1 *This);
+
+    DWRITE_RENDERING_MODE (STDMETHODCALLTYPE *GetRenderingMode)(
+        IDWriteRenderingParams1 *This);
+
+    /*** IDWriteRenderingParams1 methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGrayscaleEnhancedContrast)(
+        IDWriteRenderingParams1 *This);
+
+    END_INTERFACE
+} IDWriteRenderingParams1Vtbl;
+
+interface IDWriteRenderingParams1 {
+    CONST_VTBL IDWriteRenderingParams1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteRenderingParams1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteRenderingParams1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteRenderingParams1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteRenderingParams methods ***/
+#define IDWriteRenderingParams1_GetGamma(This) (This)->lpVtbl->GetGamma(This)
+#define IDWriteRenderingParams1_GetEnhancedContrast(This) (This)->lpVtbl->GetEnhancedContrast(This)
+#define IDWriteRenderingParams1_GetClearTypeLevel(This) (This)->lpVtbl->GetClearTypeLevel(This)
+#define IDWriteRenderingParams1_GetPixelGeometry(This) (This)->lpVtbl->GetPixelGeometry(This)
+#define IDWriteRenderingParams1_GetRenderingMode(This) (This)->lpVtbl->GetRenderingMode(This)
+/*** IDWriteRenderingParams1 methods ***/
+#define IDWriteRenderingParams1_GetGrayscaleEnhancedContrast(This) (This)->lpVtbl->GetGrayscaleEnhancedContrast(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteRenderingParams1_QueryInterface(IDWriteRenderingParams1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams1_AddRef(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams1_Release(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteRenderingParams methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams1_GetGamma(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->GetGamma(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams1_GetEnhancedContrast(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->GetEnhancedContrast(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams1_GetClearTypeLevel(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->GetClearTypeLevel(This);
+}
+static FORCEINLINE DWRITE_PIXEL_GEOMETRY IDWriteRenderingParams1_GetPixelGeometry(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->GetPixelGeometry(This);
+}
+static FORCEINLINE DWRITE_RENDERING_MODE IDWriteRenderingParams1_GetRenderingMode(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->GetRenderingMode(This);
+}
+/*** IDWriteRenderingParams1 methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams1_GetGrayscaleEnhancedContrast(IDWriteRenderingParams1* This) {
+    return This->lpVtbl->GetGrayscaleEnhancedContrast(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteRenderingParams1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalyzer1 interface
+ */
+#ifndef __IDWriteTextAnalyzer1_INTERFACE_DEFINED__
+#define __IDWriteTextAnalyzer1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalyzer1, 0x80dad800, 0xe21f, 0x4e83, 0x96,0xce, 0xbf,0xcc,0xe5,0x00,0xdb,0x7c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("80dad800-e21f-4e83-96ce-bfcce500db7c")
+IDWriteTextAnalyzer1 : public IDWriteTextAnalyzer
+{
+    virtual HRESULT STDMETHODCALLTYPE ApplyCharacterSpacing(
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT min_advance_width,
+        UINT32 len,
+        UINT32 glyph_count,
+        const UINT16 *clustermap,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *props,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetBaseline(
+        IDWriteFontFace *face,
+        DWRITE_BASELINE baseline,
+        WINBOOL vertical,
+        WINBOOL is_simulation_allowed,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        const WCHAR *localeName,
+        INT32 *baseline_coord,
+        WINBOOL *exists) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AnalyzeVerticalGlyphOrientation(
+        IDWriteTextAnalysisSource1 *source,
+        UINT32 text_pos,
+        UINT32 len,
+        IDWriteTextAnalysisSink1 *sink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphOrientationTransform(
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        WINBOOL is_sideways,
+        DWRITE_MATRIX *transform) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScriptProperties(
+        DWRITE_SCRIPT_ANALYSIS sa,
+        DWRITE_SCRIPT_PROPERTIES *props) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTextComplexity(
+        const WCHAR *text,
+        UINT32 len,
+        IDWriteFontFace *face,
+        WINBOOL *is_simple,
+        UINT32 *len_read,
+        UINT16 *indices) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetJustificationOpportunities(
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        DWRITE_JUSTIFICATION_OPPORTUNITY *jo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE JustifyGlyphAdvances(
+        FLOAT width,
+        UINT32 glyph_count,
+        const DWRITE_JUSTIFICATION_OPPORTUNITY *jo,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        FLOAT *justifiedadvances,
+        DWRITE_GLYPH_OFFSET *justifiedoffsets) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetJustifiedGlyphs(
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        UINT32 max_glyphcount,
+        const UINT16 *clustermap,
+        const UINT16 *indices,
+        const FLOAT *advances,
+        const FLOAT *justifiedadvances,
+        const DWRITE_GLYPH_OFFSET *justifiedoffsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        UINT32 *actual_count,
+        UINT16 *modified_clustermap,
+        UINT16 *modified_indices,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalyzer1, 0x80dad800, 0xe21f, 0x4e83, 0x96,0xce, 0xbf,0xcc,0xe5,0x00,0xdb,0x7c)
+#endif
+#else
+typedef struct IDWriteTextAnalyzer1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalyzer1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalyzer1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalyzer1 *This);
+
+    /*** IDWriteTextAnalyzer methods ***/
+    HRESULT (STDMETHODCALLTYPE *AnalyzeScript)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeBidi)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeNumberSubstitution)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeLineBreakpoints)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphs)(
+        IDWriteTextAnalyzer1 *This,
+        const WCHAR *text,
+        UINT32 length,
+        IDWriteFontFace *font_face,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        IDWriteNumberSubstitution *substitution,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        UINT32 max_glyph_count,
+        UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *text_props,
+        UINT16 *glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 *actual_glyph_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphPlacements)(
+        IDWriteTextAnalyzer1 *This,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphPlacements)(
+        IDWriteTextAnalyzer1 *This,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_lengths,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets);
+
+    /*** IDWriteTextAnalyzer1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *ApplyCharacterSpacing)(
+        IDWriteTextAnalyzer1 *This,
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT min_advance_width,
+        UINT32 len,
+        UINT32 glyph_count,
+        const UINT16 *clustermap,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *props,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetBaseline)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteFontFace *face,
+        DWRITE_BASELINE baseline,
+        WINBOOL vertical,
+        WINBOOL is_simulation_allowed,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        const WCHAR *localeName,
+        INT32 *baseline_coord,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeVerticalGlyphOrientation)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteTextAnalysisSource1 *source,
+        UINT32 text_pos,
+        UINT32 len,
+        IDWriteTextAnalysisSink1 *sink);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphOrientationTransform)(
+        IDWriteTextAnalyzer1 *This,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        WINBOOL is_sideways,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptProperties)(
+        IDWriteTextAnalyzer1 *This,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        DWRITE_SCRIPT_PROPERTIES *props);
+
+    HRESULT (STDMETHODCALLTYPE *GetTextComplexity)(
+        IDWriteTextAnalyzer1 *This,
+        const WCHAR *text,
+        UINT32 len,
+        IDWriteFontFace *face,
+        WINBOOL *is_simple,
+        UINT32 *len_read,
+        UINT16 *indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetJustificationOpportunities)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        DWRITE_JUSTIFICATION_OPPORTUNITY *jo);
+
+    HRESULT (STDMETHODCALLTYPE *JustifyGlyphAdvances)(
+        IDWriteTextAnalyzer1 *This,
+        FLOAT width,
+        UINT32 glyph_count,
+        const DWRITE_JUSTIFICATION_OPPORTUNITY *jo,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        FLOAT *justifiedadvances,
+        DWRITE_GLYPH_OFFSET *justifiedoffsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetJustifiedGlyphs)(
+        IDWriteTextAnalyzer1 *This,
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        UINT32 max_glyphcount,
+        const UINT16 *clustermap,
+        const UINT16 *indices,
+        const FLOAT *advances,
+        const FLOAT *justifiedadvances,
+        const DWRITE_GLYPH_OFFSET *justifiedoffsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        UINT32 *actual_count,
+        UINT16 *modified_clustermap,
+        UINT16 *modified_indices,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets);
+
+    END_INTERFACE
+} IDWriteTextAnalyzer1Vtbl;
+
+interface IDWriteTextAnalyzer1 {
+    CONST_VTBL IDWriteTextAnalyzer1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalyzer1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalyzer1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalyzer1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalyzer methods ***/
+#define IDWriteTextAnalyzer1_AnalyzeScript(This,source,position,length,sink) (This)->lpVtbl->AnalyzeScript(This,source,position,length,sink)
+#define IDWriteTextAnalyzer1_AnalyzeBidi(This,source,position,length,sink) (This)->lpVtbl->AnalyzeBidi(This,source,position,length,sink)
+#define IDWriteTextAnalyzer1_AnalyzeNumberSubstitution(This,source,position,length,sink) (This)->lpVtbl->AnalyzeNumberSubstitution(This,source,position,length,sink)
+#define IDWriteTextAnalyzer1_AnalyzeLineBreakpoints(This,source,position,length,sink) (This)->lpVtbl->AnalyzeLineBreakpoints(This,source,position,length,sink)
+#define IDWriteTextAnalyzer1_GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count) (This)->lpVtbl->GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count)
+#define IDWriteTextAnalyzer1_GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets) (This)->lpVtbl->GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets)
+#define IDWriteTextAnalyzer1_GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets) (This)->lpVtbl->GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets)
+/*** IDWriteTextAnalyzer1 methods ***/
+#define IDWriteTextAnalyzer1_ApplyCharacterSpacing(This,leading_spacing,trailing_spacing,min_advance_width,len,glyph_count,clustermap,advances,offsets,props,modified_advances,modified_offsets) (This)->lpVtbl->ApplyCharacterSpacing(This,leading_spacing,trailing_spacing,min_advance_width,len,glyph_count,clustermap,advances,offsets,props,modified_advances,modified_offsets)
+#define IDWriteTextAnalyzer1_GetBaseline(This,face,baseline,vertical,is_simulation_allowed,sa,localeName,baseline_coord,exists) (This)->lpVtbl->GetBaseline(This,face,baseline,vertical,is_simulation_allowed,sa,localeName,baseline_coord,exists)
+#define IDWriteTextAnalyzer1_AnalyzeVerticalGlyphOrientation(This,source,text_pos,len,sink) (This)->lpVtbl->AnalyzeVerticalGlyphOrientation(This,source,text_pos,len,sink)
+#define IDWriteTextAnalyzer1_GetGlyphOrientationTransform(This,angle,is_sideways,transform) (This)->lpVtbl->GetGlyphOrientationTransform(This,angle,is_sideways,transform)
+#define IDWriteTextAnalyzer1_GetScriptProperties(This,sa,props) (This)->lpVtbl->GetScriptProperties(This,sa,props)
+#define IDWriteTextAnalyzer1_GetTextComplexity(This,text,len,face,is_simple,len_read,indices) (This)->lpVtbl->GetTextComplexity(This,text,len,face,is_simple,len_read,indices)
+#define IDWriteTextAnalyzer1_GetJustificationOpportunities(This,face,font_em_size,sa,length,glyph_count,text,clustermap,prop,jo) (This)->lpVtbl->GetJustificationOpportunities(This,face,font_em_size,sa,length,glyph_count,text,clustermap,prop,jo)
+#define IDWriteTextAnalyzer1_JustifyGlyphAdvances(This,width,glyph_count,jo,advances,offsets,justifiedadvances,justifiedoffsets) (This)->lpVtbl->JustifyGlyphAdvances(This,width,glyph_count,jo,advances,offsets,justifiedadvances,justifiedoffsets)
+#define IDWriteTextAnalyzer1_GetJustifiedGlyphs(This,face,font_em_size,sa,length,glyph_count,max_glyphcount,clustermap,indices,advances,justifiedadvances,justifiedoffsets,prop,actual_count,modified_clustermap,modified_indices,modified_advances,modified_offsets) (This)->lpVtbl->GetJustifiedGlyphs(This,face,font_em_size,sa,length,glyph_count,max_glyphcount,clustermap,indices,advances,justifiedadvances,justifiedoffsets,prop,actual_count,modified_clustermap,modified_indices,modified_advances,modified_offsets)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_QueryInterface(IDWriteTextAnalyzer1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalyzer1_AddRef(IDWriteTextAnalyzer1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalyzer1_Release(IDWriteTextAnalyzer1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalyzer methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_AnalyzeScript(IDWriteTextAnalyzer1* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeScript(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_AnalyzeBidi(IDWriteTextAnalyzer1* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeBidi(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_AnalyzeNumberSubstitution(IDWriteTextAnalyzer1* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeNumberSubstitution(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_AnalyzeLineBreakpoints(IDWriteTextAnalyzer1* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeLineBreakpoints(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetGlyphs(IDWriteTextAnalyzer1* This,const WCHAR *text,UINT32 length,IDWriteFontFace *font_face,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,IDWriteNumberSubstitution *substitution,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_len,UINT32 feature_ranges,UINT32 max_glyph_count,UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *text_props,UINT16 *glyph_indices,DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 *actual_glyph_count) {
+    return This->lpVtbl->GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetGlyphPlacements(IDWriteTextAnalyzer1* This,const WCHAR *text,const UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *props,UINT32 text_len,const UINT16 *glyph_indices,const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 glyph_count,IDWriteFontFace *font_face,FLOAT fontEmSize,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_len,UINT32 feature_ranges,FLOAT *glyph_advances,DWRITE_GLYPH_OFFSET *glyph_offsets) {
+    return This->lpVtbl->GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetGdiCompatibleGlyphPlacements(IDWriteTextAnalyzer1* This,const WCHAR *text,const UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *props,UINT32 text_len,const UINT16 *glyph_indices,const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 glyph_count,IDWriteFontFace *font_face,FLOAT fontEmSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_lengths,UINT32 feature_ranges,FLOAT *glyph_advances,DWRITE_GLYPH_OFFSET *glyph_offsets) {
+    return This->lpVtbl->GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets);
+}
+/*** IDWriteTextAnalyzer1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_ApplyCharacterSpacing(IDWriteTextAnalyzer1* This,FLOAT leading_spacing,FLOAT trailing_spacing,FLOAT min_advance_width,UINT32 len,UINT32 glyph_count,const UINT16 *clustermap,const FLOAT *advances,const DWRITE_GLYPH_OFFSET *offsets,const DWRITE_SHAPING_GLYPH_PROPERTIES *props,FLOAT *modified_advances,DWRITE_GLYPH_OFFSET *modified_offsets) {
+    return This->lpVtbl->ApplyCharacterSpacing(This,leading_spacing,trailing_spacing,min_advance_width,len,glyph_count,clustermap,advances,offsets,props,modified_advances,modified_offsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetBaseline(IDWriteTextAnalyzer1* This,IDWriteFontFace *face,DWRITE_BASELINE baseline,WINBOOL vertical,WINBOOL is_simulation_allowed,DWRITE_SCRIPT_ANALYSIS sa,const WCHAR *localeName,INT32 *baseline_coord,WINBOOL *exists) {
+    return This->lpVtbl->GetBaseline(This,face,baseline,vertical,is_simulation_allowed,sa,localeName,baseline_coord,exists);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_AnalyzeVerticalGlyphOrientation(IDWriteTextAnalyzer1* This,IDWriteTextAnalysisSource1 *source,UINT32 text_pos,UINT32 len,IDWriteTextAnalysisSink1 *sink) {
+    return This->lpVtbl->AnalyzeVerticalGlyphOrientation(This,source,text_pos,len,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetGlyphOrientationTransform(IDWriteTextAnalyzer1* This,DWRITE_GLYPH_ORIENTATION_ANGLE angle,WINBOOL is_sideways,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->GetGlyphOrientationTransform(This,angle,is_sideways,transform);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetScriptProperties(IDWriteTextAnalyzer1* This,DWRITE_SCRIPT_ANALYSIS sa,DWRITE_SCRIPT_PROPERTIES *props) {
+    return This->lpVtbl->GetScriptProperties(This,sa,props);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetTextComplexity(IDWriteTextAnalyzer1* This,const WCHAR *text,UINT32 len,IDWriteFontFace *face,WINBOOL *is_simple,UINT32 *len_read,UINT16 *indices) {
+    return This->lpVtbl->GetTextComplexity(This,text,len,face,is_simple,len_read,indices);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetJustificationOpportunities(IDWriteTextAnalyzer1* This,IDWriteFontFace *face,FLOAT font_em_size,DWRITE_SCRIPT_ANALYSIS sa,UINT32 length,UINT32 glyph_count,const WCHAR *text,const UINT16 *clustermap,const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,DWRITE_JUSTIFICATION_OPPORTUNITY *jo) {
+    return This->lpVtbl->GetJustificationOpportunities(This,face,font_em_size,sa,length,glyph_count,text,clustermap,prop,jo);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_JustifyGlyphAdvances(IDWriteTextAnalyzer1* This,FLOAT width,UINT32 glyph_count,const DWRITE_JUSTIFICATION_OPPORTUNITY *jo,const FLOAT *advances,const DWRITE_GLYPH_OFFSET *offsets,FLOAT *justifiedadvances,DWRITE_GLYPH_OFFSET *justifiedoffsets) {
+    return This->lpVtbl->JustifyGlyphAdvances(This,width,glyph_count,jo,advances,offsets,justifiedadvances,justifiedoffsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer1_GetJustifiedGlyphs(IDWriteTextAnalyzer1* This,IDWriteFontFace *face,FLOAT font_em_size,DWRITE_SCRIPT_ANALYSIS sa,UINT32 length,UINT32 glyph_count,UINT32 max_glyphcount,const UINT16 *clustermap,const UINT16 *indices,const FLOAT *advances,const FLOAT *justifiedadvances,const DWRITE_GLYPH_OFFSET *justifiedoffsets,const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,UINT32 *actual_count,UINT16 *modified_clustermap,UINT16 *modified_indices,FLOAT *modified_advances,DWRITE_GLYPH_OFFSET *modified_offsets) {
+    return This->lpVtbl->GetJustifiedGlyphs(This,face,font_em_size,sa,length,glyph_count,max_glyphcount,clustermap,indices,advances,justifiedadvances,justifiedoffsets,prop,actual_count,modified_clustermap,modified_indices,modified_advances,modified_offsets);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalyzer1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalysisSource1 interface
+ */
+#ifndef __IDWriteTextAnalysisSource1_INTERFACE_DEFINED__
+#define __IDWriteTextAnalysisSource1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalysisSource1, 0x639cfad8, 0x0fb4, 0x4b21, 0xa5,0x8a, 0x06,0x79,0x20,0x12,0x00,0x09);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("639cfad8-0fb4-4b21-a58a-067920120009")
+IDWriteTextAnalysisSource1 : public IDWriteTextAnalysisSource
+{
+    virtual HRESULT STDMETHODCALLTYPE GetVerticalGlyphOrientation(
+        UINT32 pos,
+        UINT32 *length,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,
+        UINT8 *bidi_level) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalysisSource1, 0x639cfad8, 0x0fb4, 0x4b21, 0xa5,0x8a, 0x06,0x79,0x20,0x12,0x00,0x09)
+#endif
+#else
+typedef struct IDWriteTextAnalysisSource1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalysisSource1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalysisSource1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalysisSource1 *This);
+
+    /*** IDWriteTextAnalysisSource methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTextAtPosition)(
+        IDWriteTextAnalysisSource1 *This,
+        UINT32 position,
+        const WCHAR **text,
+        UINT32 *text_len);
+
+    HRESULT (STDMETHODCALLTYPE *GetTextBeforePosition)(
+        IDWriteTextAnalysisSource1 *This,
+        UINT32 position,
+        const WCHAR **text,
+        UINT32 *text_len);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetParagraphReadingDirection)(
+        IDWriteTextAnalysisSource1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextAnalysisSource1 *This,
+        UINT32 position,
+        UINT32 *text_len,
+        const WCHAR **locale);
+
+    HRESULT (STDMETHODCALLTYPE *GetNumberSubstitution)(
+        IDWriteTextAnalysisSource1 *This,
+        UINT32 position,
+        UINT32 *text_len,
+        IDWriteNumberSubstitution **substitution);
+
+    /*** IDWriteTextAnalysisSource1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextAnalysisSource1 *This,
+        UINT32 pos,
+        UINT32 *length,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,
+        UINT8 *bidi_level);
+
+    END_INTERFACE
+} IDWriteTextAnalysisSource1Vtbl;
+
+interface IDWriteTextAnalysisSource1 {
+    CONST_VTBL IDWriteTextAnalysisSource1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalysisSource1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalysisSource1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalysisSource1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalysisSource methods ***/
+#define IDWriteTextAnalysisSource1_GetTextAtPosition(This,position,text,text_len) (This)->lpVtbl->GetTextAtPosition(This,position,text,text_len)
+#define IDWriteTextAnalysisSource1_GetTextBeforePosition(This,position,text,text_len) (This)->lpVtbl->GetTextBeforePosition(This,position,text,text_len)
+#define IDWriteTextAnalysisSource1_GetParagraphReadingDirection(This) (This)->lpVtbl->GetParagraphReadingDirection(This)
+#define IDWriteTextAnalysisSource1_GetLocaleName(This,position,text_len,locale) (This)->lpVtbl->GetLocaleName(This,position,text_len,locale)
+#define IDWriteTextAnalysisSource1_GetNumberSubstitution(This,position,text_len,substitution) (This)->lpVtbl->GetNumberSubstitution(This,position,text_len,substitution)
+/*** IDWriteTextAnalysisSource1 methods ***/
+#define IDWriteTextAnalysisSource1_GetVerticalGlyphOrientation(This,pos,length,orientation,bidi_level) (This)->lpVtbl->GetVerticalGlyphOrientation(This,pos,length,orientation,bidi_level)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource1_QueryInterface(IDWriteTextAnalysisSource1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSource1_AddRef(IDWriteTextAnalysisSource1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSource1_Release(IDWriteTextAnalysisSource1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalysisSource methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource1_GetTextAtPosition(IDWriteTextAnalysisSource1* This,UINT32 position,const WCHAR **text,UINT32 *text_len) {
+    return This->lpVtbl->GetTextAtPosition(This,position,text,text_len);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource1_GetTextBeforePosition(IDWriteTextAnalysisSource1* This,UINT32 position,const WCHAR **text,UINT32 *text_len) {
+    return This->lpVtbl->GetTextBeforePosition(This,position,text,text_len);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextAnalysisSource1_GetParagraphReadingDirection(IDWriteTextAnalysisSource1* This) {
+    return This->lpVtbl->GetParagraphReadingDirection(This);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource1_GetLocaleName(IDWriteTextAnalysisSource1* This,UINT32 position,UINT32 *text_len,const WCHAR **locale) {
+    return This->lpVtbl->GetLocaleName(This,position,text_len,locale);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource1_GetNumberSubstitution(IDWriteTextAnalysisSource1* This,UINT32 position,UINT32 *text_len,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->GetNumberSubstitution(This,position,text_len,substitution);
+}
+/*** IDWriteTextAnalysisSource1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSource1_GetVerticalGlyphOrientation(IDWriteTextAnalysisSource1* This,UINT32 pos,UINT32 *length,DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,UINT8 *bidi_level) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This,pos,length,orientation,bidi_level);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalysisSource1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalysisSink1 interface
+ */
+#ifndef __IDWriteTextAnalysisSink1_INTERFACE_DEFINED__
+#define __IDWriteTextAnalysisSink1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalysisSink1, 0xb0d941a0, 0x85e7, 0x4d8b, 0x9f,0xd3, 0x5c,0xed,0x99,0x34,0x48,0x2a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b0d941a0-85e7-4d8b-9fd3-5ced9934482a")
+IDWriteTextAnalysisSink1 : public IDWriteTextAnalysisSink
+{
+    virtual HRESULT STDMETHODCALLTYPE SetGlyphOrientation(
+        UINT32 pos,
+        UINT32 length,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        UINT8 adjusted_bidilevel,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalysisSink1, 0xb0d941a0, 0x85e7, 0x4d8b, 0x9f,0xd3, 0x5c,0xed,0x99,0x34,0x48,0x2a)
+#endif
+#else
+typedef struct IDWriteTextAnalysisSink1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalysisSink1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalysisSink1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalysisSink1 *This);
+
+    /*** IDWriteTextAnalysisSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetScriptAnalysis)(
+        IDWriteTextAnalysisSink1 *This,
+        UINT32 position,
+        UINT32 length,
+        const DWRITE_SCRIPT_ANALYSIS *scriptanalysis);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineBreakpoints)(
+        IDWriteTextAnalysisSink1 *This,
+        UINT32 position,
+        UINT32 length,
+        const DWRITE_LINE_BREAKPOINT *breakpoints);
+
+    HRESULT (STDMETHODCALLTYPE *SetBidiLevel)(
+        IDWriteTextAnalysisSink1 *This,
+        UINT32 position,
+        UINT32 length,
+        UINT8 explicitLevel,
+        UINT8 resolvedLevel);
+
+    HRESULT (STDMETHODCALLTYPE *SetNumberSubstitution)(
+        IDWriteTextAnalysisSink1 *This,
+        UINT32 position,
+        UINT32 length,
+        IDWriteNumberSubstitution *substitution);
+
+    /*** IDWriteTextAnalysisSink1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetGlyphOrientation)(
+        IDWriteTextAnalysisSink1 *This,
+        UINT32 pos,
+        UINT32 length,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        UINT8 adjusted_bidilevel,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl);
+
+    END_INTERFACE
+} IDWriteTextAnalysisSink1Vtbl;
+
+interface IDWriteTextAnalysisSink1 {
+    CONST_VTBL IDWriteTextAnalysisSink1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalysisSink1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalysisSink1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalysisSink1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalysisSink methods ***/
+#define IDWriteTextAnalysisSink1_SetScriptAnalysis(This,position,length,scriptanalysis) (This)->lpVtbl->SetScriptAnalysis(This,position,length,scriptanalysis)
+#define IDWriteTextAnalysisSink1_SetLineBreakpoints(This,position,length,breakpoints) (This)->lpVtbl->SetLineBreakpoints(This,position,length,breakpoints)
+#define IDWriteTextAnalysisSink1_SetBidiLevel(This,position,length,explicitLevel,resolvedLevel) (This)->lpVtbl->SetBidiLevel(This,position,length,explicitLevel,resolvedLevel)
+#define IDWriteTextAnalysisSink1_SetNumberSubstitution(This,position,length,substitution) (This)->lpVtbl->SetNumberSubstitution(This,position,length,substitution)
+/*** IDWriteTextAnalysisSink1 methods ***/
+#define IDWriteTextAnalysisSink1_SetGlyphOrientation(This,pos,length,angle,adjusted_bidilevel,is_sideways,is_rtl) (This)->lpVtbl->SetGlyphOrientation(This,pos,length,angle,adjusted_bidilevel,is_sideways,is_rtl)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink1_QueryInterface(IDWriteTextAnalysisSink1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSink1_AddRef(IDWriteTextAnalysisSink1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalysisSink1_Release(IDWriteTextAnalysisSink1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalysisSink methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink1_SetScriptAnalysis(IDWriteTextAnalysisSink1* This,UINT32 position,UINT32 length,const DWRITE_SCRIPT_ANALYSIS *scriptanalysis) {
+    return This->lpVtbl->SetScriptAnalysis(This,position,length,scriptanalysis);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink1_SetLineBreakpoints(IDWriteTextAnalysisSink1* This,UINT32 position,UINT32 length,const DWRITE_LINE_BREAKPOINT *breakpoints) {
+    return This->lpVtbl->SetLineBreakpoints(This,position,length,breakpoints);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink1_SetBidiLevel(IDWriteTextAnalysisSink1* This,UINT32 position,UINT32 length,UINT8 explicitLevel,UINT8 resolvedLevel) {
+    return This->lpVtbl->SetBidiLevel(This,position,length,explicitLevel,resolvedLevel);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink1_SetNumberSubstitution(IDWriteTextAnalysisSink1* This,UINT32 position,UINT32 length,IDWriteNumberSubstitution *substitution) {
+    return This->lpVtbl->SetNumberSubstitution(This,position,length,substitution);
+}
+/*** IDWriteTextAnalysisSink1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalysisSink1_SetGlyphOrientation(IDWriteTextAnalysisSink1* This,UINT32 pos,UINT32 length,DWRITE_GLYPH_ORIENTATION_ANGLE angle,UINT8 adjusted_bidilevel,WINBOOL is_sideways,WINBOOL is_rtl) {
+    return This->lpVtbl->SetGlyphOrientation(This,pos,length,angle,adjusted_bidilevel,is_sideways,is_rtl);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalysisSink1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextLayout1 interface
+ */
+#ifndef __IDWriteTextLayout1_INTERFACE_DEFINED__
+#define __IDWriteTextLayout1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextLayout1, 0x9064d822, 0x80a7, 0x465c, 0xa9,0x86, 0xdf,0x65,0xf7,0x8b,0x8f,0xeb);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("9064d822-80a7-465c-a986-df65f78b8feb")
+IDWriteTextLayout1 : public IDWriteTextLayout
+{
+    virtual HRESULT STDMETHODCALLTYPE SetPairKerning(
+        WINBOOL is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPairKerning(
+        UINT32 position,
+        WINBOOL *is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE *range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetCharacterSpacing(
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT minimum_advance_width,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCharacterSpacing(
+        UINT32 position,
+        FLOAT *leading_spacing,
+        FLOAT *trailing_spacing,
+        FLOAT *minimum_advance_width,
+        DWRITE_TEXT_RANGE *range = 0) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextLayout1, 0x9064d822, 0x80a7, 0x465c, 0xa9,0x86, 0xdf,0x65,0xf7,0x8b,0x8f,0xeb)
+#endif
+#else
+typedef struct IDWriteTextLayout1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextLayout1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextLayout1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextLayout1 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextLayout1 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextLayout1 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextLayout1 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextLayout1 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextLayout1 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextLayout1 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextLayout1 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextLayout1 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextLayout1 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextLayout1 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextLayout1 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextLayout1 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextLayout1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextLayout1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextLayout1 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextLayout1 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextLayout1 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextLayout1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextLayout1 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextLayout1 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextLayout1 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextLayout1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextLayout1 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextLayout1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextLayout1 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextLayout methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetMaxWidth)(
+        IDWriteTextLayout1 *This,
+        FLOAT maxWidth);
+
+    HRESULT (STDMETHODCALLTYPE *SetMaxHeight)(
+        IDWriteTextLayout1 *This,
+        FLOAT maxHeight);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontCollection)(
+        IDWriteTextLayout1 *This,
+        IDWriteFontCollection *collection,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFamilyName)(
+        IDWriteTextLayout1 *This,
+        const WCHAR *name,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontWeight)(
+        IDWriteTextLayout1 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStyle)(
+        IDWriteTextLayout1 *This,
+        DWRITE_FONT_STYLE style,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStretch)(
+        IDWriteTextLayout1 *This,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontSize)(
+        IDWriteTextLayout1 *This,
+        FLOAT size,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetUnderline)(
+        IDWriteTextLayout1 *This,
+        WINBOOL underline,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetStrikethrough)(
+        IDWriteTextLayout1 *This,
+        WINBOOL strikethrough,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetDrawingEffect)(
+        IDWriteTextLayout1 *This,
+        IUnknown *effect,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetInlineObject)(
+        IDWriteTextLayout1 *This,
+        IDWriteInlineObject *object,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetTypography)(
+        IDWriteTextLayout1 *This,
+        IDWriteTypography *typography,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocaleName)(
+        IDWriteTextLayout1 *This,
+        const WCHAR *locale,
+        DWRITE_TEXT_RANGE range);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxWidth)(
+        IDWriteTextLayout1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxHeight)(
+        IDWriteTextLayout1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontCollection)(
+        IDWriteTextLayout1 *This,
+        UINT32 pos,
+        IDWriteFontCollection **collection,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyNameLength)(
+        IDWriteTextLayout1 *This,
+        UINT32 pos,
+        UINT32 *len,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyName)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontWeight)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStyle)(
+        IDWriteTextLayout1 *This,
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStretch)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontSize)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        FLOAT *size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnderline)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        WINBOOL *has_underline,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetStrikethrough)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        WINBOOL *has_strikethrough,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetDrawingEffect)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        IUnknown **effect,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetInlineObject)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        IDWriteInlineObject **object,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypography)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        IDWriteTypography **typography,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleNameLength)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        UINT32 *length,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleName)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *Draw)(
+        IDWriteTextLayout1 *This,
+        void *context,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineMetrics)(
+        IDWriteTextLayout1 *This,
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteTextLayout1 *This,
+        DWRITE_TEXT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetOverhangMetrics)(
+        IDWriteTextLayout1 *This,
+        DWRITE_OVERHANG_METRICS *overhangs);
+
+    HRESULT (STDMETHODCALLTYPE *GetClusterMetrics)(
+        IDWriteTextLayout1 *This,
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *act_count);
+
+    HRESULT (STDMETHODCALLTYPE *DetermineMinWidth)(
+        IDWriteTextLayout1 *This,
+        FLOAT *min_width);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
+        IDWriteTextLayout1 *This,
+        FLOAT pointX,
+        FLOAT pointY,
+        WINBOOL *is_trailinghit,
+        WINBOOL *is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextPosition)(
+        IDWriteTextLayout1 *This,
+        UINT32 textPosition,
+        WINBOOL is_trailinghit,
+        FLOAT *pointX,
+        FLOAT *pointY,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextRange)(
+        IDWriteTextLayout1 *This,
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32 *actual_metricscount);
+
+    /*** IDWriteTextLayout1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetPairKerning)(
+        IDWriteTextLayout1 *This,
+        WINBOOL is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetPairKerning)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        WINBOOL *is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *SetCharacterSpacing)(
+        IDWriteTextLayout1 *This,
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT minimum_advance_width,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetCharacterSpacing)(
+        IDWriteTextLayout1 *This,
+        UINT32 position,
+        FLOAT *leading_spacing,
+        FLOAT *trailing_spacing,
+        FLOAT *minimum_advance_width,
+        DWRITE_TEXT_RANGE *range);
+
+    END_INTERFACE
+} IDWriteTextLayout1Vtbl;
+
+interface IDWriteTextLayout1 {
+    CONST_VTBL IDWriteTextLayout1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextLayout1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextLayout1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextLayout1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextLayout1_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextLayout1_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextLayout1_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextLayout1_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextLayout1_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextLayout1_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextLayout1_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextLayout1_SetLineSpacing(This,spacing,line_spacing,baseline) (This)->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline)
+#define IDWriteTextLayout1_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextLayout1_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextLayout1_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextLayout1_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextLayout1_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextLayout1_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextLayout1_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextLayout1_GetLineSpacing(This,method,spacing,baseline) (This)->lpVtbl->GetLineSpacing(This,method,spacing,baseline)
+/*** IDWriteTextLayout methods ***/
+#define IDWriteTextLayout1_SetMaxWidth(This,maxWidth) (This)->lpVtbl->SetMaxWidth(This,maxWidth)
+#define IDWriteTextLayout1_SetMaxHeight(This,maxHeight) (This)->lpVtbl->SetMaxHeight(This,maxHeight)
+#define IDWriteTextLayout1_SetFontCollection(This,collection,range) (This)->lpVtbl->SetFontCollection(This,collection,range)
+#define IDWriteTextLayout1_SetFontFamilyName(This,name,range) (This)->lpVtbl->SetFontFamilyName(This,name,range)
+#define IDWriteTextLayout1_SetFontWeight(This,weight,range) (This)->lpVtbl->SetFontWeight(This,weight,range)
+#define IDWriteTextLayout1_SetFontStyle(This,style,range) (This)->lpVtbl->SetFontStyle(This,style,range)
+#define IDWriteTextLayout1_SetFontStretch(This,stretch,range) (This)->lpVtbl->SetFontStretch(This,stretch,range)
+#define IDWriteTextLayout1_SetFontSize(This,size,range) (This)->lpVtbl->SetFontSize(This,size,range)
+#define IDWriteTextLayout1_SetUnderline(This,underline,range) (This)->lpVtbl->SetUnderline(This,underline,range)
+#define IDWriteTextLayout1_SetStrikethrough(This,strikethrough,range) (This)->lpVtbl->SetStrikethrough(This,strikethrough,range)
+#define IDWriteTextLayout1_SetDrawingEffect(This,effect,range) (This)->lpVtbl->SetDrawingEffect(This,effect,range)
+#define IDWriteTextLayout1_SetInlineObject(This,object,range) (This)->lpVtbl->SetInlineObject(This,object,range)
+#define IDWriteTextLayout1_SetTypography(This,typography,range) (This)->lpVtbl->SetTypography(This,typography,range)
+#define IDWriteTextLayout1_SetLocaleName(This,locale,range) (This)->lpVtbl->SetLocaleName(This,locale,range)
+#define IDWriteTextLayout1_GetMaxWidth(This) (This)->lpVtbl->GetMaxWidth(This)
+#define IDWriteTextLayout1_GetMaxHeight(This) (This)->lpVtbl->GetMaxHeight(This)
+#define IDWriteTextLayout1_GetFontCollection(This,pos,collection,range) (This)->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range)
+#define IDWriteTextLayout1_GetFontFamilyNameLength(This,pos,len,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range)
+#define IDWriteTextLayout1_GetFontFamilyName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range)
+#define IDWriteTextLayout1_GetFontWeight(This,position,weight,range) (This)->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range)
+#define IDWriteTextLayout1_GetFontStyle(This,currentPosition,style,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range)
+#define IDWriteTextLayout1_GetFontStretch(This,position,stretch,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range)
+#define IDWriteTextLayout1_GetFontSize(This,position,size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range)
+#define IDWriteTextLayout1_GetUnderline(This,position,has_underline,range) (This)->lpVtbl->GetUnderline(This,position,has_underline,range)
+#define IDWriteTextLayout1_GetStrikethrough(This,position,has_strikethrough,range) (This)->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range)
+#define IDWriteTextLayout1_GetDrawingEffect(This,position,effect,range) (This)->lpVtbl->GetDrawingEffect(This,position,effect,range)
+#define IDWriteTextLayout1_GetInlineObject(This,position,object,range) (This)->lpVtbl->GetInlineObject(This,position,object,range)
+#define IDWriteTextLayout1_GetTypography(This,position,typography,range) (This)->lpVtbl->GetTypography(This,position,typography,range)
+#define IDWriteTextLayout1_GetLocaleNameLength(This,position,length,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range)
+#define IDWriteTextLayout1_GetLocaleName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range)
+#define IDWriteTextLayout1_Draw(This,context,renderer,originX,originY) (This)->lpVtbl->Draw(This,context,renderer,originX,originY)
+#define IDWriteTextLayout1_GetLineMetrics(This,metrics,max_count,actual_count) (This)->lpVtbl->GetLineMetrics(This,metrics,max_count,actual_count)
+#define IDWriteTextLayout1_GetMetrics(This,metrics) (This)->lpVtbl->GetMetrics(This,metrics)
+#define IDWriteTextLayout1_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
+#define IDWriteTextLayout1_GetClusterMetrics(This,metrics,max_count,act_count) (This)->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count)
+#define IDWriteTextLayout1_DetermineMinWidth(This,min_width) (This)->lpVtbl->DetermineMinWidth(This,min_width)
+#define IDWriteTextLayout1_HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics) (This)->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics)
+#define IDWriteTextLayout1_HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics) (This)->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics)
+#define IDWriteTextLayout1_HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount) (This)->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount)
+/*** IDWriteTextLayout1 methods ***/
+#define IDWriteTextLayout1_SetPairKerning(This,is_pairkerning_enabled,range) (This)->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range)
+#define IDWriteTextLayout1_GetPairKerning(This,position,is_pairkerning_enabled,range) (This)->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range)
+#define IDWriteTextLayout1_SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range)
+#define IDWriteTextLayout1_GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout1_QueryInterface(IDWriteTextLayout1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextLayout1_AddRef(IDWriteTextLayout1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextLayout1_Release(IDWriteTextLayout1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetTextAlignment(IDWriteTextLayout1* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetParagraphAlignment(IDWriteTextLayout1* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetWordWrapping(IDWriteTextLayout1* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetReadingDirection(IDWriteTextLayout1* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFlowDirection(IDWriteTextLayout1* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetIncrementalTabStop(IDWriteTextLayout1* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetTrimming(IDWriteTextLayout1* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetLineSpacing(IDWriteTextLayout1* This,DWRITE_LINE_SPACING_METHOD spacing,FLOAT line_spacing,FLOAT baseline) {
+    return This->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout1_GetTextAlignment(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout1_GetParagraphAlignment(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextLayout1_GetWordWrapping(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextLayout1_GetReadingDirection(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout1_GetFlowDirection(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout1_GetIncrementalTabStop(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetTrimming(IDWriteTextLayout1* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetLineSpacing(IDWriteTextLayout1* This,DWRITE_LINE_SPACING_METHOD *method,FLOAT *spacing,FLOAT *baseline) {
+    return This->lpVtbl->GetLineSpacing(This,method,spacing,baseline);
+}
+/*** IDWriteTextLayout methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetMaxWidth(IDWriteTextLayout1* This,FLOAT maxWidth) {
+    return This->lpVtbl->SetMaxWidth(This,maxWidth);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetMaxHeight(IDWriteTextLayout1* This,FLOAT maxHeight) {
+    return This->lpVtbl->SetMaxHeight(This,maxHeight);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFontCollection(IDWriteTextLayout1* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontCollection(This,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFontFamilyName(IDWriteTextLayout1* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontFamilyName(This,name,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFontWeight(IDWriteTextLayout1* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontWeight(This,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFontStyle(IDWriteTextLayout1* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStyle(This,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFontStretch(IDWriteTextLayout1* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStretch(This,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetFontSize(IDWriteTextLayout1* This,FLOAT size,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontSize(This,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetUnderline(IDWriteTextLayout1* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetUnderline(This,underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetStrikethrough(IDWriteTextLayout1* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetDrawingEffect(IDWriteTextLayout1* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetDrawingEffect(This,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetInlineObject(IDWriteTextLayout1* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetInlineObject(This,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetTypography(IDWriteTextLayout1* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetTypography(This,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetLocaleName(IDWriteTextLayout1* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetLocaleName(This,locale,range);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout1_GetMaxWidth(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetMaxWidth(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout1_GetMaxHeight(IDWriteTextLayout1* This) {
+    return This->lpVtbl->GetMaxHeight(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontCollection(IDWriteTextLayout1* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontFamilyNameLength(IDWriteTextLayout1* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontFamilyName(IDWriteTextLayout1* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontWeight(IDWriteTextLayout1* This,UINT32 position,DWRITE_FONT_WEIGHT *weight,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontStyle(IDWriteTextLayout1* This,UINT32 currentPosition,DWRITE_FONT_STYLE *style,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontStretch(IDWriteTextLayout1* This,UINT32 position,DWRITE_FONT_STRETCH *stretch,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetFontSize(IDWriteTextLayout1* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetUnderline(IDWriteTextLayout1* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetStrikethrough(IDWriteTextLayout1* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetDrawingEffect(IDWriteTextLayout1* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetInlineObject(IDWriteTextLayout1* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetInlineObject(This,position,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetTypography(IDWriteTextLayout1* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetTypography(This,position,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetLocaleNameLength(IDWriteTextLayout1* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetLocaleName(IDWriteTextLayout1* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_Draw(IDWriteTextLayout1* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
+    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetLineMetrics(IDWriteTextLayout1* This,DWRITE_LINE_METRICS *metrics,UINT32 max_count,UINT32 *actual_count) {
+    return This->lpVtbl->GetLineMetrics(This,metrics,max_count,actual_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetMetrics(IDWriteTextLayout1* This,DWRITE_TEXT_METRICS *metrics) {
+    return This->lpVtbl->GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetOverhangMetrics(IDWriteTextLayout1* This,DWRITE_OVERHANG_METRICS *overhangs) {
+    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetClusterMetrics(IDWriteTextLayout1* This,DWRITE_CLUSTER_METRICS *metrics,UINT32 max_count,UINT32 *act_count) {
+    return This->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_DetermineMinWidth(IDWriteTextLayout1* This,FLOAT *min_width) {
+    return This->lpVtbl->DetermineMinWidth(This,min_width);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_HitTestPoint(IDWriteTextLayout1* This,FLOAT pointX,FLOAT pointY,WINBOOL *is_trailinghit,WINBOOL *is_inside,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_HitTestTextPosition(IDWriteTextLayout1* This,UINT32 textPosition,WINBOOL is_trailinghit,FLOAT *pointX,FLOAT *pointY,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_HitTestTextRange(IDWriteTextLayout1* This,UINT32 textPosition,UINT32 textLength,FLOAT originX,FLOAT originY,DWRITE_HIT_TEST_METRICS *metrics,UINT32 max_metricscount,UINT32 *actual_metricscount) {
+    return This->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount);
+}
+/*** IDWriteTextLayout1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetPairKerning(IDWriteTextLayout1* This,WINBOOL is_pairkerning_enabled,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetPairKerning(IDWriteTextLayout1* This,UINT32 position,WINBOOL *is_pairkerning_enabled,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_SetCharacterSpacing(IDWriteTextLayout1* This,FLOAT leading_spacing,FLOAT trailing_spacing,FLOAT minimum_advance_width,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout1_GetCharacterSpacing(IDWriteTextLayout1* This,UINT32 position,FLOAT *leading_spacing,FLOAT *trailing_spacing,FLOAT *minimum_advance_width,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextLayout1_INTERFACE_DEFINED__ */
+
+typedef enum DWRITE_TEXT_ANTIALIAS_MODE {
+    DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE = 0,
+    DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE = 1
+} DWRITE_TEXT_ANTIALIAS_MODE;
+/*****************************************************************************
+ * IDWriteBitmapRenderTarget1 interface
+ */
+#ifndef __IDWriteBitmapRenderTarget1_INTERFACE_DEFINED__
+#define __IDWriteBitmapRenderTarget1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteBitmapRenderTarget1, 0x791e8298, 0x3ef3, 0x4230, 0x98,0x80, 0xc9,0xbd,0xec,0xc4,0x20,0x64);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("791e8298-3ef3-4230-9880-c9bdecc42064")
+IDWriteBitmapRenderTarget1 : public IDWriteBitmapRenderTarget
+{
+    virtual DWRITE_TEXT_ANTIALIAS_MODE STDMETHODCALLTYPE GetTextAntialiasMode(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTextAntialiasMode(
+        DWRITE_TEXT_ANTIALIAS_MODE mode) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteBitmapRenderTarget1, 0x791e8298, 0x3ef3, 0x4230, 0x98,0x80, 0xc9,0xbd,0xec,0xc4,0x20,0x64)
+#endif
+#else
+typedef struct IDWriteBitmapRenderTarget1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteBitmapRenderTarget1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteBitmapRenderTarget1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteBitmapRenderTarget1 *This);
+
+    /*** IDWriteBitmapRenderTarget methods ***/
+    HRESULT (STDMETHODCALLTYPE *DrawGlyphRun)(
+        IDWriteBitmapRenderTarget1 *This,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        IDWriteRenderingParams *params,
+        COLORREF textColor,
+        RECT *blackbox_rect);
+
+    HDC (STDMETHODCALLTYPE *GetMemoryDC)(
+        IDWriteBitmapRenderTarget1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetPixelsPerDip)(
+        IDWriteBitmapRenderTarget1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetPixelsPerDip)(
+        IDWriteBitmapRenderTarget1 *This,
+        FLOAT pixels_per_dip);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentTransform)(
+        IDWriteBitmapRenderTarget1 *This,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *SetCurrentTransform)(
+        IDWriteBitmapRenderTarget1 *This,
+        const DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetSize)(
+        IDWriteBitmapRenderTarget1 *This,
+        SIZE *size);
+
+    HRESULT (STDMETHODCALLTYPE *Resize)(
+        IDWriteBitmapRenderTarget1 *This,
+        UINT32 width,
+        UINT32 height);
+
+    /*** IDWriteBitmapRenderTarget1 methods ***/
+    DWRITE_TEXT_ANTIALIAS_MODE (STDMETHODCALLTYPE *GetTextAntialiasMode)(
+        IDWriteBitmapRenderTarget1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetTextAntialiasMode)(
+        IDWriteBitmapRenderTarget1 *This,
+        DWRITE_TEXT_ANTIALIAS_MODE mode);
+
+    END_INTERFACE
+} IDWriteBitmapRenderTarget1Vtbl;
+
+interface IDWriteBitmapRenderTarget1 {
+    CONST_VTBL IDWriteBitmapRenderTarget1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteBitmapRenderTarget1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteBitmapRenderTarget1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteBitmapRenderTarget1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteBitmapRenderTarget methods ***/
+#define IDWriteBitmapRenderTarget1_DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuring_mode,glyph_run,params,textColor,blackbox_rect) (This)->lpVtbl->DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuring_mode,glyph_run,params,textColor,blackbox_rect)
+#define IDWriteBitmapRenderTarget1_GetMemoryDC(This) (This)->lpVtbl->GetMemoryDC(This)
+#define IDWriteBitmapRenderTarget1_GetPixelsPerDip(This) (This)->lpVtbl->GetPixelsPerDip(This)
+#define IDWriteBitmapRenderTarget1_SetPixelsPerDip(This,pixels_per_dip) (This)->lpVtbl->SetPixelsPerDip(This,pixels_per_dip)
+#define IDWriteBitmapRenderTarget1_GetCurrentTransform(This,transform) (This)->lpVtbl->GetCurrentTransform(This,transform)
+#define IDWriteBitmapRenderTarget1_SetCurrentTransform(This,transform) (This)->lpVtbl->SetCurrentTransform(This,transform)
+#define IDWriteBitmapRenderTarget1_GetSize(This,size) (This)->lpVtbl->GetSize(This,size)
+#define IDWriteBitmapRenderTarget1_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
+/*** IDWriteBitmapRenderTarget1 methods ***/
+#define IDWriteBitmapRenderTarget1_GetTextAntialiasMode(This) (This)->lpVtbl->GetTextAntialiasMode(This)
+#define IDWriteBitmapRenderTarget1_SetTextAntialiasMode(This,mode) (This)->lpVtbl->SetTextAntialiasMode(This,mode)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_QueryInterface(IDWriteBitmapRenderTarget1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteBitmapRenderTarget1_AddRef(IDWriteBitmapRenderTarget1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteBitmapRenderTarget1_Release(IDWriteBitmapRenderTarget1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteBitmapRenderTarget methods ***/
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_DrawGlyphRun(IDWriteBitmapRenderTarget1* This,FLOAT baselineOriginX,FLOAT baselineOriginY,DWRITE_MEASURING_MODE measuring_mode,const DWRITE_GLYPH_RUN *glyph_run,IDWriteRenderingParams *params,COLORREF textColor,RECT *blackbox_rect) {
+    return This->lpVtbl->DrawGlyphRun(This,baselineOriginX,baselineOriginY,measuring_mode,glyph_run,params,textColor,blackbox_rect);
+}
+static FORCEINLINE HDC IDWriteBitmapRenderTarget1_GetMemoryDC(IDWriteBitmapRenderTarget1* This) {
+    return This->lpVtbl->GetMemoryDC(This);
+}
+static FORCEINLINE FLOAT IDWriteBitmapRenderTarget1_GetPixelsPerDip(IDWriteBitmapRenderTarget1* This) {
+    return This->lpVtbl->GetPixelsPerDip(This);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_SetPixelsPerDip(IDWriteBitmapRenderTarget1* This,FLOAT pixels_per_dip) {
+    return This->lpVtbl->SetPixelsPerDip(This,pixels_per_dip);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_GetCurrentTransform(IDWriteBitmapRenderTarget1* This,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->GetCurrentTransform(This,transform);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_SetCurrentTransform(IDWriteBitmapRenderTarget1* This,const DWRITE_MATRIX *transform) {
+    return This->lpVtbl->SetCurrentTransform(This,transform);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_GetSize(IDWriteBitmapRenderTarget1* This,SIZE *size) {
+    return This->lpVtbl->GetSize(This,size);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_Resize(IDWriteBitmapRenderTarget1* This,UINT32 width,UINT32 height) {
+    return This->lpVtbl->Resize(This,width,height);
+}
+/*** IDWriteBitmapRenderTarget1 methods ***/
+static FORCEINLINE DWRITE_TEXT_ANTIALIAS_MODE IDWriteBitmapRenderTarget1_GetTextAntialiasMode(IDWriteBitmapRenderTarget1* This) {
+    return This->lpVtbl->GetTextAntialiasMode(This);
+}
+static FORCEINLINE HRESULT IDWriteBitmapRenderTarget1_SetTextAntialiasMode(IDWriteBitmapRenderTarget1* This,DWRITE_TEXT_ANTIALIAS_MODE mode) {
+    return This->lpVtbl->SetTextAntialiasMode(This,mode);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteBitmapRenderTarget1_INTERFACE_DEFINED__ */
+
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __dwrite_1_h__ */
diff --git a/mingw-w64-headers/include/dwrite_1.idl b/mingw-w64-headers/include/dwrite_1.idl
new file mode 100644
index 0000000..902af41
--- /dev/null
+++ b/mingw-w64-headers/include/dwrite_1.idl
@@ -0,0 +1,824 @@
+/*
+ * Copyright 2013 Nikolay Sivov for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "dwrite.idl";
+
+typedef enum DWRITE_PANOSE_FAMILY
+{
+    DWRITE_PANOSE_FAMILY_ANY,
+    DWRITE_PANOSE_FAMILY_NO_FIT,
+    DWRITE_PANOSE_FAMILY_TEXT_DISPLAY,
+    DWRITE_PANOSE_FAMILY_SCRIPT,
+    DWRITE_PANOSE_FAMILY_DECORATIVE,
+    DWRITE_PANOSE_FAMILY_SYMBOL,
+    DWRITE_PANOSE_FAMILY_PICTORIAL = DWRITE_PANOSE_FAMILY_SYMBOL
+} DWRITE_PANOSE_FAMILY;
+
+typedef enum DWRITE_PANOSE_SERIF_STYLE
+{
+    DWRITE_PANOSE_SERIF_STYLE_ANY,
+    DWRITE_PANOSE_SERIF_STYLE_NO_FIT,
+    DWRITE_PANOSE_SERIF_STYLE_COVE,
+    DWRITE_PANOSE_SERIF_STYLE_OBTUSE_COVE,
+    DWRITE_PANOSE_SERIF_STYLE_SQUARE_COVE,
+    DWRITE_PANOSE_SERIF_STYLE_OBTUSE_SQUARE_COVE,
+    DWRITE_PANOSE_SERIF_STYLE_SQUARE,
+    DWRITE_PANOSE_SERIF_STYLE_THIN,
+    DWRITE_PANOSE_SERIF_STYLE_OVAL,
+    DWRITE_PANOSE_SERIF_STYLE_EXAGGERATED,
+    DWRITE_PANOSE_SERIF_STYLE_TRIANGLE,
+    DWRITE_PANOSE_SERIF_STYLE_NORMAL_SANS,
+    DWRITE_PANOSE_SERIF_STYLE_OBTUSE_SANS,
+    DWRITE_PANOSE_SERIF_STYLE_PERPENDICULAR_SANS,
+    DWRITE_PANOSE_SERIF_STYLE_FLARED,
+    DWRITE_PANOSE_SERIF_STYLE_ROUNDED,
+    DWRITE_PANOSE_SERIF_STYLE_SCRIPT,
+    DWRITE_PANOSE_SERIF_STYLE_PERP_SANS = DWRITE_PANOSE_SERIF_STYLE_PERPENDICULAR_SANS,
+    DWRITE_PANOSE_SERIF_STYLE_BONE = DWRITE_PANOSE_SERIF_STYLE_OVAL
+} DWRITE_PANOSE_SERIF_STYLE;
+
+typedef enum DWRITE_PANOSE_WEIGHT
+{
+    DWRITE_PANOSE_WEIGHT_ANY,
+    DWRITE_PANOSE_WEIGHT_NO_FIT,
+    DWRITE_PANOSE_WEIGHT_VERY_LIGHT,
+    DWRITE_PANOSE_WEIGHT_LIGHT,
+    DWRITE_PANOSE_WEIGHT_THIN,
+    DWRITE_PANOSE_WEIGHT_BOOK,
+    DWRITE_PANOSE_WEIGHT_MEDIUM,
+    DWRITE_PANOSE_WEIGHT_DEMI,
+    DWRITE_PANOSE_WEIGHT_BOLD,
+    DWRITE_PANOSE_WEIGHT_HEAVY,
+    DWRITE_PANOSE_WEIGHT_BLACK,
+    DWRITE_PANOSE_WEIGHT_EXTRA_BLACK,
+    DWRITE_PANOSE_WEIGHT_NORD = DWRITE_PANOSE_WEIGHT_EXTRA_BLACK
+} DWRITE_PANOSE_WEIGHT;
+
+typedef enum DWRITE_PANOSE_PROPORTION
+{
+    DWRITE_PANOSE_PROPORTION_ANY,
+    DWRITE_PANOSE_PROPORTION_NO_FIT,
+    DWRITE_PANOSE_PROPORTION_OLD_STYLE,
+    DWRITE_PANOSE_PROPORTION_MODERN,
+    DWRITE_PANOSE_PROPORTION_EVEN_WIDTH,
+    DWRITE_PANOSE_PROPORTION_EXPANDED,
+    DWRITE_PANOSE_PROPORTION_CONDENSED,
+    DWRITE_PANOSE_PROPORTION_VERY_EXPANDED,
+    DWRITE_PANOSE_PROPORTION_VERY_CONDENSED,
+    DWRITE_PANOSE_PROPORTION_MONOSPACED
+} DWRITE_PANOSE_PROPORTION;
+
+typedef enum DWRITE_PANOSE_CONTRAST
+{
+    DWRITE_PANOSE_CONTRAST_ANY,
+    DWRITE_PANOSE_CONTRAST_NO_FIT,
+    DWRITE_PANOSE_CONTRAST_NONE,
+    DWRITE_PANOSE_CONTRAST_VERY_LOW,
+    DWRITE_PANOSE_CONTRAST_LOW,
+    DWRITE_PANOSE_CONTRAST_MEDIUM_LOW,
+    DWRITE_PANOSE_CONTRAST_MEDIUM,
+    DWRITE_PANOSE_CONTRAST_MEDIUM_HIGH,
+    DWRITE_PANOSE_CONTRAST_HIGH,
+    DWRITE_PANOSE_CONTRAST_VERY_HIGH,
+    DWRITE_PANOSE_CONTRAST_HORIZONTAL_LOW,
+    DWRITE_PANOSE_CONTRAST_HORIZONTAL_MEDIUM,
+    DWRITE_PANOSE_CONTRAST_HORIZONTAL_HIGH,
+    DWRITE_PANOSE_CONTRAST_BROKEN
+} DWRITE_PANOSE_CONTRAST;
+
+typedef enum DWRITE_PANOSE_STROKE_VARIATION
+{
+    DWRITE_PANOSE_STROKE_VARIATION_ANY,
+    DWRITE_PANOSE_STROKE_VARIATION_NO_FIT,
+    DWRITE_PANOSE_STROKE_VARIATION_NO_VARIATION,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_DIAGONAL,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_TRANSITIONAL,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_VERTICAL,
+    DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_HORIZONTAL,
+    DWRITE_PANOSE_STROKE_VARIATION_RAPID_VERTICAL,
+    DWRITE_PANOSE_STROKE_VARIATION_RAPID_HORIZONTAL,
+    DWRITE_PANOSE_STROKE_VARIATION_INSTANT_VERTICAL,
+    DWRITE_PANOSE_STROKE_VARIATION_INSTANT_HORIZONTAL
+} DWRITE_PANOSE_STROKE_VARIATION;
+
+typedef enum DWRITE_PANOSE_ARM_STYLE
+{
+    DWRITE_PANOSE_ARM_STYLE_ANY,
+    DWRITE_PANOSE_ARM_STYLE_NO_FIT,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_HORIZONTAL,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_WEDGE,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERTICAL,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_SINGLE_SERIF,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_DOUBLE_SERIF,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_HORIZONTAL,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_WEDGE,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_VERTICAL,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_SINGLE_SERIF,
+    DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_DOUBLE_SERIF,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_HORZ = DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_HORIZONTAL,
+    DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERT = DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERTICAL,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_HORZ = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_HORIZONTAL,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_WEDGE = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_WEDGE,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_VERT = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_VERTICAL,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_SINGLE_SERIF = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_SINGLE_SERIF,
+    DWRITE_PANOSE_ARM_STYLE_BENT_ARMS_DOUBLE_SERIF = DWRITE_PANOSE_ARM_STYLE_NONSTRAIGHT_ARMS_DOUBLE_SERIF
+} DWRITE_PANOSE_ARM_STYLE;
+
+typedef enum DWRITE_PANOSE_LETTERFORM
+{
+    DWRITE_PANOSE_LETTERFORM_ANY,
+    DWRITE_PANOSE_LETTERFORM_NO_FIT,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_CONTACT,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_WEIGHTED,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_BOXED,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_FLATTENED,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_ROUNDED,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_OFF_CENTER,
+    DWRITE_PANOSE_LETTERFORM_NORMAL_SQUARE,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_CONTACT,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_WEIGHTED,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_BOXED,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_FLATTENED,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_ROUNDED,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_OFF_CENTER,
+    DWRITE_PANOSE_LETTERFORM_OBLIQUE_SQUARE
+} DWRITE_PANOSE_LETTERFORM;
+
+typedef enum DWRITE_PANOSE_MIDLINE
+{
+    DWRITE_PANOSE_MIDLINE_ANY,
+    DWRITE_PANOSE_MIDLINE_NO_FIT,
+    DWRITE_PANOSE_MIDLINE_STANDARD_TRIMMED,
+    DWRITE_PANOSE_MIDLINE_STANDARD_POINTED,
+    DWRITE_PANOSE_MIDLINE_STANDARD_SERIFED,
+    DWRITE_PANOSE_MIDLINE_HIGH_TRIMMED,
+    DWRITE_PANOSE_MIDLINE_HIGH_POINTED,
+    DWRITE_PANOSE_MIDLINE_HIGH_SERIFED,
+    DWRITE_PANOSE_MIDLINE_CONSTANT_TRIMMED,
+    DWRITE_PANOSE_MIDLINE_CONSTANT_POINTED,
+    DWRITE_PANOSE_MIDLINE_CONSTANT_SERIFED,
+    DWRITE_PANOSE_MIDLINE_LOW_TRIMMED,
+    DWRITE_PANOSE_MIDLINE_LOW_POINTED,
+    DWRITE_PANOSE_MIDLINE_LOW_SERIFED
+} DWRITE_PANOSE_MIDLINE;
+
+typedef enum DWRITE_PANOSE_XHEIGHT
+{
+    DWRITE_PANOSE_XHEIGHT_ANY,
+    DWRITE_PANOSE_XHEIGHT_NO_FIT,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_SMALL,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_STANDARD,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_LARGE,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_SMALL,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_STANDARD,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_LARGE,
+    DWRITE_PANOSE_XHEIGHT_CONSTANT_STD = DWRITE_PANOSE_XHEIGHT_CONSTANT_STANDARD,
+    DWRITE_PANOSE_XHEIGHT_DUCKING_STD = DWRITE_PANOSE_XHEIGHT_DUCKING_STANDARD
+} DWRITE_PANOSE_XHEIGHT;
+
+typedef enum DWRITE_PANOSE_TOOL_KIND
+{
+    DWRITE_PANOSE_TOOL_KIND_ANY,
+    DWRITE_PANOSE_TOOL_KIND_NO_FIT,
+    DWRITE_PANOSE_TOOL_KIND_FLAT_NIB,
+    DWRITE_PANOSE_TOOL_KIND_PRESSURE_POINT,
+    DWRITE_PANOSE_TOOL_KIND_ENGRAVED,
+    DWRITE_PANOSE_TOOL_KIND_BALL,
+    DWRITE_PANOSE_TOOL_KIND_BRUSH,
+    DWRITE_PANOSE_TOOL_KIND_ROUGH,
+    DWRITE_PANOSE_TOOL_KIND_FELT_PEN_BRUSH_TIP,
+    DWRITE_PANOSE_TOOL_KIND_WILD_BRUSH
+} DWRITE_PANOSE_TOOL_KIND;
+
+typedef enum DWRITE_PANOSE_SPACING
+{
+    DWRITE_PANOSE_SPACING_ANY,
+    DWRITE_PANOSE_SPACING_NO_FIT,
+    DWRITE_PANOSE_SPACING_PROPORTIONAL_SPACED,
+    DWRITE_PANOSE_SPACING_MONOSPACED
+} DWRITE_PANOSE_SPACING;
+
+typedef enum DWRITE_PANOSE_ASPECT_RATIO
+{
+    DWRITE_PANOSE_ASPECT_RATIO_ANY,
+    DWRITE_PANOSE_ASPECT_RATIO_NO_FIT,
+    DWRITE_PANOSE_ASPECT_RATIO_VERY_CONDENSED,
+    DWRITE_PANOSE_ASPECT_RATIO_CONDENSED,
+    DWRITE_PANOSE_ASPECT_RATIO_NORMAL,
+    DWRITE_PANOSE_ASPECT_RATIO_EXPANDED,
+    DWRITE_PANOSE_ASPECT_RATIO_VERY_EXPANDED
+} DWRITE_PANOSE_ASPECT_RATIO;
+
+typedef enum DWRITE_PANOSE_SCRIPT_TOPOLOGY
+{
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ANY,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_NO_FIT,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ROMAN_DISCONNECTED,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ROMAN_TRAILING,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_ROMAN_CONNECTED,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_CURSIVE_DISCONNECTED,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_CURSIVE_TRAILING,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_CURSIVE_CONNECTED,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_BLACKLETTER_DISCONNECTED,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_BLACKLETTER_TRAILING,
+    DWRITE_PANOSE_SCRIPT_TOPOLOGY_BLACKLETTER_CONNECTED
+} DWRITE_PANOSE_SCRIPT_TOPOLOGY;
+
+typedef enum DWRITE_PANOSE_SCRIPT_FORM
+{
+    DWRITE_PANOSE_SCRIPT_FORM_ANY,
+    DWRITE_PANOSE_SCRIPT_FORM_NO_FIT,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_NO_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_SOME_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_MORE_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_UPRIGHT_EXTREME_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_NO_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_SOME_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_MORE_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_OBLIQUE_EXTREME_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_NO_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_SOME_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_MORE_WRAPPING,
+    DWRITE_PANOSE_SCRIPT_FORM_EXAGGERATED_EXTREME_WRAPPING
+} DWRITE_PANOSE_SCRIPT_FORM;
+
+typedef enum DWRITE_PANOSE_FINIALS
+{
+    DWRITE_PANOSE_FINIALS_ANY,
+    DWRITE_PANOSE_FINIALS_NO_FIT,
+    DWRITE_PANOSE_FINIALS_NONE_NO_LOOPS,
+    DWRITE_PANOSE_FINIALS_NONE_CLOSED_LOOPS,
+    DWRITE_PANOSE_FINIALS_NONE_OPEN_LOOPS,
+    DWRITE_PANOSE_FINIALS_SHARP_NO_LOOPS,
+    DWRITE_PANOSE_FINIALS_SHARP_CLOSED_LOOPS,
+    DWRITE_PANOSE_FINIALS_SHARP_OPEN_LOOPS,
+    DWRITE_PANOSE_FINIALS_TAPERED_NO_LOOPS,
+    DWRITE_PANOSE_FINIALS_TAPERED_CLOSED_LOOPS,
+    DWRITE_PANOSE_FINIALS_TAPERED_OPEN_LOOPS,
+    DWRITE_PANOSE_FINIALS_ROUND_NO_LOOPS,
+    DWRITE_PANOSE_FINIALS_ROUND_CLOSED_LOOPS,
+    DWRITE_PANOSE_FINIALS_ROUND_OPEN_LOOPS
+} DWRITE_PANOSE_FINIALS;
+
+typedef enum DWRITE_PANOSE_XASCENT
+{
+    DWRITE_PANOSE_XASCENT_ANY,
+    DWRITE_PANOSE_XASCENT_NO_FIT,
+    DWRITE_PANOSE_XASCENT_VERY_LOW,
+    DWRITE_PANOSE_XASCENT_LOW,
+    DWRITE_PANOSE_XASCENT_MEDIUM,
+    DWRITE_PANOSE_XASCENT_HIGH,
+    DWRITE_PANOSE_XASCENT_VERY_HIGH
+} DWRITE_PANOSE_XASCENT;
+
+typedef enum DWRITE_PANOSE_DECORATIVE_CLASS
+{
+    DWRITE_PANOSE_DECORATIVE_CLASS_ANY,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NO_FIT,
+    DWRITE_PANOSE_DECORATIVE_CLASS_DERIVATIVE,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NONSTANDARD_TOPOLOGY,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NONSTANDARD_ELEMENTS,
+    DWRITE_PANOSE_DECORATIVE_CLASS_NONSTANDARD_ASPECT,
+    DWRITE_PANOSE_DECORATIVE_CLASS_INITIALS,
+    DWRITE_PANOSE_DECORATIVE_CLASS_CARTOON,
+    DWRITE_PANOSE_DECORATIVE_CLASS_PICTURE_STEMS,
+    DWRITE_PANOSE_DECORATIVE_CLASS_ORNAMENTED,
+    DWRITE_PANOSE_DECORATIVE_CLASS_TEXT_AND_BACKGROUND,
+    DWRITE_PANOSE_DECORATIVE_CLASS_COLLAGE,
+    DWRITE_PANOSE_DECORATIVE_CLASS_MONTAGE
+} DWRITE_PANOSE_DECORATIVE_CLASS;
+
+typedef enum DWRITE_PANOSE_ASPECT
+{
+    DWRITE_PANOSE_ASPECT_ANY,
+    DWRITE_PANOSE_ASPECT_NO_FIT,
+    DWRITE_PANOSE_ASPECT_SUPER_CONDENSED,
+    DWRITE_PANOSE_ASPECT_VERY_CONDENSED,
+    DWRITE_PANOSE_ASPECT_CONDENSED,
+    DWRITE_PANOSE_ASPECT_NORMAL,
+    DWRITE_PANOSE_ASPECT_EXTENDED,
+    DWRITE_PANOSE_ASPECT_VERY_EXTENDED,
+    DWRITE_PANOSE_ASPECT_SUPER_EXTENDED,
+    DWRITE_PANOSE_ASPECT_MONOSPACED
+} DWRITE_PANOSE_ASPECT;
+
+typedef enum DWRITE_PANOSE_FILL
+{
+    DWRITE_PANOSE_FILL_ANY,
+    DWRITE_PANOSE_FILL_NO_FIT,
+    DWRITE_PANOSE_FILL_STANDARD_SOLID_FILL,
+    DWRITE_PANOSE_FILL_NO_FILL,
+    DWRITE_PANOSE_FILL_PATTERNED_FILL,
+    DWRITE_PANOSE_FILL_COMPLEX_FILL,
+    DWRITE_PANOSE_FILL_SHAPED_FILL,
+    DWRITE_PANOSE_FILL_DRAWN_DISTRESSED
+} DWRITE_PANOSE_FILL;
+
+typedef enum DWRITE_PANOSE_LINING
+{
+    DWRITE_PANOSE_LINING_ANY,
+    DWRITE_PANOSE_LINING_NO_FIT,
+    DWRITE_PANOSE_LINING_NONE,
+    DWRITE_PANOSE_LINING_INLINE,
+    DWRITE_PANOSE_LINING_OUTLINE,
+    DWRITE_PANOSE_LINING_ENGRAVED,
+    DWRITE_PANOSE_LINING_SHADOW,
+    DWRITE_PANOSE_LINING_RELIEF,
+    DWRITE_PANOSE_LINING_BACKDROP
+} DWRITE_PANOSE_LINING;
+
+typedef enum DWRITE_PANOSE_DECORATIVE_TOPOLOGY
+{
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_ANY,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_NO_FIT,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_STANDARD,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_SQUARE,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_MULTIPLE_SEGMENT,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_ART_DECO,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_UNEVEN_WEIGHTING,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_DIVERSE_ARMS,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_DIVERSE_FORMS,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_LOMBARDIC_FORMS,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_UPPER_CASE_IN_LOWER_CASE,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_IMPLIED_TOPOLOGY,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_HORSESHOE_E_AND_A,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_CURSIVE,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_BLACKLETTER,
+    DWRITE_PANOSE_DECORATIVE_TOPOLOGY_SWASH_VARIANCE
+} DWRITE_PANOSE_DECORATIVE_TOPOLOGY;
+
+typedef enum DWRITE_PANOSE_CHARACTER_RANGES
+{
+    DWRITE_PANOSE_CHARACTER_RANGES_ANY,
+    DWRITE_PANOSE_CHARACTER_RANGES_NO_FIT,
+    DWRITE_PANOSE_CHARACTER_RANGES_EXTENDED_COLLECTION,
+    DWRITE_PANOSE_CHARACTER_RANGES_LITERALS,
+    DWRITE_PANOSE_CHARACTER_RANGES_NO_LOWER_CASE,
+    DWRITE_PANOSE_CHARACTER_RANGES_SMALL_CAPS
+} DWRITE_PANOSE_CHARACTER_RANGES;
+
+typedef enum DWRITE_PANOSE_SYMBOL_KIND
+{
+    DWRITE_PANOSE_SYMBOL_KIND_ANY,
+    DWRITE_PANOSE_SYMBOL_KIND_NO_FIT,
+    DWRITE_PANOSE_SYMBOL_KIND_MONTAGES,
+    DWRITE_PANOSE_SYMBOL_KIND_PICTURES,
+    DWRITE_PANOSE_SYMBOL_KIND_SHAPES,
+    DWRITE_PANOSE_SYMBOL_KIND_SCIENTIFIC,
+    DWRITE_PANOSE_SYMBOL_KIND_MUSIC,
+    DWRITE_PANOSE_SYMBOL_KIND_EXPERT,
+    DWRITE_PANOSE_SYMBOL_KIND_PATTERNS,
+    DWRITE_PANOSE_SYMBOL_KIND_BOARDERS,
+    DWRITE_PANOSE_SYMBOL_KIND_ICONS,
+    DWRITE_PANOSE_SYMBOL_KIND_LOGOS,
+    DWRITE_PANOSE_SYMBOL_KIND_INDUSTRY_SPECIFIC
+} DWRITE_PANOSE_SYMBOL_KIND;
+
+typedef enum DWRITE_PANOSE_SYMBOL_ASPECT_RATIO
+{
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_ANY,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NO_FIT,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NO_WIDTH,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_EXCEPTIONALLY_WIDE,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_SUPER_WIDE,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_VERY_WIDE,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_WIDE,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NORMAL,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_NARROW,
+    DWRITE_PANOSE_SYMBOL_ASPECT_RATIO_VERY_NARROW
+} DWRITE_PANOSE_SYMBOL_ASPECT_RATIO;
+
+typedef enum DWRITE_OUTLINE_THRESHOLD
+{
+    DWRITE_OUTLINE_THRESHOLD_ANTIALIASED,
+    DWRITE_OUTLINE_THRESHOLD_ALIASED
+} DWRITE_OUTLINE_THRESHOLD;
+
+typedef enum DWRITE_BASELINE
+{
+    DWRITE_BASELINE_DEFAULT,
+    DWRITE_BASELINE_ROMAN,
+    DWRITE_BASELINE_CENTRAL,
+    DWRITE_BASELINE_MATH,
+    DWRITE_BASELINE_HANGING,
+    DWRITE_BASELINE_IDEOGRAPHIC_BOTTOM,
+    DWRITE_BASELINE_IDEOGRAPHIC_TOP,
+    DWRITE_BASELINE_MINIMUM,
+    DWRITE_BASELINE_MAXIMUM
+} DWRITE_BASELINE;
+
+typedef enum DWRITE_VERTICAL_GLYPH_ORIENTATION
+{
+    DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT,
+    DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED
+} DWRITE_VERTICAL_GLYPH_ORIENTATION;
+
+typedef enum DWRITE_GLYPH_ORIENTATION_ANGLE
+{
+    DWRITE_GLYPH_ORIENTATION_ANGLE_0_DEGREES,
+    DWRITE_GLYPH_ORIENTATION_ANGLE_90_DEGREES,
+    DWRITE_GLYPH_ORIENTATION_ANGLE_180_DEGREES,
+    DWRITE_GLYPH_ORIENTATION_ANGLE_270_DEGREES
+} DWRITE_GLYPH_ORIENTATION_ANGLE;
+
+typedef struct DWRITE_FONT_METRICS1
+{
+    UINT16 designUnitsPerEm;
+    UINT16 ascent;
+    UINT16 descent;
+    INT16 lineGap;
+    UINT16 capHeight;
+    UINT16 xHeight;
+    INT16 underlinePosition;
+    UINT16 underlineThickness;
+    INT16 strikethroughPosition;
+    UINT16 strikethroughThickness;
+    INT16 glyphBoxLeft;
+    INT16 glyphBoxTop;
+    INT16 glyphBoxRight;
+    INT16 glyphBoxBottom;
+    INT16 subscriptPositionX;
+    INT16 subscriptPositionY;
+    INT16 subscriptSizeX;
+    INT16 subscriptSizeY;
+    INT16 superscriptPositionX;
+    INT16 superscriptPositionY;
+    INT16 superscriptSizeX;
+    INT16 superscriptSizeY;
+    BOOL hasTypographicMetrics;
+} DWRITE_FONT_METRICS1;
+
+typedef struct DWRITE_CARET_METRICS
+{
+    INT16 slopeRise;
+    INT16 slopeRun;
+    INT16 offset;
+} DWRITE_CARET_METRICS;
+
+typedef union DWRITE_PANOSE
+{
+    UINT8 values[10];
+    UINT8 familyKind;
+    struct
+    {
+        UINT8 familyKind;
+        UINT8 serifStyle;
+        UINT8 weight;
+        UINT8 proportion;
+        UINT8 contrast;
+        UINT8 strokeVariation;
+        UINT8 armStyle;
+        UINT8 letterform;
+        UINT8 midline;
+        UINT8 xHeight;
+    } text;
+    struct
+    {
+        UINT8 familyKind;
+        UINT8 toolKind;
+        UINT8 weight;
+        UINT8 spacing;
+        UINT8 aspectRatio;
+        UINT8 contrast;
+        UINT8 scriptTopology;
+        UINT8 scriptForm;
+        UINT8 finials;
+        UINT8 xAscent;
+    } script;
+    struct
+    {
+        UINT8 familyKind;
+        UINT8 decorativeClass;
+        UINT8 weight;
+        UINT8 aspect;
+        UINT8 contrast;
+        UINT8 serifVariant;
+        UINT8 fill;
+        UINT8 lining;
+        UINT8 decorativeTopology;
+        UINT8 characterRange;
+    } decorative;
+    struct
+    {
+        UINT8 familyKind;
+        UINT8 symbolKind;
+        UINT8 weight;
+        UINT8 spacing;
+        UINT8 aspectRatioAndContrast;
+        UINT8 aspectRatio94;
+        UINT8 aspectRatio119;
+        UINT8 aspectRatio157;
+        UINT8 aspectRatio163;
+        UINT8 aspectRatio211;
+    } symbol;
+} DWRITE_PANOSE;
+
+typedef struct DWRITE_UNICODE_RANGE
+{
+    UINT32 first;
+    UINT32 last;
+} DWRITE_UNICODE_RANGE;
+
+typedef struct DWRITE_SCRIPT_PROPERTIES
+{
+    UINT32 isoScriptCode;
+    UINT32 isoScriptNumber;
+    UINT32 clusterLookahead;
+    UINT32 justificationCharacter;
+    UINT32 restrictCaretToClusters : 1;
+    UINT32 usesWordDividers : 1;
+    UINT32 isDiscreteWriting : 1;
+    UINT32 isBlockWriting : 1;
+    UINT32 isDistributedWithinCluster : 1;
+    UINT32 isConnectedWriting : 1;
+    UINT32 isCursiveWriting : 1;
+    UINT32 reserved : 25;
+} DWRITE_SCRIPT_PROPERTIES;
+
+typedef struct DWRITE_JUSTIFICATION_OPPORTUNITY
+{
+    FLOAT expansionMinimum;
+    FLOAT expansionMaximum;
+    FLOAT compressionMaximum;
+    UINT32 expansionPriority : 8;
+    UINT32 compressionPriority : 8;
+    UINT32 allowResidualExpansion : 1;
+    UINT32 allowResidualCompression : 1;
+    UINT32 applyToLeadingEdge : 1;
+    UINT32 applyToTrailingEdge : 1;
+    UINT32 reserved : 12;
+} DWRITE_JUSTIFICATION_OPPORTUNITY;
+
+interface IDWriteTextAnalysisSource1;
+interface IDWriteTextAnalysisSink1;
+interface IDWriteRenderingParams1;
+
+[
+local,
+object,
+uuid(30572f99-dac6-41db-a16e-0486307e606a)
+]
+interface IDWriteFactory1 : IDWriteFactory
+{
+    HRESULT GetEudcFontCollection(IDWriteFontCollection **collection,
+                                  [defaultvalue(FALSE)] BOOL check_for_updates);
+    HRESULT CreateCustomRenderingParams(FLOAT gamma,
+                                        FLOAT enhcontrast,
+                                        FLOAT enhcontrast_grayscale,
+                                        FLOAT cleartype_level,
+                                        DWRITE_PIXEL_GEOMETRY geometry,
+                                        DWRITE_RENDERING_MODE mode,
+                                        IDWriteRenderingParams1** params);
+}
+
+[
+local,
+object,
+uuid(a71efdb4-9fdb-4838-ad90-cfc3be8c3daf)
+]
+interface IDWriteFontFace1 : IDWriteFontFace
+{
+    void GetMetrics(DWRITE_FONT_METRICS1 *metrics);
+    HRESULT GetGdiCompatibleMetrics(FLOAT em_size,
+                                    FLOAT pixels_per_dip,
+                                    const DWRITE_MATRIX *transform,
+                                    DWRITE_FONT_METRICS1 *metrics);
+    void GetCaretMetrics(DWRITE_CARET_METRICS *metrics);
+    HRESULT GetUnicodeRanges(UINT32 max_count,
+                             DWRITE_UNICODE_RANGE *ranges,
+                             UINT32 *count);
+    BOOL IsMonospacedFont();
+    HRESULT GetDesignGlyphAdvances(UINT32 glyph_count,
+                                   UINT16 const *indices,
+                                   INT32 *advances,
+                                   [defaultvalue(FALSE)] BOOL is_sideways);
+    HRESULT GetGdiCompatibleGlyphAdvances(FLOAT em_size,
+                                          FLOAT pixels_per_dip,
+                                          const DWRITE_MATRIX *transform,
+                                          BOOL use_gdi_natural,
+                                          BOOL is_sideways,
+                                          UINT32 glyph_count,
+                                          const UINT16 *indices,
+                                          INT32 *advances);
+
+    HRESULT GetKerningPairAdjustments(UINT32 glyph_count,
+                                      const UINT16 *indices,
+                                      INT32 *adjustments);
+    BOOL HasKerningPairs();
+    HRESULT GetRecommendedRenderingMode(FLOAT font_emsize,
+                                        FLOAT dpiX,
+                                        FLOAT dpiY,
+                                        const DWRITE_MATRIX *transform,
+                                        BOOL is_sideways,
+                                        DWRITE_OUTLINE_THRESHOLD threshold,
+                                        DWRITE_MEASURING_MODE measuring_mode,
+                                        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT GetVerticalGlyphVariants(UINT32 glyph_count,
+                                     const UINT16 *nominal_indices,
+                                     UINT16 *vertical_indices);
+    BOOL HasVerticalGlyphVariants();
+}
+
+[
+local,
+object,
+uuid(acd16696-8c14-4f5d-877e-fe3fc1d32738)
+]
+interface IDWriteFont1 : IDWriteFont
+{
+    void GetMetrics(DWRITE_FONT_METRICS1 *metrics);
+    void GetPanose(DWRITE_PANOSE *panose);
+    HRESULT GetUnicodeRanges(UINT32 max_count,
+                             DWRITE_UNICODE_RANGE *ranges,
+                             UINT32 *count);
+    BOOL IsMonospacedFont();
+}
+
+[
+local,
+object,
+uuid(94413cf4-a6fc-4248-8b50-6674348fcad3)
+]
+interface IDWriteRenderingParams1 : IDWriteRenderingParams
+{
+    FLOAT GetGrayscaleEnhancedContrast();
+}
+
+[
+local,
+object,
+uuid(80dad800-e21f-4e83-96ce-bfcce500db7c)
+]
+interface IDWriteTextAnalyzer1 : IDWriteTextAnalyzer
+{
+    HRESULT ApplyCharacterSpacing(FLOAT leading_spacing,
+                                  FLOAT trailing_spacing,
+                                  FLOAT min_advance_width,
+                                  UINT32 len,
+                                  UINT32 glyph_count,
+                                  UINT16 const *clustermap,
+                                  FLOAT const *advances,
+                                  DWRITE_GLYPH_OFFSET const *offsets,
+                                  DWRITE_SHAPING_GLYPH_PROPERTIES const *props,
+                                  FLOAT *modified_advances,
+                                  DWRITE_GLYPH_OFFSET *modified_offsets);
+    HRESULT GetBaseline(IDWriteFontFace *face,
+                        DWRITE_BASELINE baseline,
+                        BOOL vertical,
+                        BOOL is_simulation_allowed,
+                        DWRITE_SCRIPT_ANALYSIS sa,
+                        const WCHAR *localeName,
+                        INT32 *baseline_coord,
+                        BOOL *exists);
+
+    HRESULT AnalyzeVerticalGlyphOrientation(
+        IDWriteTextAnalysisSource1* source,
+        UINT32 text_pos,
+        UINT32 len,
+        IDWriteTextAnalysisSink1 *sink);
+
+    HRESULT GetGlyphOrientationTransform(
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        BOOL is_sideways,
+        DWRITE_MATRIX *transform);
+
+    HRESULT GetScriptProperties(DWRITE_SCRIPT_ANALYSIS sa, DWRITE_SCRIPT_PROPERTIES *props);
+
+    HRESULT GetTextComplexity(const WCHAR *text,
+                              UINT32 len,
+                              IDWriteFontFace *face,
+                              BOOL *is_simple,
+                              UINT32 *len_read,
+                              UINT16 *indices);
+    HRESULT GetJustificationOpportunities(
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        DWRITE_JUSTIFICATION_OPPORTUNITY *jo);
+
+    HRESULT JustifyGlyphAdvances(
+        FLOAT width,
+        UINT32 glyph_count,
+        const DWRITE_JUSTIFICATION_OPPORTUNITY *jo,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        FLOAT *justifiedadvances,
+        DWRITE_GLYPH_OFFSET *justifiedoffsets);
+
+    HRESULT GetJustifiedGlyphs(
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        UINT32 max_glyphcount,
+        const UINT16 *clustermap,
+        const UINT16 *indices,
+        const FLOAT *advances,
+        const FLOAT *justifiedadvances,
+        const DWRITE_GLYPH_OFFSET *justifiedoffsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        UINT32 *actual_count,
+        UINT16 *modified_clustermap,
+        UINT16 *modified_indices,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets);
+}
+
+[
+local,
+object,
+uuid(639cfad8-0fb4-4b21-a58a-067920120009)
+]
+interface IDWriteTextAnalysisSource1 : IDWriteTextAnalysisSource
+{
+    HRESULT GetVerticalGlyphOrientation(
+        UINT32 pos,
+        UINT32 *length,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,
+        UINT8 *bidi_level);
+}
+
+[
+local,
+object,
+uuid(b0d941a0-85e7-4d8b-9fd3-5ced9934482a)
+]
+interface IDWriteTextAnalysisSink1 : IDWriteTextAnalysisSink
+{
+    HRESULT SetGlyphOrientation(
+        UINT32 pos,
+        UINT32 length,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        UINT8 adjusted_bidilevel,
+        BOOL is_sideways,
+        BOOL is_rtl);
+}
+
+[
+local,
+object,
+uuid(9064d822-80a7-465c-a986-df65f78b8feb)
+]
+interface IDWriteTextLayout1 : IDWriteTextLayout
+{
+    HRESULT SetPairKerning(
+        BOOL is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT GetPairKerning(
+        UINT32 position,
+        BOOL *is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT SetCharacterSpacing(
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT minimum_advance_width,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT GetCharacterSpacing(
+        UINT32 position,
+        FLOAT* leading_spacing,
+        FLOAT* trailing_spacing,
+        FLOAT* minimum_advance_width,
+        [defaultvalue(NULL)] DWRITE_TEXT_RANGE *range);
+}
+
+typedef enum DWRITE_TEXT_ANTIALIAS_MODE
+{
+    DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
+    DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE
+} DWRITE_TEXT_ANTIALIAS_MODE;
+
+[
+local,
+object,
+uuid(791e8298-3ef3-4230-9880-c9bdecc42064)
+]
+interface IDWriteBitmapRenderTarget1 : IDWriteBitmapRenderTarget
+{
+    DWRITE_TEXT_ANTIALIAS_MODE GetTextAntialiasMode();
+    HRESULT SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE mode);
+}
diff --git a/mingw-w64-headers/include/dwrite_2.h b/mingw-w64-headers/include/dwrite_2.h
index c939297..5157089 100644
--- a/mingw-w64-headers/include/dwrite_2.h
+++ b/mingw-w64-headers/include/dwrite_2.h
@@ -1,47 +1,163 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
+/*** Autogenerated by WIDL 5.13 from include/dwrite_2.idl - Do not edit ***/
 
-#ifndef DWRITE_2_H_INCLUDED
-#define DWRITE_2_H_INCLUDED
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#endif
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __dwrite_2_h__
+#define __dwrite_2_h__
+
+/* Forward declarations */
+
+#ifndef __IDWriteTextRenderer1_FWD_DEFINED__
+#define __IDWriteTextRenderer1_FWD_DEFINED__
+typedef interface IDWriteTextRenderer1 IDWriteTextRenderer1;
+#ifdef __cplusplus
+interface IDWriteTextRenderer1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFallback_FWD_DEFINED__
+#define __IDWriteFontFallback_FWD_DEFINED__
+typedef interface IDWriteFontFallback IDWriteFontFallback;
+#ifdef __cplusplus
+interface IDWriteFontFallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextFormat1_FWD_DEFINED__
+#define __IDWriteTextFormat1_FWD_DEFINED__
+typedef interface IDWriteTextFormat1 IDWriteTextFormat1;
+#ifdef __cplusplus
+interface IDWriteTextFormat1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextLayout2_FWD_DEFINED__
+#define __IDWriteTextLayout2_FWD_DEFINED__
+typedef interface IDWriteTextLayout2 IDWriteTextLayout2;
+#ifdef __cplusplus
+interface IDWriteTextLayout2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextAnalyzer2_FWD_DEFINED__
+#define __IDWriteTextAnalyzer2_FWD_DEFINED__
+typedef interface IDWriteTextAnalyzer2 IDWriteTextAnalyzer2;
+#ifdef __cplusplus
+interface IDWriteTextAnalyzer2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFallbackBuilder_FWD_DEFINED__
+#define __IDWriteFontFallbackBuilder_FWD_DEFINED__
+typedef interface IDWriteFontFallbackBuilder IDWriteFontFallbackBuilder;
+#ifdef __cplusplus
+interface IDWriteFontFallbackBuilder;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFont2_FWD_DEFINED__
+#define __IDWriteFont2_FWD_DEFINED__
+typedef interface IDWriteFont2 IDWriteFont2;
+#ifdef __cplusplus
+interface IDWriteFont2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace2_FWD_DEFINED__
+#define __IDWriteFontFace2_FWD_DEFINED__
+typedef interface IDWriteFontFace2 IDWriteFontFace2;
+#ifdef __cplusplus
+interface IDWriteFontFace2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteColorGlyphRunEnumerator_FWD_DEFINED__
+#define __IDWriteColorGlyphRunEnumerator_FWD_DEFINED__
+typedef interface IDWriteColorGlyphRunEnumerator IDWriteColorGlyphRunEnumerator;
+#ifdef __cplusplus
+interface IDWriteColorGlyphRunEnumerator;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteRenderingParams2_FWD_DEFINED__
+#define __IDWriteRenderingParams2_FWD_DEFINED__
+typedef interface IDWriteRenderingParams2 IDWriteRenderingParams2;
+#ifdef __cplusplus
+interface IDWriteRenderingParams2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFactory2_FWD_DEFINED__
+#define __IDWriteFactory2_FWD_DEFINED__
+typedef interface IDWriteFactory2 IDWriteFactory2;
+#ifdef __cplusplus
+interface IDWriteFactory2;
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
 
 #include <dwrite_1.h>
 
-typedef enum DWRITE_GRID_FIT_MODE
-{
-    DWRITE_GRID_FIT_MODE_DEFAULT,
-    DWRITE_GRID_FIT_MODE_DISABLED,
-    DWRITE_GRID_FIT_MODE_ENABLED
-} DWRITE_GRID_FIT_MODE;
+#ifdef __cplusplus
+extern "C" {
+#endif
 
+typedef enum DWRITE_OPTICAL_ALIGNMENT {
+    DWRITE_OPTICAL_ALIGNMENT_NONE = 0,
+    DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS = 1
+} DWRITE_OPTICAL_ALIGNMENT;
+typedef enum DWRITE_GRID_FIT_MODE {
+    DWRITE_GRID_FIT_MODE_DEFAULT = 0,
+    DWRITE_GRID_FIT_MODE_DISABLED = 1,
+    DWRITE_GRID_FIT_MODE_ENABLED = 2
+} DWRITE_GRID_FIT_MODE;
+typedef struct DWRITE_TEXT_METRICS1 {
+    FLOAT left;
+    FLOAT top;
+    FLOAT width;
+    FLOAT widthIncludingTrailingWhitespace;
+    FLOAT height;
+    FLOAT layoutWidth;
+    FLOAT layoutHeight;
+    UINT32 maxBidiReorderingDepth;
+    UINT32 lineCount;
+    FLOAT heightIncludingTrailingWhitespace;
+} DWRITE_TEXT_METRICS1;
 #ifndef D3DCOLORVALUE_DEFINED
-#define D3DCOLORVALUE_DEFINED
 typedef struct _D3DCOLORVALUE {
-    union {
+    __C89_NAMELESS union {
         FLOAT r;
         FLOAT dvR;
-    } DUMMYUNIONNAME1;
-    union {
+    } __C89_NAMELESSUNIONNAME1;
+    __C89_NAMELESS union {
         FLOAT g;
         FLOAT dvG;
-    } DUMMYUNIONNAME2;
-    union {
+    } __C89_NAMELESSUNIONNAME2;
+    __C89_NAMELESS union {
         FLOAT b;
         FLOAT dvB;
-    } DUMMYUNIONNAME3;
-    union {
+    } __C89_NAMELESSUNIONNAME3;
+    __C89_NAMELESS union {
         FLOAT a;
         FLOAT dvA;
-    } DUMMYUNIONNAME4;
-} D3DCOLORVALUE,*LPD3DCOLORVALUE;
-#endif /* D3DCOLORVALUE_DEFINED */
-
+    } __C89_NAMELESSUNIONNAME4;
+} D3DCOLORVALUE;
+#define D3DCOLORVALUE_DEFINED
+#endif
 typedef D3DCOLORVALUE DWRITE_COLOR_F;
-
-typedef struct DWRITE_COLOR_GLYPH_RUN
-{
+typedef struct DWRITE_COLOR_GLYPH_RUN {
     DWRITE_GLYPH_RUN glyphRun;
     DWRITE_GLYPH_RUN_DESCRIPTION *glyphRunDescription;
     FLOAT baselineOriginX;
@@ -49,447 +165,3131 @@
     DWRITE_COLOR_F runColor;
     UINT16 paletteIndex;
 } DWRITE_COLOR_GLYPH_RUN;
+/*****************************************************************************
+ * IDWriteTextRenderer1 interface
+ */
+#ifndef __IDWriteTextRenderer1_INTERFACE_DEFINED__
+#define __IDWriteTextRenderer1_INTERFACE_DEFINED__
 
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFallback
-DECLARE_INTERFACE_(IDWriteFontFallback,IUnknown)
+DEFINE_GUID(IID_IDWriteTextRenderer1, 0xd3e0e934, 0x22a0, 0x427e, 0xaa,0xe4, 0x7d,0x95,0x74,0xb5,0x9d,0xb1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d3e0e934-22a0-427e-aae4-7d9574b59db1")
+IDWriteTextRenderer1 : public IDWriteTextRenderer
 {
+    virtual HRESULT STDMETHODCALLTYPE DrawGlyphRun(
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        IUnknown *effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DrawUnderline(
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        const DWRITE_UNDERLINE *underline,
+        IUnknown *effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DrawStrikethrough(
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        const DWRITE_STRIKETHROUGH *strikethrough,
+        IUnknown *effect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DrawInlineObject(
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        IDWriteInlineObject *inlineObject,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *effect) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextRenderer1, 0xd3e0e934, 0x22a0, 0x427e, 0xaa,0xe4, 0x7d,0x95,0x74,0xb5,0x9d,0xb1)
+#endif
+#else
+typedef struct IDWriteTextRenderer1Vtbl {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextRenderer1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextRenderer1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextRenderer1 *This);
+
+    /*** IDWritePixelSnapping methods ***/
+    HRESULT (STDMETHODCALLTYPE *IsPixelSnappingDisabled)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        WINBOOL *disabled);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentTransform)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetPixelsPerDip)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        FLOAT *pixels_per_dip);
+
+    /*** IDWriteTextRenderer methods ***/
+    HRESULT (STDMETHODCALLTYPE *DrawGlyphRun)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_descr,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *DrawUnderline)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        const DWRITE_UNDERLINE *underline,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *DrawStrikethrough)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        FLOAT baselineOriginX,
+        FLOAT baselineOriginY,
+        const DWRITE_STRIKETHROUGH *strikethrough,
+        IUnknown *drawing_effect);
+
+    HRESULT (STDMETHODCALLTYPE *DrawInlineObject)(
+        IDWriteTextRenderer1 *This,
+        void *client_drawingcontext,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteInlineObject *object,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *drawing_effect);
+
+    /*** IDWriteTextRenderer1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextRenderer1_DrawGlyphRun)(
+        IDWriteTextRenderer1 *This,
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        IUnknown *effect);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextRenderer1_DrawUnderline)(
+        IDWriteTextRenderer1 *This,
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        const DWRITE_UNDERLINE *underline,
+        IUnknown *effect);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextRenderer1_DrawStrikethrough)(
+        IDWriteTextRenderer1 *This,
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        const DWRITE_STRIKETHROUGH *strikethrough,
+        IUnknown *effect);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextRenderer1_DrawInlineObject)(
+        IDWriteTextRenderer1 *This,
+        void *context,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        IDWriteInlineObject *inlineObject,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IUnknown *effect);
+
+    END_INTERFACE
+} IDWriteTextRenderer1Vtbl;
+
+interface IDWriteTextRenderer1 {
+    CONST_VTBL IDWriteTextRenderer1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextRenderer1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextRenderer1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextRenderer1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWritePixelSnapping methods ***/
+#define IDWriteTextRenderer1_IsPixelSnappingDisabled(This,client_drawingcontext,disabled) (This)->lpVtbl->IsPixelSnappingDisabled(This,client_drawingcontext,disabled)
+#define IDWriteTextRenderer1_GetCurrentTransform(This,client_drawingcontext,transform) (This)->lpVtbl->GetCurrentTransform(This,client_drawingcontext,transform)
+#define IDWriteTextRenderer1_GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip) (This)->lpVtbl->GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip)
+/*** IDWriteTextRenderer methods ***/
+/*** IDWriteTextRenderer1 methods ***/
+#define IDWriteTextRenderer1_DrawGlyphRun(This,context,originX,originY,angle,mode,run,rundescr,effect) (This)->lpVtbl->IDWriteTextRenderer1_DrawGlyphRun(This,context,originX,originY,angle,mode,run,rundescr,effect)
+#define IDWriteTextRenderer1_DrawUnderline(This,context,originX,originY,angle,underline,effect) (This)->lpVtbl->IDWriteTextRenderer1_DrawUnderline(This,context,originX,originY,angle,underline,effect)
+#define IDWriteTextRenderer1_DrawStrikethrough(This,context,originX,originY,angle,strikethrough,effect) (This)->lpVtbl->IDWriteTextRenderer1_DrawStrikethrough(This,context,originX,originY,angle,strikethrough,effect)
+#define IDWriteTextRenderer1_DrawInlineObject(This,context,originX,originY,angle,inlineObject,is_sideways,is_rtl,effect) (This)->lpVtbl->IDWriteTextRenderer1_DrawInlineObject(This,context,originX,originY,angle,inlineObject,is_sideways,is_rtl,effect)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextRenderer1_QueryInterface(IDWriteTextRenderer1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextRenderer1_AddRef(IDWriteTextRenderer1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextRenderer1_Release(IDWriteTextRenderer1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWritePixelSnapping methods ***/
+static FORCEINLINE HRESULT IDWriteTextRenderer1_IsPixelSnappingDisabled(IDWriteTextRenderer1* This,void *client_drawingcontext,WINBOOL *disabled) {
+    return This->lpVtbl->IsPixelSnappingDisabled(This,client_drawingcontext,disabled);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer1_GetCurrentTransform(IDWriteTextRenderer1* This,void *client_drawingcontext,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->GetCurrentTransform(This,client_drawingcontext,transform);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer1_GetPixelsPerDip(IDWriteTextRenderer1* This,void *client_drawingcontext,FLOAT *pixels_per_dip) {
+    return This->lpVtbl->GetPixelsPerDip(This,client_drawingcontext,pixels_per_dip);
+}
+/*** IDWriteTextRenderer methods ***/
+/*** IDWriteTextRenderer1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextRenderer1_DrawGlyphRun(IDWriteTextRenderer1* This,void *context,FLOAT originX,FLOAT originY,DWRITE_GLYPH_ORIENTATION_ANGLE angle,DWRITE_MEASURING_MODE mode,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,IUnknown *effect) {
+    return This->lpVtbl->IDWriteTextRenderer1_DrawGlyphRun(This,context,originX,originY,angle,mode,run,rundescr,effect);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer1_DrawUnderline(IDWriteTextRenderer1* This,void *context,FLOAT originX,FLOAT originY,DWRITE_GLYPH_ORIENTATION_ANGLE angle,const DWRITE_UNDERLINE *underline,IUnknown *effect) {
+    return This->lpVtbl->IDWriteTextRenderer1_DrawUnderline(This,context,originX,originY,angle,underline,effect);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer1_DrawStrikethrough(IDWriteTextRenderer1* This,void *context,FLOAT originX,FLOAT originY,DWRITE_GLYPH_ORIENTATION_ANGLE angle,const DWRITE_STRIKETHROUGH *strikethrough,IUnknown *effect) {
+    return This->lpVtbl->IDWriteTextRenderer1_DrawStrikethrough(This,context,originX,originY,angle,strikethrough,effect);
+}
+static FORCEINLINE HRESULT IDWriteTextRenderer1_DrawInlineObject(IDWriteTextRenderer1* This,void *context,FLOAT originX,FLOAT originY,DWRITE_GLYPH_ORIENTATION_ANGLE angle,IDWriteInlineObject *inlineObject,WINBOOL is_sideways,WINBOOL is_rtl,IUnknown *effect) {
+    return This->lpVtbl->IDWriteTextRenderer1_DrawInlineObject(This,context,originX,originY,angle,inlineObject,is_sideways,is_rtl,effect);
+}
+#endif
 #endif
 
-    STDMETHOD(MapCharacters)(THIS_
-        IDWriteTextAnalysisSource *analysisSource,
-        UINT32 textPosition,
-        UINT32 textLength,
-        IDWriteFontCollection *baseFontCollection,
-        wchar_t const *baseFamilyName,
+#endif
+
+
+#endif  /* __IDWriteTextRenderer1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFallback interface
+ */
+#ifndef __IDWriteFontFallback_INTERFACE_DEFINED__
+#define __IDWriteFontFallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFallback, 0xefa008f9, 0xf7a1, 0x48bf, 0xb0,0x5c, 0xf2,0x24,0x71,0x3c,0xc0,0xff);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("efa008f9-f7a1-48bf-b05c-f224713cc0ff")
+IDWriteFontFallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE MapCharacters(
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteFontCollection *basecollection,
+        const WCHAR *baseFamilyName,
         DWRITE_FONT_WEIGHT baseWeight,
         DWRITE_FONT_STYLE baseStyle,
         DWRITE_FONT_STRETCH baseStretch,
         UINT32 *mappedLength,
         IDWriteFont **mappedFont,
-        FLOAT *scale) PURE;
+        FLOAT *scale) = 0;
 
-    END_INTERFACE
 };
-
-__CRT_UUID_DECL(IDWriteFontFallback, 0xefa008f9,0xf7a1,0x48bf,0xb0,0x5c,0xf2,0x24,0x71,0x3c,0xc0,0xff)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFallbackBuilder
-DECLARE_INTERFACE_(IDWriteFontFallbackBuilder,IUnknown)
-{
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFallback, 0xefa008f9, 0xf7a1, 0x48bf, 0xb0,0x5c, 0xf2,0x24,0x71,0x3c,0xc0,0xff)
+#endif
+#else
+typedef struct IDWriteFontFallbackVtbl {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFallback *This);
+
+    /*** IDWriteFontFallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *MapCharacters)(
+        IDWriteFontFallback *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteFontCollection *basecollection,
+        const WCHAR *baseFamilyName,
+        DWRITE_FONT_WEIGHT baseWeight,
+        DWRITE_FONT_STYLE baseStyle,
+        DWRITE_FONT_STRETCH baseStretch,
+        UINT32 *mappedLength,
+        IDWriteFont **mappedFont,
+        FLOAT *scale);
+
+    END_INTERFACE
+} IDWriteFontFallbackVtbl;
+
+interface IDWriteFontFallback {
+    CONST_VTBL IDWriteFontFallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFallback methods ***/
+#define IDWriteFontFallback_MapCharacters(This,source,position,length,basecollection,baseFamilyName,baseWeight,baseStyle,baseStretch,mappedLength,mappedFont,scale) (This)->lpVtbl->MapCharacters(This,source,position,length,basecollection,baseFamilyName,baseWeight,baseStyle,baseStretch,mappedLength,mappedFont,scale)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFallback_QueryInterface(IDWriteFontFallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFallback_AddRef(IDWriteFontFallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFallback_Release(IDWriteFontFallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFallback methods ***/
+static FORCEINLINE HRESULT IDWriteFontFallback_MapCharacters(IDWriteFontFallback* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteFontCollection *basecollection,const WCHAR *baseFamilyName,DWRITE_FONT_WEIGHT baseWeight,DWRITE_FONT_STYLE baseStyle,DWRITE_FONT_STRETCH baseStretch,UINT32 *mappedLength,IDWriteFont **mappedFont,FLOAT *scale) {
+    return This->lpVtbl->MapCharacters(This,source,position,length,basecollection,baseFamilyName,baseWeight,baseStyle,baseStretch,mappedLength,mappedFont,scale);
+}
+#endif
 #endif
 
-    STDMETHOD(AddMapping)(THIS_
-        DWRITE_UNICODE_RANGE const *ranges,
+#endif
+
+
+#endif  /* __IDWriteFontFallback_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextFormat1 interface
+ */
+#ifndef __IDWriteTextFormat1_INTERFACE_DEFINED__
+#define __IDWriteTextFormat1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextFormat1, 0x5f174b49, 0x0d8b, 0x4cfb, 0x8b,0xca, 0xf1,0xcc,0xe9,0xd0,0x6c,0x67);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5f174b49-0d8b-4cfb-8bca-f1cce9d06c67")
+IDWriteTextFormat1 : public IDWriteTextFormat
+{
+    virtual HRESULT STDMETHODCALLTYPE SetVerticalGlyphOrientation(
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) = 0;
+
+    virtual DWRITE_VERTICAL_GLYPH_ORIENTATION STDMETHODCALLTYPE GetVerticalGlyphOrientation(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLastLineWrapping(
+        WINBOOL lastline_wrapping_enabled) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE GetLastLineWrapping(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOpticalAlignment(
+        DWRITE_OPTICAL_ALIGNMENT alignment) = 0;
+
+    virtual DWRITE_OPTICAL_ALIGNMENT STDMETHODCALLTYPE GetOpticalAlignment(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontFallback(
+        IDWriteFontFallback *fallback) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFallback(
+        IDWriteFontFallback **fallback) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextFormat1, 0x5f174b49, 0x0d8b, 0x4cfb, 0x8b,0xca, 0xf1,0xcc,0xe9,0xd0,0x6c,0x67)
+#endif
+#else
+typedef struct IDWriteTextFormat1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextFormat1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextFormat1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextFormat1 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextFormat1 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextFormat1 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextFormat1 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextFormat1 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextFormat1 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextFormat1 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextFormat1 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextFormat1 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextFormat1 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextFormat1 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextFormat1 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextFormat1 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextFormat1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextFormat1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextFormat1 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextFormat1 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextFormat1 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextFormat1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextFormat1 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextFormat1 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextFormat1 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextFormat1 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextFormat1 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextFormat1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextFormat1 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextFormat1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetVerticalGlyphOrientation)(
+        IDWriteTextFormat1 *This,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+
+    DWRITE_VERTICAL_GLYPH_ORIENTATION (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextFormat1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetLastLineWrapping)(
+        IDWriteTextFormat1 *This,
+        WINBOOL lastline_wrapping_enabled);
+
+    WINBOOL (STDMETHODCALLTYPE *GetLastLineWrapping)(
+        IDWriteTextFormat1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetOpticalAlignment)(
+        IDWriteTextFormat1 *This,
+        DWRITE_OPTICAL_ALIGNMENT alignment);
+
+    DWRITE_OPTICAL_ALIGNMENT (STDMETHODCALLTYPE *GetOpticalAlignment)(
+        IDWriteTextFormat1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFallback)(
+        IDWriteTextFormat1 *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFallback)(
+        IDWriteTextFormat1 *This,
+        IDWriteFontFallback **fallback);
+
+    END_INTERFACE
+} IDWriteTextFormat1Vtbl;
+
+interface IDWriteTextFormat1 {
+    CONST_VTBL IDWriteTextFormat1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextFormat1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextFormat1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextFormat1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextFormat1_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextFormat1_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextFormat1_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextFormat1_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextFormat1_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextFormat1_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextFormat1_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextFormat1_SetLineSpacing(This,spacing,line_spacing,baseline) (This)->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline)
+#define IDWriteTextFormat1_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextFormat1_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextFormat1_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextFormat1_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextFormat1_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextFormat1_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextFormat1_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextFormat1_GetLineSpacing(This,method,spacing,baseline) (This)->lpVtbl->GetLineSpacing(This,method,spacing,baseline)
+#define IDWriteTextFormat1_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteTextFormat1_GetFontFamilyNameLength(This) (This)->lpVtbl->GetFontFamilyNameLength(This)
+#define IDWriteTextFormat1_GetFontFamilyName(This,name,size) (This)->lpVtbl->GetFontFamilyName(This,name,size)
+#define IDWriteTextFormat1_GetFontWeight(This) (This)->lpVtbl->GetFontWeight(This)
+#define IDWriteTextFormat1_GetFontStyle(This) (This)->lpVtbl->GetFontStyle(This)
+#define IDWriteTextFormat1_GetFontStretch(This) (This)->lpVtbl->GetFontStretch(This)
+#define IDWriteTextFormat1_GetFontSize(This) (This)->lpVtbl->GetFontSize(This)
+#define IDWriteTextFormat1_GetLocaleNameLength(This) (This)->lpVtbl->GetLocaleNameLength(This)
+#define IDWriteTextFormat1_GetLocaleName(This,name,size) (This)->lpVtbl->GetLocaleName(This,name,size)
+/*** IDWriteTextFormat1 methods ***/
+#define IDWriteTextFormat1_SetVerticalGlyphOrientation(This,orientation) (This)->lpVtbl->SetVerticalGlyphOrientation(This,orientation)
+#define IDWriteTextFormat1_GetVerticalGlyphOrientation(This) (This)->lpVtbl->GetVerticalGlyphOrientation(This)
+#define IDWriteTextFormat1_SetLastLineWrapping(This,lastline_wrapping_enabled) (This)->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled)
+#define IDWriteTextFormat1_GetLastLineWrapping(This) (This)->lpVtbl->GetLastLineWrapping(This)
+#define IDWriteTextFormat1_SetOpticalAlignment(This,alignment) (This)->lpVtbl->SetOpticalAlignment(This,alignment)
+#define IDWriteTextFormat1_GetOpticalAlignment(This) (This)->lpVtbl->GetOpticalAlignment(This)
+#define IDWriteTextFormat1_SetFontFallback(This,fallback) (This)->lpVtbl->SetFontFallback(This,fallback)
+#define IDWriteTextFormat1_GetFontFallback(This,fallback) (This)->lpVtbl->GetFontFallback(This,fallback)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat1_QueryInterface(IDWriteTextFormat1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextFormat1_AddRef(IDWriteTextFormat1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextFormat1_Release(IDWriteTextFormat1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetTextAlignment(IDWriteTextFormat1* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetParagraphAlignment(IDWriteTextFormat1* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetWordWrapping(IDWriteTextFormat1* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetReadingDirection(IDWriteTextFormat1* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetFlowDirection(IDWriteTextFormat1* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetIncrementalTabStop(IDWriteTextFormat1* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetTrimming(IDWriteTextFormat1* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetLineSpacing(IDWriteTextFormat1* This,DWRITE_LINE_SPACING_METHOD spacing,FLOAT line_spacing,FLOAT baseline) {
+    return This->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextFormat1_GetTextAlignment(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextFormat1_GetParagraphAlignment(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextFormat1_GetWordWrapping(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextFormat1_GetReadingDirection(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextFormat1_GetFlowDirection(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat1_GetIncrementalTabStop(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_GetTrimming(IDWriteTextFormat1* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_GetLineSpacing(IDWriteTextFormat1* This,DWRITE_LINE_SPACING_METHOD *method,FLOAT *spacing,FLOAT *baseline) {
+    return This->lpVtbl->GetLineSpacing(This,method,spacing,baseline);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_GetFontCollection(IDWriteTextFormat1* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat1_GetFontFamilyNameLength(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetFontFamilyNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_GetFontFamilyName(IDWriteTextFormat1* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetFontFamilyName(This,name,size);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteTextFormat1_GetFontWeight(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetFontWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteTextFormat1_GetFontStyle(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetFontStyle(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteTextFormat1_GetFontStretch(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetFontStretch(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat1_GetFontSize(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetFontSize(This);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat1_GetLocaleNameLength(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetLocaleNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_GetLocaleName(IDWriteTextFormat1* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetLocaleName(This,name,size);
+}
+/*** IDWriteTextFormat1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetVerticalGlyphOrientation(IDWriteTextFormat1* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
+    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
+}
+static FORCEINLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextFormat1_GetVerticalGlyphOrientation(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetLastLineWrapping(IDWriteTextFormat1* This,WINBOOL lastline_wrapping_enabled) {
+    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
+}
+static FORCEINLINE WINBOOL IDWriteTextFormat1_GetLastLineWrapping(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetLastLineWrapping(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetOpticalAlignment(IDWriteTextFormat1* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
+    return This->lpVtbl->SetOpticalAlignment(This,alignment);
+}
+static FORCEINLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextFormat1_GetOpticalAlignment(IDWriteTextFormat1* This) {
+    return This->lpVtbl->GetOpticalAlignment(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_SetFontFallback(IDWriteTextFormat1* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->SetFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat1_GetFontFallback(IDWriteTextFormat1* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetFontFallback(This,fallback);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextFormat1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextLayout2 interface
+ */
+#ifndef __IDWriteTextLayout2_INTERFACE_DEFINED__
+#define __IDWriteTextLayout2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextLayout2, 0x1093c18f, 0x8d5e, 0x43f0, 0xb0,0x64, 0x09,0x17,0x31,0x1b,0x52,0x5e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1093c18f-8d5e-43f0-b064-0917311b525e")
+IDWriteTextLayout2 : public IDWriteTextLayout1
+{
+    virtual HRESULT STDMETHODCALLTYPE GetMetrics(
+        DWRITE_TEXT_METRICS1 *metrics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetVerticalGlyphOrientation(
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) = 0;
+
+    virtual DWRITE_VERTICAL_GLYPH_ORIENTATION STDMETHODCALLTYPE GetVerticalGlyphOrientation(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLastLineWrapping(
+        WINBOOL lastline_wrapping_enabled) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE GetLastLineWrapping(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOpticalAlignment(
+        DWRITE_OPTICAL_ALIGNMENT alignment) = 0;
+
+    virtual DWRITE_OPTICAL_ALIGNMENT STDMETHODCALLTYPE GetOpticalAlignment(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFontFallback(
+        IDWriteFontFallback *fallback) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFallback(
+        IDWriteFontFallback **fallback) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextLayout2, 0x1093c18f, 0x8d5e, 0x43f0, 0xb0,0x64, 0x09,0x17,0x31,0x1b,0x52,0x5e)
+#endif
+#else
+typedef struct IDWriteTextLayout2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextLayout2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextLayout2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextLayout2 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextLayout2 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextLayout2 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextLayout2 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextLayout2 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextLayout2 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextLayout2 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextLayout2 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextLayout2 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextLayout2 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextLayout2 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextLayout2 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextLayout2 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextLayout2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextLayout2 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextLayout2 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextLayout2 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextLayout2 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextLayout2 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextLayout2 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextLayout2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextLayout2 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextLayout2 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextLayout methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetMaxWidth)(
+        IDWriteTextLayout2 *This,
+        FLOAT maxWidth);
+
+    HRESULT (STDMETHODCALLTYPE *SetMaxHeight)(
+        IDWriteTextLayout2 *This,
+        FLOAT maxHeight);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontCollection)(
+        IDWriteTextLayout2 *This,
+        IDWriteFontCollection *collection,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFamilyName)(
+        IDWriteTextLayout2 *This,
+        const WCHAR *name,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontWeight)(
+        IDWriteTextLayout2 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStyle)(
+        IDWriteTextLayout2 *This,
+        DWRITE_FONT_STYLE style,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStretch)(
+        IDWriteTextLayout2 *This,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontSize)(
+        IDWriteTextLayout2 *This,
+        FLOAT size,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetUnderline)(
+        IDWriteTextLayout2 *This,
+        WINBOOL underline,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetStrikethrough)(
+        IDWriteTextLayout2 *This,
+        WINBOOL strikethrough,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetDrawingEffect)(
+        IDWriteTextLayout2 *This,
+        IUnknown *effect,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetInlineObject)(
+        IDWriteTextLayout2 *This,
+        IDWriteInlineObject *object,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetTypography)(
+        IDWriteTextLayout2 *This,
+        IDWriteTypography *typography,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocaleName)(
+        IDWriteTextLayout2 *This,
+        const WCHAR *locale,
+        DWRITE_TEXT_RANGE range);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxWidth)(
+        IDWriteTextLayout2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxHeight)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontCollection)(
+        IDWriteTextLayout2 *This,
+        UINT32 pos,
+        IDWriteFontCollection **collection,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyNameLength)(
+        IDWriteTextLayout2 *This,
+        UINT32 pos,
+        UINT32 *len,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyName)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontWeight)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStyle)(
+        IDWriteTextLayout2 *This,
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStretch)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontSize)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        FLOAT *size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnderline)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        WINBOOL *has_underline,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetStrikethrough)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        WINBOOL *has_strikethrough,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetDrawingEffect)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        IUnknown **effect,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetInlineObject)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        IDWriteInlineObject **object,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypography)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        IDWriteTypography **typography,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleNameLength)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        UINT32 *length,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleName)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *Draw)(
+        IDWriteTextLayout2 *This,
+        void *context,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineMetrics)(
+        IDWriteTextLayout2 *This,
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteTextLayout2 *This,
+        DWRITE_TEXT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetOverhangMetrics)(
+        IDWriteTextLayout2 *This,
+        DWRITE_OVERHANG_METRICS *overhangs);
+
+    HRESULT (STDMETHODCALLTYPE *GetClusterMetrics)(
+        IDWriteTextLayout2 *This,
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *act_count);
+
+    HRESULT (STDMETHODCALLTYPE *DetermineMinWidth)(
+        IDWriteTextLayout2 *This,
+        FLOAT *min_width);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
+        IDWriteTextLayout2 *This,
+        FLOAT pointX,
+        FLOAT pointY,
+        WINBOOL *is_trailinghit,
+        WINBOOL *is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextPosition)(
+        IDWriteTextLayout2 *This,
+        UINT32 textPosition,
+        WINBOOL is_trailinghit,
+        FLOAT *pointX,
+        FLOAT *pointY,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextRange)(
+        IDWriteTextLayout2 *This,
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32 *actual_metricscount);
+
+    /*** IDWriteTextLayout1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetPairKerning)(
+        IDWriteTextLayout2 *This,
+        WINBOOL is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetPairKerning)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        WINBOOL *is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *SetCharacterSpacing)(
+        IDWriteTextLayout2 *This,
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT minimum_advance_width,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetCharacterSpacing)(
+        IDWriteTextLayout2 *This,
+        UINT32 position,
+        FLOAT *leading_spacing,
+        FLOAT *trailing_spacing,
+        FLOAT *minimum_advance_width,
+        DWRITE_TEXT_RANGE *range);
+
+    /*** IDWriteTextLayout2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout2_GetMetrics)(
+        IDWriteTextLayout2 *This,
+        DWRITE_TEXT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *SetVerticalGlyphOrientation)(
+        IDWriteTextLayout2 *This,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+
+    DWRITE_VERTICAL_GLYPH_ORIENTATION (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetLastLineWrapping)(
+        IDWriteTextLayout2 *This,
+        WINBOOL lastline_wrapping_enabled);
+
+    WINBOOL (STDMETHODCALLTYPE *GetLastLineWrapping)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetOpticalAlignment)(
+        IDWriteTextLayout2 *This,
+        DWRITE_OPTICAL_ALIGNMENT alignment);
+
+    DWRITE_OPTICAL_ALIGNMENT (STDMETHODCALLTYPE *GetOpticalAlignment)(
+        IDWriteTextLayout2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFallback)(
+        IDWriteTextLayout2 *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFallback)(
+        IDWriteTextLayout2 *This,
+        IDWriteFontFallback **fallback);
+
+    END_INTERFACE
+} IDWriteTextLayout2Vtbl;
+
+interface IDWriteTextLayout2 {
+    CONST_VTBL IDWriteTextLayout2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextLayout2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextLayout2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextLayout2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextLayout2_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextLayout2_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextLayout2_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextLayout2_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextLayout2_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextLayout2_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextLayout2_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextLayout2_SetLineSpacing(This,spacing,line_spacing,baseline) (This)->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline)
+#define IDWriteTextLayout2_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextLayout2_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextLayout2_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextLayout2_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextLayout2_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextLayout2_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextLayout2_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextLayout2_GetLineSpacing(This,method,spacing,baseline) (This)->lpVtbl->GetLineSpacing(This,method,spacing,baseline)
+/*** IDWriteTextLayout methods ***/
+#define IDWriteTextLayout2_SetMaxWidth(This,maxWidth) (This)->lpVtbl->SetMaxWidth(This,maxWidth)
+#define IDWriteTextLayout2_SetMaxHeight(This,maxHeight) (This)->lpVtbl->SetMaxHeight(This,maxHeight)
+#define IDWriteTextLayout2_SetFontCollection(This,collection,range) (This)->lpVtbl->SetFontCollection(This,collection,range)
+#define IDWriteTextLayout2_SetFontFamilyName(This,name,range) (This)->lpVtbl->SetFontFamilyName(This,name,range)
+#define IDWriteTextLayout2_SetFontWeight(This,weight,range) (This)->lpVtbl->SetFontWeight(This,weight,range)
+#define IDWriteTextLayout2_SetFontStyle(This,style,range) (This)->lpVtbl->SetFontStyle(This,style,range)
+#define IDWriteTextLayout2_SetFontStretch(This,stretch,range) (This)->lpVtbl->SetFontStretch(This,stretch,range)
+#define IDWriteTextLayout2_SetFontSize(This,size,range) (This)->lpVtbl->SetFontSize(This,size,range)
+#define IDWriteTextLayout2_SetUnderline(This,underline,range) (This)->lpVtbl->SetUnderline(This,underline,range)
+#define IDWriteTextLayout2_SetStrikethrough(This,strikethrough,range) (This)->lpVtbl->SetStrikethrough(This,strikethrough,range)
+#define IDWriteTextLayout2_SetDrawingEffect(This,effect,range) (This)->lpVtbl->SetDrawingEffect(This,effect,range)
+#define IDWriteTextLayout2_SetInlineObject(This,object,range) (This)->lpVtbl->SetInlineObject(This,object,range)
+#define IDWriteTextLayout2_SetTypography(This,typography,range) (This)->lpVtbl->SetTypography(This,typography,range)
+#define IDWriteTextLayout2_SetLocaleName(This,locale,range) (This)->lpVtbl->SetLocaleName(This,locale,range)
+#define IDWriteTextLayout2_GetMaxWidth(This) (This)->lpVtbl->GetMaxWidth(This)
+#define IDWriteTextLayout2_GetMaxHeight(This) (This)->lpVtbl->GetMaxHeight(This)
+#define IDWriteTextLayout2_GetFontCollection(This,pos,collection,range) (This)->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range)
+#define IDWriteTextLayout2_GetFontFamilyNameLength(This,pos,len,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range)
+#define IDWriteTextLayout2_GetFontFamilyName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range)
+#define IDWriteTextLayout2_GetFontWeight(This,position,weight,range) (This)->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range)
+#define IDWriteTextLayout2_GetFontStyle(This,currentPosition,style,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range)
+#define IDWriteTextLayout2_GetFontStretch(This,position,stretch,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range)
+#define IDWriteTextLayout2_GetFontSize(This,position,size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range)
+#define IDWriteTextLayout2_GetUnderline(This,position,has_underline,range) (This)->lpVtbl->GetUnderline(This,position,has_underline,range)
+#define IDWriteTextLayout2_GetStrikethrough(This,position,has_strikethrough,range) (This)->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range)
+#define IDWriteTextLayout2_GetDrawingEffect(This,position,effect,range) (This)->lpVtbl->GetDrawingEffect(This,position,effect,range)
+#define IDWriteTextLayout2_GetInlineObject(This,position,object,range) (This)->lpVtbl->GetInlineObject(This,position,object,range)
+#define IDWriteTextLayout2_GetTypography(This,position,typography,range) (This)->lpVtbl->GetTypography(This,position,typography,range)
+#define IDWriteTextLayout2_GetLocaleNameLength(This,position,length,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range)
+#define IDWriteTextLayout2_GetLocaleName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range)
+#define IDWriteTextLayout2_Draw(This,context,renderer,originX,originY) (This)->lpVtbl->Draw(This,context,renderer,originX,originY)
+#define IDWriteTextLayout2_GetLineMetrics(This,metrics,max_count,actual_count) (This)->lpVtbl->GetLineMetrics(This,metrics,max_count,actual_count)
+#define IDWriteTextLayout2_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
+#define IDWriteTextLayout2_GetClusterMetrics(This,metrics,max_count,act_count) (This)->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count)
+#define IDWriteTextLayout2_DetermineMinWidth(This,min_width) (This)->lpVtbl->DetermineMinWidth(This,min_width)
+#define IDWriteTextLayout2_HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics) (This)->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics)
+#define IDWriteTextLayout2_HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics) (This)->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics)
+#define IDWriteTextLayout2_HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount) (This)->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount)
+/*** IDWriteTextLayout1 methods ***/
+#define IDWriteTextLayout2_SetPairKerning(This,is_pairkerning_enabled,range) (This)->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range)
+#define IDWriteTextLayout2_GetPairKerning(This,position,is_pairkerning_enabled,range) (This)->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range)
+#define IDWriteTextLayout2_SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range)
+#define IDWriteTextLayout2_GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range)
+/*** IDWriteTextLayout2 methods ***/
+#define IDWriteTextLayout2_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics)
+#define IDWriteTextLayout2_SetVerticalGlyphOrientation(This,orientation) (This)->lpVtbl->SetVerticalGlyphOrientation(This,orientation)
+#define IDWriteTextLayout2_GetVerticalGlyphOrientation(This) (This)->lpVtbl->GetVerticalGlyphOrientation(This)
+#define IDWriteTextLayout2_SetLastLineWrapping(This,lastline_wrapping_enabled) (This)->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled)
+#define IDWriteTextLayout2_GetLastLineWrapping(This) (This)->lpVtbl->GetLastLineWrapping(This)
+#define IDWriteTextLayout2_SetOpticalAlignment(This,alignment) (This)->lpVtbl->SetOpticalAlignment(This,alignment)
+#define IDWriteTextLayout2_GetOpticalAlignment(This) (This)->lpVtbl->GetOpticalAlignment(This)
+#define IDWriteTextLayout2_SetFontFallback(This,fallback) (This)->lpVtbl->SetFontFallback(This,fallback)
+#define IDWriteTextLayout2_GetFontFallback(This,fallback) (This)->lpVtbl->GetFontFallback(This,fallback)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout2_QueryInterface(IDWriteTextLayout2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextLayout2_AddRef(IDWriteTextLayout2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextLayout2_Release(IDWriteTextLayout2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetTextAlignment(IDWriteTextLayout2* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetParagraphAlignment(IDWriteTextLayout2* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetWordWrapping(IDWriteTextLayout2* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetReadingDirection(IDWriteTextLayout2* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFlowDirection(IDWriteTextLayout2* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetIncrementalTabStop(IDWriteTextLayout2* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetTrimming(IDWriteTextLayout2* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetLineSpacing(IDWriteTextLayout2* This,DWRITE_LINE_SPACING_METHOD spacing,FLOAT line_spacing,FLOAT baseline) {
+    return This->lpVtbl->SetLineSpacing(This,spacing,line_spacing,baseline);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout2_GetTextAlignment(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout2_GetParagraphAlignment(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextLayout2_GetWordWrapping(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextLayout2_GetReadingDirection(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout2_GetFlowDirection(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout2_GetIncrementalTabStop(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetTrimming(IDWriteTextLayout2* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetLineSpacing(IDWriteTextLayout2* This,DWRITE_LINE_SPACING_METHOD *method,FLOAT *spacing,FLOAT *baseline) {
+    return This->lpVtbl->GetLineSpacing(This,method,spacing,baseline);
+}
+/*** IDWriteTextLayout methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetMaxWidth(IDWriteTextLayout2* This,FLOAT maxWidth) {
+    return This->lpVtbl->SetMaxWidth(This,maxWidth);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetMaxHeight(IDWriteTextLayout2* This,FLOAT maxHeight) {
+    return This->lpVtbl->SetMaxHeight(This,maxHeight);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontCollection(IDWriteTextLayout2* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontCollection(This,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontFamilyName(IDWriteTextLayout2* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontFamilyName(This,name,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontWeight(IDWriteTextLayout2* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontWeight(This,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontStyle(IDWriteTextLayout2* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStyle(This,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontStretch(IDWriteTextLayout2* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStretch(This,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontSize(IDWriteTextLayout2* This,FLOAT size,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontSize(This,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetUnderline(IDWriteTextLayout2* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetUnderline(This,underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetStrikethrough(IDWriteTextLayout2* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetDrawingEffect(IDWriteTextLayout2* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetDrawingEffect(This,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetInlineObject(IDWriteTextLayout2* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetInlineObject(This,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetTypography(IDWriteTextLayout2* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetTypography(This,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetLocaleName(IDWriteTextLayout2* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetLocaleName(This,locale,range);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout2_GetMaxWidth(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetMaxWidth(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout2_GetMaxHeight(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetMaxHeight(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontCollection(IDWriteTextLayout2* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontFamilyNameLength(IDWriteTextLayout2* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontFamilyName(IDWriteTextLayout2* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontWeight(IDWriteTextLayout2* This,UINT32 position,DWRITE_FONT_WEIGHT *weight,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontStyle(IDWriteTextLayout2* This,UINT32 currentPosition,DWRITE_FONT_STYLE *style,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontStretch(IDWriteTextLayout2* This,UINT32 position,DWRITE_FONT_STRETCH *stretch,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontSize(IDWriteTextLayout2* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetUnderline(IDWriteTextLayout2* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetStrikethrough(IDWriteTextLayout2* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetDrawingEffect(IDWriteTextLayout2* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetInlineObject(IDWriteTextLayout2* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetInlineObject(This,position,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetTypography(IDWriteTextLayout2* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetTypography(This,position,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetLocaleNameLength(IDWriteTextLayout2* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetLocaleName(IDWriteTextLayout2* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_Draw(IDWriteTextLayout2* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
+    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetLineMetrics(IDWriteTextLayout2* This,DWRITE_LINE_METRICS *metrics,UINT32 max_count,UINT32 *actual_count) {
+    return This->lpVtbl->GetLineMetrics(This,metrics,max_count,actual_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetOverhangMetrics(IDWriteTextLayout2* This,DWRITE_OVERHANG_METRICS *overhangs) {
+    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetClusterMetrics(IDWriteTextLayout2* This,DWRITE_CLUSTER_METRICS *metrics,UINT32 max_count,UINT32 *act_count) {
+    return This->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_DetermineMinWidth(IDWriteTextLayout2* This,FLOAT *min_width) {
+    return This->lpVtbl->DetermineMinWidth(This,min_width);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_HitTestPoint(IDWriteTextLayout2* This,FLOAT pointX,FLOAT pointY,WINBOOL *is_trailinghit,WINBOOL *is_inside,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_HitTestTextPosition(IDWriteTextLayout2* This,UINT32 textPosition,WINBOOL is_trailinghit,FLOAT *pointX,FLOAT *pointY,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_HitTestTextRange(IDWriteTextLayout2* This,UINT32 textPosition,UINT32 textLength,FLOAT originX,FLOAT originY,DWRITE_HIT_TEST_METRICS *metrics,UINT32 max_metricscount,UINT32 *actual_metricscount) {
+    return This->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount);
+}
+/*** IDWriteTextLayout1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetPairKerning(IDWriteTextLayout2* This,WINBOOL is_pairkerning_enabled,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetPairKerning(IDWriteTextLayout2* This,UINT32 position,WINBOOL *is_pairkerning_enabled,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetCharacterSpacing(IDWriteTextLayout2* This,FLOAT leading_spacing,FLOAT trailing_spacing,FLOAT minimum_advance_width,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetCharacterSpacing(IDWriteTextLayout2* This,UINT32 position,FLOAT *leading_spacing,FLOAT *trailing_spacing,FLOAT *minimum_advance_width,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+/*** IDWriteTextLayout2 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetMetrics(IDWriteTextLayout2* This,DWRITE_TEXT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetVerticalGlyphOrientation(IDWriteTextLayout2* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
+    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
+}
+static FORCEINLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextLayout2_GetVerticalGlyphOrientation(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetLastLineWrapping(IDWriteTextLayout2* This,WINBOOL lastline_wrapping_enabled) {
+    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
+}
+static FORCEINLINE WINBOOL IDWriteTextLayout2_GetLastLineWrapping(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetLastLineWrapping(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetOpticalAlignment(IDWriteTextLayout2* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
+    return This->lpVtbl->SetOpticalAlignment(This,alignment);
+}
+static FORCEINLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextLayout2_GetOpticalAlignment(IDWriteTextLayout2* This) {
+    return This->lpVtbl->GetOpticalAlignment(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_SetFontFallback(IDWriteTextLayout2* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->SetFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout2_GetFontFallback(IDWriteTextLayout2* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetFontFallback(This,fallback);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextLayout2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextAnalyzer2 interface
+ */
+#ifndef __IDWriteTextAnalyzer2_INTERFACE_DEFINED__
+#define __IDWriteTextAnalyzer2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextAnalyzer2, 0x553a9ff3, 0x5693, 0x4df7, 0xb5,0x2b, 0x74,0x80,0x6f,0x7f,0x2e,0xb9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("553a9ff3-5693-4df7-b52b-74806f7f2eb9")
+IDWriteTextAnalyzer2 : public IDWriteTextAnalyzer1
+{
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphOrientationTransform(
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        WINBOOL is_sideways,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_MATRIX *transform) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTypographicFeatures(
+        IDWriteFontFace *fontface,
+        DWRITE_SCRIPT_ANALYSIS analysis,
+        const WCHAR *localeName,
+        UINT32 max_tagcount,
+        UINT32 *actual_tagcount,
+        DWRITE_FONT_FEATURE_TAG *tags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CheckTypographicFeature(
+        IDWriteFontFace *fontface,
+        DWRITE_SCRIPT_ANALYSIS analysis,
+        const WCHAR *localeName,
+        DWRITE_FONT_FEATURE_TAG feature,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        UINT8 *feature_applies) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextAnalyzer2, 0x553a9ff3, 0x5693, 0x4df7, 0xb5,0x2b, 0x74,0x80,0x6f,0x7f,0x2e,0xb9)
+#endif
+#else
+typedef struct IDWriteTextAnalyzer2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextAnalyzer2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextAnalyzer2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextAnalyzer2 *This);
+
+    /*** IDWriteTextAnalyzer methods ***/
+    HRESULT (STDMETHODCALLTYPE *AnalyzeScript)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeBidi)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeNumberSubstitution)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeLineBreakpoints)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteTextAnalysisSink *sink);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphs)(
+        IDWriteTextAnalyzer2 *This,
+        const WCHAR *text,
+        UINT32 length,
+        IDWriteFontFace *font_face,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        IDWriteNumberSubstitution *substitution,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        UINT32 max_glyph_count,
+        UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *text_props,
+        UINT16 *glyph_indices,
+        DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 *actual_glyph_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphPlacements)(
+        IDWriteTextAnalyzer2 *This,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_len,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphPlacements)(
+        IDWriteTextAnalyzer2 *This,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        DWRITE_SHAPING_TEXT_PROPERTIES *props,
+        UINT32 text_len,
+        const UINT16 *glyph_indices,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,
+        UINT32 glyph_count,
+        IDWriteFontFace *font_face,
+        FLOAT fontEmSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        const DWRITE_SCRIPT_ANALYSIS *analysis,
+        const WCHAR *locale,
+        const DWRITE_TYPOGRAPHIC_FEATURES **features,
+        const UINT32 *feature_range_lengths,
+        UINT32 feature_ranges,
+        FLOAT *glyph_advances,
+        DWRITE_GLYPH_OFFSET *glyph_offsets);
+
+    /*** IDWriteTextAnalyzer1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *ApplyCharacterSpacing)(
+        IDWriteTextAnalyzer2 *This,
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT min_advance_width,
+        UINT32 len,
+        UINT32 glyph_count,
+        const UINT16 *clustermap,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *props,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetBaseline)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteFontFace *face,
+        DWRITE_BASELINE baseline,
+        WINBOOL vertical,
+        WINBOOL is_simulation_allowed,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        const WCHAR *localeName,
+        INT32 *baseline_coord,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *AnalyzeVerticalGlyphOrientation)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteTextAnalysisSource1 *source,
+        UINT32 text_pos,
+        UINT32 len,
+        IDWriteTextAnalysisSink1 *sink);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphOrientationTransform)(
+        IDWriteTextAnalyzer2 *This,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        WINBOOL is_sideways,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptProperties)(
+        IDWriteTextAnalyzer2 *This,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        DWRITE_SCRIPT_PROPERTIES *props);
+
+    HRESULT (STDMETHODCALLTYPE *GetTextComplexity)(
+        IDWriteTextAnalyzer2 *This,
+        const WCHAR *text,
+        UINT32 len,
+        IDWriteFontFace *face,
+        WINBOOL *is_simple,
+        UINT32 *len_read,
+        UINT16 *indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetJustificationOpportunities)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        const WCHAR *text,
+        const UINT16 *clustermap,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        DWRITE_JUSTIFICATION_OPPORTUNITY *jo);
+
+    HRESULT (STDMETHODCALLTYPE *JustifyGlyphAdvances)(
+        IDWriteTextAnalyzer2 *This,
+        FLOAT width,
+        UINT32 glyph_count,
+        const DWRITE_JUSTIFICATION_OPPORTUNITY *jo,
+        const FLOAT *advances,
+        const DWRITE_GLYPH_OFFSET *offsets,
+        FLOAT *justifiedadvances,
+        DWRITE_GLYPH_OFFSET *justifiedoffsets);
+
+    HRESULT (STDMETHODCALLTYPE *GetJustifiedGlyphs)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteFontFace *face,
+        FLOAT font_em_size,
+        DWRITE_SCRIPT_ANALYSIS sa,
+        UINT32 length,
+        UINT32 glyph_count,
+        UINT32 max_glyphcount,
+        const UINT16 *clustermap,
+        const UINT16 *indices,
+        const FLOAT *advances,
+        const FLOAT *justifiedadvances,
+        const DWRITE_GLYPH_OFFSET *justifiedoffsets,
+        const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,
+        UINT32 *actual_count,
+        UINT16 *modified_clustermap,
+        UINT16 *modified_indices,
+        FLOAT *modified_advances,
+        DWRITE_GLYPH_OFFSET *modified_offsets);
+
+    /*** IDWriteTextAnalyzer2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextAnalyzer2_GetGlyphOrientationTransform)(
+        IDWriteTextAnalyzer2 *This,
+        DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+        WINBOOL is_sideways,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_MATRIX *transform);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypographicFeatures)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteFontFace *fontface,
+        DWRITE_SCRIPT_ANALYSIS analysis,
+        const WCHAR *localeName,
+        UINT32 max_tagcount,
+        UINT32 *actual_tagcount,
+        DWRITE_FONT_FEATURE_TAG *tags);
+
+    HRESULT (STDMETHODCALLTYPE *CheckTypographicFeature)(
+        IDWriteTextAnalyzer2 *This,
+        IDWriteFontFace *fontface,
+        DWRITE_SCRIPT_ANALYSIS analysis,
+        const WCHAR *localeName,
+        DWRITE_FONT_FEATURE_TAG feature,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        UINT8 *feature_applies);
+
+    END_INTERFACE
+} IDWriteTextAnalyzer2Vtbl;
+
+interface IDWriteTextAnalyzer2 {
+    CONST_VTBL IDWriteTextAnalyzer2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextAnalyzer2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextAnalyzer2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextAnalyzer2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextAnalyzer methods ***/
+#define IDWriteTextAnalyzer2_AnalyzeScript(This,source,position,length,sink) (This)->lpVtbl->AnalyzeScript(This,source,position,length,sink)
+#define IDWriteTextAnalyzer2_AnalyzeBidi(This,source,position,length,sink) (This)->lpVtbl->AnalyzeBidi(This,source,position,length,sink)
+#define IDWriteTextAnalyzer2_AnalyzeNumberSubstitution(This,source,position,length,sink) (This)->lpVtbl->AnalyzeNumberSubstitution(This,source,position,length,sink)
+#define IDWriteTextAnalyzer2_AnalyzeLineBreakpoints(This,source,position,length,sink) (This)->lpVtbl->AnalyzeLineBreakpoints(This,source,position,length,sink)
+#define IDWriteTextAnalyzer2_GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count) (This)->lpVtbl->GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count)
+#define IDWriteTextAnalyzer2_GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets) (This)->lpVtbl->GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets)
+#define IDWriteTextAnalyzer2_GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets) (This)->lpVtbl->GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets)
+/*** IDWriteTextAnalyzer1 methods ***/
+#define IDWriteTextAnalyzer2_ApplyCharacterSpacing(This,leading_spacing,trailing_spacing,min_advance_width,len,glyph_count,clustermap,advances,offsets,props,modified_advances,modified_offsets) (This)->lpVtbl->ApplyCharacterSpacing(This,leading_spacing,trailing_spacing,min_advance_width,len,glyph_count,clustermap,advances,offsets,props,modified_advances,modified_offsets)
+#define IDWriteTextAnalyzer2_GetBaseline(This,face,baseline,vertical,is_simulation_allowed,sa,localeName,baseline_coord,exists) (This)->lpVtbl->GetBaseline(This,face,baseline,vertical,is_simulation_allowed,sa,localeName,baseline_coord,exists)
+#define IDWriteTextAnalyzer2_AnalyzeVerticalGlyphOrientation(This,source,text_pos,len,sink) (This)->lpVtbl->AnalyzeVerticalGlyphOrientation(This,source,text_pos,len,sink)
+#define IDWriteTextAnalyzer2_GetScriptProperties(This,sa,props) (This)->lpVtbl->GetScriptProperties(This,sa,props)
+#define IDWriteTextAnalyzer2_GetTextComplexity(This,text,len,face,is_simple,len_read,indices) (This)->lpVtbl->GetTextComplexity(This,text,len,face,is_simple,len_read,indices)
+#define IDWriteTextAnalyzer2_GetJustificationOpportunities(This,face,font_em_size,sa,length,glyph_count,text,clustermap,prop,jo) (This)->lpVtbl->GetJustificationOpportunities(This,face,font_em_size,sa,length,glyph_count,text,clustermap,prop,jo)
+#define IDWriteTextAnalyzer2_JustifyGlyphAdvances(This,width,glyph_count,jo,advances,offsets,justifiedadvances,justifiedoffsets) (This)->lpVtbl->JustifyGlyphAdvances(This,width,glyph_count,jo,advances,offsets,justifiedadvances,justifiedoffsets)
+#define IDWriteTextAnalyzer2_GetJustifiedGlyphs(This,face,font_em_size,sa,length,glyph_count,max_glyphcount,clustermap,indices,advances,justifiedadvances,justifiedoffsets,prop,actual_count,modified_clustermap,modified_indices,modified_advances,modified_offsets) (This)->lpVtbl->GetJustifiedGlyphs(This,face,font_em_size,sa,length,glyph_count,max_glyphcount,clustermap,indices,advances,justifiedadvances,justifiedoffsets,prop,actual_count,modified_clustermap,modified_indices,modified_advances,modified_offsets)
+/*** IDWriteTextAnalyzer2 methods ***/
+#define IDWriteTextAnalyzer2_GetGlyphOrientationTransform(This,angle,is_sideways,originX,originY,transform) (This)->lpVtbl->IDWriteTextAnalyzer2_GetGlyphOrientationTransform(This,angle,is_sideways,originX,originY,transform)
+#define IDWriteTextAnalyzer2_GetTypographicFeatures(This,fontface,analysis,localeName,max_tagcount,actual_tagcount,tags) (This)->lpVtbl->GetTypographicFeatures(This,fontface,analysis,localeName,max_tagcount,actual_tagcount,tags)
+#define IDWriteTextAnalyzer2_CheckTypographicFeature(This,fontface,analysis,localeName,feature,glyph_count,indices,feature_applies) (This)->lpVtbl->CheckTypographicFeature(This,fontface,analysis,localeName,feature,glyph_count,indices,feature_applies)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_QueryInterface(IDWriteTextAnalyzer2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextAnalyzer2_AddRef(IDWriteTextAnalyzer2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextAnalyzer2_Release(IDWriteTextAnalyzer2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextAnalyzer methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_AnalyzeScript(IDWriteTextAnalyzer2* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeScript(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_AnalyzeBidi(IDWriteTextAnalyzer2* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeBidi(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_AnalyzeNumberSubstitution(IDWriteTextAnalyzer2* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeNumberSubstitution(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_AnalyzeLineBreakpoints(IDWriteTextAnalyzer2* This,IDWriteTextAnalysisSource *source,UINT32 position,UINT32 length,IDWriteTextAnalysisSink *sink) {
+    return This->lpVtbl->AnalyzeLineBreakpoints(This,source,position,length,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetGlyphs(IDWriteTextAnalyzer2* This,const WCHAR *text,UINT32 length,IDWriteFontFace *font_face,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,IDWriteNumberSubstitution *substitution,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_len,UINT32 feature_ranges,UINT32 max_glyph_count,UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *text_props,UINT16 *glyph_indices,DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 *actual_glyph_count) {
+    return This->lpVtbl->GetGlyphs(This,text,length,font_face,is_sideways,is_rtl,analysis,locale,substitution,features,feature_range_len,feature_ranges,max_glyph_count,clustermap,text_props,glyph_indices,glyph_props,actual_glyph_count);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetGlyphPlacements(IDWriteTextAnalyzer2* This,const WCHAR *text,const UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *props,UINT32 text_len,const UINT16 *glyph_indices,const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 glyph_count,IDWriteFontFace *font_face,FLOAT fontEmSize,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_len,UINT32 feature_ranges,FLOAT *glyph_advances,DWRITE_GLYPH_OFFSET *glyph_offsets) {
+    return This->lpVtbl->GetGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,is_sideways,is_rtl,analysis,locale,features,feature_range_len,feature_ranges,glyph_advances,glyph_offsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetGdiCompatibleGlyphPlacements(IDWriteTextAnalyzer2* This,const WCHAR *text,const UINT16 *clustermap,DWRITE_SHAPING_TEXT_PROPERTIES *props,UINT32 text_len,const UINT16 *glyph_indices,const DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props,UINT32 glyph_count,IDWriteFontFace *font_face,FLOAT fontEmSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,WINBOOL is_rtl,const DWRITE_SCRIPT_ANALYSIS *analysis,const WCHAR *locale,const DWRITE_TYPOGRAPHIC_FEATURES **features,const UINT32 *feature_range_lengths,UINT32 feature_ranges,FLOAT *glyph_advances,DWRITE_GLYPH_OFFSET *glyph_offsets) {
+    return This->lpVtbl->GetGdiCompatibleGlyphPlacements(This,text,clustermap,props,text_len,glyph_indices,glyph_props,glyph_count,font_face,fontEmSize,pixels_per_dip,transform,use_gdi_natural,is_sideways,is_rtl,analysis,locale,features,feature_range_lengths,feature_ranges,glyph_advances,glyph_offsets);
+}
+/*** IDWriteTextAnalyzer1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_ApplyCharacterSpacing(IDWriteTextAnalyzer2* This,FLOAT leading_spacing,FLOAT trailing_spacing,FLOAT min_advance_width,UINT32 len,UINT32 glyph_count,const UINT16 *clustermap,const FLOAT *advances,const DWRITE_GLYPH_OFFSET *offsets,const DWRITE_SHAPING_GLYPH_PROPERTIES *props,FLOAT *modified_advances,DWRITE_GLYPH_OFFSET *modified_offsets) {
+    return This->lpVtbl->ApplyCharacterSpacing(This,leading_spacing,trailing_spacing,min_advance_width,len,glyph_count,clustermap,advances,offsets,props,modified_advances,modified_offsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetBaseline(IDWriteTextAnalyzer2* This,IDWriteFontFace *face,DWRITE_BASELINE baseline,WINBOOL vertical,WINBOOL is_simulation_allowed,DWRITE_SCRIPT_ANALYSIS sa,const WCHAR *localeName,INT32 *baseline_coord,WINBOOL *exists) {
+    return This->lpVtbl->GetBaseline(This,face,baseline,vertical,is_simulation_allowed,sa,localeName,baseline_coord,exists);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_AnalyzeVerticalGlyphOrientation(IDWriteTextAnalyzer2* This,IDWriteTextAnalysisSource1 *source,UINT32 text_pos,UINT32 len,IDWriteTextAnalysisSink1 *sink) {
+    return This->lpVtbl->AnalyzeVerticalGlyphOrientation(This,source,text_pos,len,sink);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetScriptProperties(IDWriteTextAnalyzer2* This,DWRITE_SCRIPT_ANALYSIS sa,DWRITE_SCRIPT_PROPERTIES *props) {
+    return This->lpVtbl->GetScriptProperties(This,sa,props);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetTextComplexity(IDWriteTextAnalyzer2* This,const WCHAR *text,UINT32 len,IDWriteFontFace *face,WINBOOL *is_simple,UINT32 *len_read,UINT16 *indices) {
+    return This->lpVtbl->GetTextComplexity(This,text,len,face,is_simple,len_read,indices);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetJustificationOpportunities(IDWriteTextAnalyzer2* This,IDWriteFontFace *face,FLOAT font_em_size,DWRITE_SCRIPT_ANALYSIS sa,UINT32 length,UINT32 glyph_count,const WCHAR *text,const UINT16 *clustermap,const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,DWRITE_JUSTIFICATION_OPPORTUNITY *jo) {
+    return This->lpVtbl->GetJustificationOpportunities(This,face,font_em_size,sa,length,glyph_count,text,clustermap,prop,jo);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_JustifyGlyphAdvances(IDWriteTextAnalyzer2* This,FLOAT width,UINT32 glyph_count,const DWRITE_JUSTIFICATION_OPPORTUNITY *jo,const FLOAT *advances,const DWRITE_GLYPH_OFFSET *offsets,FLOAT *justifiedadvances,DWRITE_GLYPH_OFFSET *justifiedoffsets) {
+    return This->lpVtbl->JustifyGlyphAdvances(This,width,glyph_count,jo,advances,offsets,justifiedadvances,justifiedoffsets);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetJustifiedGlyphs(IDWriteTextAnalyzer2* This,IDWriteFontFace *face,FLOAT font_em_size,DWRITE_SCRIPT_ANALYSIS sa,UINT32 length,UINT32 glyph_count,UINT32 max_glyphcount,const UINT16 *clustermap,const UINT16 *indices,const FLOAT *advances,const FLOAT *justifiedadvances,const DWRITE_GLYPH_OFFSET *justifiedoffsets,const DWRITE_SHAPING_GLYPH_PROPERTIES *prop,UINT32 *actual_count,UINT16 *modified_clustermap,UINT16 *modified_indices,FLOAT *modified_advances,DWRITE_GLYPH_OFFSET *modified_offsets) {
+    return This->lpVtbl->GetJustifiedGlyphs(This,face,font_em_size,sa,length,glyph_count,max_glyphcount,clustermap,indices,advances,justifiedadvances,justifiedoffsets,prop,actual_count,modified_clustermap,modified_indices,modified_advances,modified_offsets);
+}
+/*** IDWriteTextAnalyzer2 methods ***/
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetGlyphOrientationTransform(IDWriteTextAnalyzer2* This,DWRITE_GLYPH_ORIENTATION_ANGLE angle,WINBOOL is_sideways,FLOAT originX,FLOAT originY,DWRITE_MATRIX *transform) {
+    return This->lpVtbl->IDWriteTextAnalyzer2_GetGlyphOrientationTransform(This,angle,is_sideways,originX,originY,transform);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_GetTypographicFeatures(IDWriteTextAnalyzer2* This,IDWriteFontFace *fontface,DWRITE_SCRIPT_ANALYSIS analysis,const WCHAR *localeName,UINT32 max_tagcount,UINT32 *actual_tagcount,DWRITE_FONT_FEATURE_TAG *tags) {
+    return This->lpVtbl->GetTypographicFeatures(This,fontface,analysis,localeName,max_tagcount,actual_tagcount,tags);
+}
+static FORCEINLINE HRESULT IDWriteTextAnalyzer2_CheckTypographicFeature(IDWriteTextAnalyzer2* This,IDWriteFontFace *fontface,DWRITE_SCRIPT_ANALYSIS analysis,const WCHAR *localeName,DWRITE_FONT_FEATURE_TAG feature,UINT32 glyph_count,const UINT16 *indices,UINT8 *feature_applies) {
+    return This->lpVtbl->CheckTypographicFeature(This,fontface,analysis,localeName,feature,glyph_count,indices,feature_applies);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextAnalyzer2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFallbackBuilder interface
+ */
+#ifndef __IDWriteFontFallbackBuilder_INTERFACE_DEFINED__
+#define __IDWriteFontFallbackBuilder_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFallbackBuilder, 0xfd882d06, 0x8aba, 0x4fb8, 0xb8,0x49, 0x8b,0xe8,0xb7,0x3e,0x14,0xde);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("fd882d06-8aba-4fb8-b849-8be8b73e14de")
+IDWriteFontFallbackBuilder : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddMapping(
+        const DWRITE_UNICODE_RANGE *ranges,
         UINT32 rangesCount,
-        WCHAR const **targetFamilyNames,
+        const WCHAR **targetFamilyNames,
         UINT32 targetFamilyNamesCount,
-        IDWriteFontCollection *fontCollection __MINGW_DEF_ARG_VAL(NULL),
-        WCHAR const *localeName __MINGW_DEF_ARG_VAL(NULL),
-        WCHAR const *baseFamilyName __MINGW_DEF_ARG_VAL(NULL),
-        FLOAT scale __MINGW_DEF_ARG_VAL(1.0f)) PURE;
+        IDWriteFontCollection *collection = 0,
+        const WCHAR *localeName = 0,
+        const WCHAR *baseFamilyName = 0,
+        FLOAT scale = 1) = 0;
 
-    STDMETHOD(AddMappings)(THIS_
-        IDWriteFontFallback *fontFallback) PURE;
+    virtual HRESULT STDMETHODCALLTYPE AddMappings(
+        IDWriteFontFallback *fallback) = 0;
 
-    STDMETHOD(CreateFontFallback)(THIS_
-        IDWriteFontFallback **fontFallback) PURE;
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFallback(
+        IDWriteFontFallback **fallback) = 0;
 
-    END_INTERFACE
 };
-
-__CRT_UUID_DECL(IDWriteFontFallbackBuilder, 0xfd882d06,0x8aba,0x4fb8,0xb8,0x49,0x8b,0xe8,0xb7,0x3e,0x14,0xde)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteColorGlyphRunEnumerator
-DECLARE_INTERFACE_(IDWriteColorGlyphRunEnumerator,IUnknown)
-{
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFallbackBuilder, 0xfd882d06, 0x8aba, 0x4fb8, 0xb8,0x49, 0x8b,0xe8,0xb7,0x3e,0x14,0xde)
+#endif
+#else
+typedef struct IDWriteFontFallbackBuilderVtbl {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFallbackBuilder *This,
+        REFIID riid,
+        void **ppvObject);
 
-    STDMETHOD(MoveNext)(THIS_
-        BOOL *hasRun) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFallbackBuilder *This);
 
-    STDMETHOD(GetCurrentRun)(THIS_
-        DWRITE_COLOR_GLYPH_RUN const **colorGlyphRun) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFallbackBuilder *This);
+
+    /*** IDWriteFontFallbackBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddMapping)(
+        IDWriteFontFallbackBuilder *This,
+        const DWRITE_UNICODE_RANGE *ranges,
+        UINT32 rangesCount,
+        const WCHAR **targetFamilyNames,
+        UINT32 targetFamilyNamesCount,
+        IDWriteFontCollection *collection,
+        const WCHAR *localeName,
+        const WCHAR *baseFamilyName,
+        FLOAT scale);
+
+    HRESULT (STDMETHODCALLTYPE *AddMappings)(
+        IDWriteFontFallbackBuilder *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallback)(
+        IDWriteFontFallbackBuilder *This,
+        IDWriteFontFallback **fallback);
 
     END_INTERFACE
+} IDWriteFontFallbackBuilderVtbl;
+
+interface IDWriteFontFallbackBuilder {
+    CONST_VTBL IDWriteFontFallbackBuilderVtbl* lpVtbl;
 };
 
-__CRT_UUID_DECL(IDWriteColorGlyphRunEnumerator, 0xd31fbe17,0xf157,0x41a2,0x8d,0x24,0xcb,0x77,0x9e,0x05,0x60,0xe8)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteRenderingParams2
-DECLARE_INTERFACE_(IDWriteRenderingParams2,IDWriteRenderingParams1)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteRenderingParams methods */
-    STDMETHOD_(FLOAT, GetGamma)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetEnhancedContrast)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetClearTypeLevel)(THIS) PURE;
-    STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)(THIS) PURE;
-    STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)(THIS) PURE;
-
-    /* IDWriteRenderingParams1 methods */
-    STDMETHOD_(FLOAT, GetGrayscaleEnhancedContrast)(THIS) PURE;
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFallbackBuilder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFallbackBuilder_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFallbackBuilder_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFallbackBuilder methods ***/
+#define IDWriteFontFallbackBuilder_AddMapping(This,ranges,rangesCount,targetFamilyNames,targetFamilyNamesCount,collection,localeName,baseFamilyName,scale) (This)->lpVtbl->AddMapping(This,ranges,rangesCount,targetFamilyNames,targetFamilyNamesCount,collection,localeName,baseFamilyName,scale)
+#define IDWriteFontFallbackBuilder_AddMappings(This,fallback) (This)->lpVtbl->AddMappings(This,fallback)
+#define IDWriteFontFallbackBuilder_CreateFontFallback(This,fallback) (This)->lpVtbl->CreateFontFallback(This,fallback)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFallbackBuilder_QueryInterface(IDWriteFontFallbackBuilder* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFallbackBuilder_AddRef(IDWriteFontFallbackBuilder* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFallbackBuilder_Release(IDWriteFontFallbackBuilder* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFallbackBuilder methods ***/
+static FORCEINLINE HRESULT IDWriteFontFallbackBuilder_AddMapping(IDWriteFontFallbackBuilder* This,const DWRITE_UNICODE_RANGE *ranges,UINT32 rangesCount,const WCHAR **targetFamilyNames,UINT32 targetFamilyNamesCount,IDWriteFontCollection *collection,const WCHAR *localeName,const WCHAR *baseFamilyName,FLOAT scale) {
+    return This->lpVtbl->AddMapping(This,ranges,rangesCount,targetFamilyNames,targetFamilyNamesCount,collection,localeName,baseFamilyName,scale);
+}
+static FORCEINLINE HRESULT IDWriteFontFallbackBuilder_AddMappings(IDWriteFontFallbackBuilder* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->AddMappings(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFontFallbackBuilder_CreateFontFallback(IDWriteFontFallbackBuilder* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->CreateFontFallback(This,fallback);
+}
+#endif
 #endif
 
-    /* IDWriteRenderingParams2 methods */
-    STDMETHOD_(DWRITE_GRID_FIT_MODE, GetGridFitMode)(THIS) PURE;
+#endif
+
+
+#endif  /* __IDWriteFontFallbackBuilder_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFont2 interface
+ */
+#ifndef __IDWriteFont2_INTERFACE_DEFINED__
+#define __IDWriteFont2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFont2, 0x29748ed6, 0x8c9c, 0x4a6a, 0xbe,0x0b, 0xd9,0x12,0xe8,0x53,0x89,0x44);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("29748ed6-8c9c-4a6a-be0b-d912e8538944")
+IDWriteFont2 : public IDWriteFont1
+{
+    virtual WINBOOL STDMETHODCALLTYPE IsColorFont(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFont2, 0x29748ed6, 0x8c9c, 0x4a6a, 0xbe,0x0b, 0xd9,0x12,0xe8,0x53,0x89,0x44)
+#endif
+#else
+typedef struct IDWriteFont2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFont2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFont2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFont2 *This);
+
+    /*** IDWriteFont methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFont2 *This,
+        IDWriteFontFamily **family);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFont2 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFont2 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFont2 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFont2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFont2 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFont2 *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFont2 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFont2 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFont2 *This,
+        UINT32 value,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFont2 *This,
+        IDWriteFontFace **face);
+
+    /*** IDWriteFont1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFont1_GetMetrics)(
+        IDWriteFont2 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetPanose)(
+        IDWriteFont2 *This,
+        DWRITE_PANOSE *panose);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFont2 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFont2 *This);
+
+    /*** IDWriteFont2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
+        IDWriteFont2 *This);
 
     END_INTERFACE
+} IDWriteFont2Vtbl;
+
+interface IDWriteFont2 {
+    CONST_VTBL IDWriteFont2Vtbl* lpVtbl;
 };
 
-__CRT_UUID_DECL(IDWriteRenderingParams2, 0xf9d711c3,0x9777,0x40ae,0x87,0xe8,0x3e,0x5a,0xf9,0xbf,0x09,0x48)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFactory2
-DECLARE_INTERFACE_(IDWriteFactory2,IDWriteFactory1)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteFactory methods */
-    STDMETHOD(GetSystemFontCollection)(THIS_
-        IDWriteFontCollection **fontCollection,
-        WINBOOL checkForUpdates __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(CreateCustomFontCollection)(THIS_
-        IDWriteFontCollectionLoader *collectionLoader,
-        void const *collectionKey,
-        UINT32 collectionKeySize,
-        IDWriteFontCollection **fontCollection) PURE;
-
-    STDMETHOD(RegisterFontCollectionLoader)(THIS_
-        IDWriteFontCollectionLoader *fontCollectionLoader) PURE;
-
-    STDMETHOD(UnregisterFontCollectionLoader)(THIS_
-        IDWriteFontCollectionLoader *fontCollectionLoader) PURE;
-
-    STDMETHOD(CreateFontFileReference)(THIS_
-        WCHAR const *filePath,
-        FILETIME const *lastWriteTime,
-        IDWriteFontFile **fontFile) PURE;
-
-    STDMETHOD(CreateCustomFontFileReference)(THIS_
-        void const *fontFileReferenceKey,
-        UINT32 fontFileReferenceKeySize,
-        IDWriteFontFileLoader *fontFileLoader,
-        IDWriteFontFile **fontFile) PURE;
-
-    STDMETHOD(CreateFontFace)(THIS_
-        DWRITE_FONT_FACE_TYPE fontFaceType,
-        UINT32 numberOfFiles,
-        IDWriteFontFile *const *fontFiles,
-        UINT32 faceIndex,
-        DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
-        IDWriteFontFace **fontFace) PURE;
-
-    STDMETHOD(CreateRenderingParams)(THIS_
-        IDWriteRenderingParams **renderingParams) PURE;
-
-    STDMETHOD(CreateMonitorRenderingParams)(THIS_
-        HMONITOR monitor,
-        IDWriteRenderingParams **renderingParams) PURE;
-
-    STDMETHOD(CreateCustomRenderingParams)(THIS_
-        FLOAT gamma,
-        FLOAT enhancedContrast,
-        FLOAT clearTypeLevel,
-        DWRITE_PIXEL_GEOMETRY pixelGeometry,
-        DWRITE_RENDERING_MODE renderingMode,
-        IDWriteRenderingParams **renderingParams) PURE;
-
-    STDMETHOD(RegisterFontFileLoader)(THIS_
-        IDWriteFontFileLoader *fontFileLoader) PURE;
-
-    STDMETHOD(UnregisterFontFileLoader)(THIS_
-        IDWriteFontFileLoader *fontFileLoader) PURE;
-
-    STDMETHOD(CreateTextFormat)(THIS_
-        WCHAR const *fontFamilyName,
-        IDWriteFontCollection *fontCollection,
-        DWRITE_FONT_WEIGHT fontWeight,
-        DWRITE_FONT_STYLE fontStyle,
-        DWRITE_FONT_STRETCH fontStretch,
-        FLOAT fontSize,
-        WCHAR const *localeName,
-        IDWriteTextFormat **textFormat) PURE;
-
-    STDMETHOD(CreateTypography)(THIS_
-        IDWriteTypography **typography) PURE;
-
-    STDMETHOD(GetGdiInterop)(THIS_
-        IDWriteGdiInterop **gdiInterop) PURE;
-
-    STDMETHOD(CreateTextLayout)(THIS_
-        WCHAR const *string,
-        UINT32 stringLength,
-        IDWriteTextFormat *textFormat,
-        FLOAT maxWidth,
-        FLOAT maxHeight,
-        IDWriteTextLayout **textLayout) PURE;
-
-    STDMETHOD(CreateGdiCompatibleTextLayout)(THIS_
-        WCHAR const *string,
-        UINT32 stringLength,
-        IDWriteTextFormat *textFormat,
-        FLOAT layoutWidth,
-        FLOAT layoutHeight,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        IDWriteTextLayout **textLayout) PURE;
-
-    STDMETHOD(CreateEllipsisTrimmingSign)(THIS_
-        IDWriteTextFormat *textFormat,
-        IDWriteInlineObject **trimmingSign) PURE;
-
-    STDMETHOD(CreateTextAnalyzer)(THIS_
-        IDWriteTextAnalyzer **textAnalyzer) PURE;
-
-    STDMETHOD(CreateNumberSubstitution)(THIS_
-        DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
-        WCHAR const *localeName,
-        WINBOOL ignoreUserOverride,
-        IDWriteNumberSubstitution **numberSubstitution) PURE;
-
-    STDMETHOD(CreateGlyphRunAnalysis)(THIS_
-        DWRITE_GLYPH_RUN const *glyphRun,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_RENDERING_MODE renderingMode,
-        DWRITE_MEASURING_MODE measuringMode,
-        FLOAT baselineOriginX,
-        FLOAT baselineOriginY,
-        IDWriteGlyphRunAnalysis **glyphRunAnalysis) PURE;
-
-    /* IDWriteFactory1 methods */
-    STDMETHOD(GetEudcFontCollection)(THIS_
-        IDWriteFontCollection **fontCollection,
-        BOOL checkForUpdates __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(CreateCustomRenderingParams)(THIS_
-        FLOAT gamma,
-        FLOAT enhancedContrast,
-        FLOAT enhancedContrastGrayscale,
-        FLOAT clearTypeLevel,
-        DWRITE_PIXEL_GEOMETRY pixelGeometry,
-        DWRITE_RENDERING_MODE renderingMode,
-        IDWriteRenderingParams1 **renderingParams) PURE;
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFont2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFont2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFont2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFont methods ***/
+#define IDWriteFont2_GetFontFamily(This,family) (This)->lpVtbl->GetFontFamily(This,family)
+#define IDWriteFont2_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFont2_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFont2_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFont2_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFont2_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFont2_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFont2_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFont2_HasCharacter(This,value,exists) (This)->lpVtbl->HasCharacter(This,value,exists)
+#define IDWriteFont2_CreateFontFace(This,face) (This)->lpVtbl->CreateFontFace(This,face)
+/*** IDWriteFont1 methods ***/
+#define IDWriteFont2_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFont1_GetMetrics(This,metrics)
+#define IDWriteFont2_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
+#define IDWriteFont2_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFont2_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+/*** IDWriteFont2 methods ***/
+#define IDWriteFont2_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFont2_QueryInterface(IDWriteFont2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFont2_AddRef(IDWriteFont2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFont2_Release(IDWriteFont2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFont methods ***/
+static FORCEINLINE HRESULT IDWriteFont2_GetFontFamily(IDWriteFont2* This,IDWriteFontFamily **family) {
+    return This->lpVtbl->GetFontFamily(This,family);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFont2_GetWeight(IDWriteFont2* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFont2_GetStretch(IDWriteFont2* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFont2_GetStyle(IDWriteFont2* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE WINBOOL IDWriteFont2_IsSymbolFont(IDWriteFont2* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFont2_GetFaceNames(IDWriteFont2* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFont2_GetInformationalStrings(IDWriteFont2* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFont2_GetSimulations(IDWriteFont2* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE HRESULT IDWriteFont2_HasCharacter(IDWriteFont2* This,UINT32 value,WINBOOL *exists) {
+    return This->lpVtbl->HasCharacter(This,value,exists);
+}
+static FORCEINLINE HRESULT IDWriteFont2_CreateFontFace(IDWriteFont2* This,IDWriteFontFace **face) {
+    return This->lpVtbl->CreateFontFace(This,face);
+}
+/*** IDWriteFont1 methods ***/
+static FORCEINLINE void IDWriteFont2_GetMetrics(IDWriteFont2* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFont1_GetMetrics(This,metrics);
+}
+static FORCEINLINE void IDWriteFont2_GetPanose(IDWriteFont2* This,DWRITE_PANOSE *panose) {
+    This->lpVtbl->GetPanose(This,panose);
+}
+static FORCEINLINE HRESULT IDWriteFont2_GetUnicodeRanges(IDWriteFont2* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFont2_IsMonospacedFont(IDWriteFont2* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+/*** IDWriteFont2 methods ***/
+static FORCEINLINE WINBOOL IDWriteFont2_IsColorFont(IDWriteFont2* This) {
+    return This->lpVtbl->IsColorFont(This);
+}
+#endif
 #endif
 
-    /* IDWriteFactory2 methods */
-    STDMETHOD(GetSystemFontFallback)(THIS_
-        IDWriteFontFallback **fontFallback) PURE;
+#endif
 
-    STDMETHOD(CreateFontFallbackBuilder)(THIS_
-        IDWriteFontFallbackBuilder **fontFallbackBuilder) PURE;
 
-    STDMETHOD(TranslateColorGlyphRun)(THIS_
-        FLOAT baselineOriginX,
-        FLOAT baselineOriginY,
-        DWRITE_GLYPH_RUN const *glyphRun,
-        DWRITE_GLYPH_RUN_DESCRIPTION const *glyphRunDescription,
-        DWRITE_MEASURING_MODE measuringMode,
-        DWRITE_MATRIX const *worldToDeviceTransform,
-        UINT32 colorPaletteIndex,
-        IDWriteColorGlyphRunEnumerator **colorLayers) PURE;
+#endif  /* __IDWriteFont2_INTERFACE_DEFINED__ */
 
-    STDMETHOD(CreateCustomRenderingParams)(THIS_
+/*****************************************************************************
+ * IDWriteFontFace2 interface
+ */
+#ifndef __IDWriteFontFace2_INTERFACE_DEFINED__
+#define __IDWriteFontFace2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFace2, 0xd8b768ff, 0x64bc, 0x4e66, 0x98,0x2b, 0xec,0x8e,0x87,0xf6,0x93,0xf7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d8b768ff-64bc-4e66-982b-ec8e87f693f7")
+IDWriteFontFace2 : public IDWriteFontFace1
+{
+    virtual WINBOOL STDMETHODCALLTYPE IsColorFont(
+        ) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetColorPaletteCount(
+        ) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetPaletteEntryCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPaletteEntries(
+        UINT32 palette_index,
+        UINT32 first_entry_index,
+        UINT32 entry_count,
+        DWRITE_COLOR_F *entries) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRecommendedRenderingMode(
+        FLOAT fontEmSize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuringmode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *renderingmode,
+        DWRITE_GRID_FIT_MODE *gridfitmode) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFace2, 0xd8b768ff, 0x64bc, 0x4e66, 0x98,0x2b, 0xec,0x8e,0x87,0xf6,0x93,0xf7)
+#endif
+#else
+typedef struct IDWriteFontFace2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFace2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFace2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFace2 *This);
+
+    /*** IDWriteFontFace methods ***/
+    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
+        IDWriteFontFace2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiles)(
+        IDWriteFontFace2 *This,
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles);
+
+    UINT32 (STDMETHODCALLTYPE *GetIndex)(
+        IDWriteFontFace2 *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFace2 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFontFace2 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFontFace2 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
+        IDWriteFontFace2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
+        IDWriteFontFace2 *This,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
+        IDWriteFontFace2 *This,
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
+        IDWriteFontFace2 *This,
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists);
+
+    void (STDMETHODCALLTYPE *ReleaseFontTable)(
+        IDWriteFontFace2 *This,
+        void *table_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
+        IDWriteFontFace2 *This,
+        FLOAT emSize,
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
+
+    HRESULT (STDMETHODCALLTYPE *GetRecommendedRenderingMode)(
+        IDWriteFontFace2 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
+        IDWriteFontFace2 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
+        IDWriteFontFace2 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    /*** IDWriteFontFace1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFontFace1_GetMetrics)(
+        IDWriteFontFace2 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
+        IDWriteFontFace2 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetCaretMetrics)(
+        IDWriteFontFace2 *This,
+        DWRITE_CARET_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFontFace2 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFontFace2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
+        IDWriteFontFace2 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
+        IDWriteFontFace2 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances);
+
+    HRESULT (STDMETHODCALLTYPE *GetKerningPairAdjustments)(
+        IDWriteFontFace2 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *adjustments);
+
+    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
+        IDWriteFontFace2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
+        IDWriteFontFace2 *This,
+        FLOAT font_emsize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetVerticalGlyphVariants)(
+        IDWriteFontFace2 *This,
+        UINT32 glyph_count,
+        const UINT16 *nominal_indices,
+        UINT16 *vertical_indices);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
+        IDWriteFontFace2 *This);
+
+    /*** IDWriteFontFace2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
+        IDWriteFontFace2 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetColorPaletteCount)(
+        IDWriteFontFace2 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetPaletteEntryCount)(
+        IDWriteFontFace2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetPaletteEntries)(
+        IDWriteFontFace2 *This,
+        UINT32 palette_index,
+        UINT32 first_entry_index,
+        UINT32 entry_count,
+        DWRITE_COLOR_F *entries);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace2_GetRecommendedRenderingMode)(
+        IDWriteFontFace2 *This,
+        FLOAT fontEmSize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuringmode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *renderingmode,
+        DWRITE_GRID_FIT_MODE *gridfitmode);
+
+    END_INTERFACE
+} IDWriteFontFace2Vtbl;
+
+interface IDWriteFontFace2 {
+    CONST_VTBL IDWriteFontFace2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFace2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFace2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFace2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFace methods ***/
+#define IDWriteFontFace2_GetType(This) (This)->lpVtbl->GetType(This)
+#define IDWriteFontFace2_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
+#define IDWriteFontFace2_GetIndex(This) (This)->lpVtbl->GetIndex(This)
+#define IDWriteFontFace2_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFace2_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFontFace2_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
+#define IDWriteFontFace2_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
+#define IDWriteFontFace2_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
+#define IDWriteFontFace2_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
+#define IDWriteFontFace2_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
+#define IDWriteFontFace2_GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink)
+#define IDWriteFontFace2_GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways)
+/*** IDWriteFontFace1 methods ***/
+#define IDWriteFontFace2_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
+#define IDWriteFontFace2_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
+#define IDWriteFontFace2_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
+#define IDWriteFontFace2_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFontFace2_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+#define IDWriteFontFace2_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
+#define IDWriteFontFace2_GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances) (This)->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances)
+#define IDWriteFontFace2_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
+#define IDWriteFontFace2_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
+#define IDWriteFontFace2_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
+#define IDWriteFontFace2_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
+/*** IDWriteFontFace2 methods ***/
+#define IDWriteFontFace2_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
+#define IDWriteFontFace2_GetColorPaletteCount(This) (This)->lpVtbl->GetColorPaletteCount(This)
+#define IDWriteFontFace2_GetPaletteEntryCount(This) (This)->lpVtbl->GetPaletteEntryCount(This)
+#define IDWriteFontFace2_GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries) (This)->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries)
+#define IDWriteFontFace2_GetRecommendedRenderingMode(This,fontEmSize,dpiX,dpiY,transform,is_sideways,threshold,measuringmode,params,renderingmode,gridfitmode) (This)->lpVtbl->IDWriteFontFace2_GetRecommendedRenderingMode(This,fontEmSize,dpiX,dpiY,transform,is_sideways,threshold,measuringmode,params,renderingmode,gridfitmode)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace2_QueryInterface(IDWriteFontFace2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFace2_AddRef(IDWriteFontFace2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFace2_Release(IDWriteFontFace2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFace methods ***/
+static FORCEINLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace2_GetType(IDWriteFontFace2* This) {
+    return This->lpVtbl->GetType(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetFiles(IDWriteFontFace2* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
+    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
+}
+static FORCEINLINE UINT32 IDWriteFontFace2_GetIndex(IDWriteFontFace2* This) {
+    return This->lpVtbl->GetIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace2_GetSimulations(IDWriteFontFace2* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace2_IsSymbolFont(IDWriteFontFace2* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE UINT16 IDWriteFontFace2_GetGlyphCount(IDWriteFontFace2* This) {
+    return This->lpVtbl->GetGlyphCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetDesignGlyphMetrics(IDWriteFontFace2* This,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetGlyphIndices(IDWriteFontFace2* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
+    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_TryGetFontTable(IDWriteFontFace2* This,UINT32 table_tag,const void **table_data,UINT32 *table_size,void **context,WINBOOL *exists) {
+    return This->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists);
+}
+static FORCEINLINE void IDWriteFontFace2_ReleaseFontTable(IDWriteFontFace2* This,void *table_context) {
+    This->lpVtbl->ReleaseFontTable(This,table_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetGlyphRunOutline(IDWriteFontFace2* This,FLOAT emSize,const UINT16 *glyph_indices,const FLOAT *glyph_advances,const DWRITE_GLYPH_OFFSET *glyph_offsets,UINT32 glyph_count,WINBOOL is_sideways,WINBOOL is_rtl,IDWriteGeometrySink *geometrysink) {
+    return This->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetGdiCompatibleGlyphMetrics(IDWriteFontFace2* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways);
+}
+/*** IDWriteFontFace1 methods ***/
+static FORCEINLINE void IDWriteFontFace2_GetMetrics(IDWriteFontFace2* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetGdiCompatibleMetrics(IDWriteFontFace2* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_FONT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics);
+}
+static FORCEINLINE void IDWriteFontFace2_GetCaretMetrics(IDWriteFontFace2* This,DWRITE_CARET_METRICS *metrics) {
+    This->lpVtbl->GetCaretMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetUnicodeRanges(IDWriteFontFace2* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace2_IsMonospacedFont(IDWriteFontFace2* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetDesignGlyphAdvances(IDWriteFontFace2* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetGdiCompatibleGlyphAdvances(IDWriteFontFace2* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,UINT32 glyph_count,const UINT16 *indices,INT32 *advances) {
+    return This->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetKerningPairAdjustments(IDWriteFontFace2* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
+    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace2_HasKerningPairs(IDWriteFontFace2* This) {
+    return This->lpVtbl->HasKerningPairs(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetVerticalGlyphVariants(IDWriteFontFace2* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
+    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace2_HasVerticalGlyphVariants(IDWriteFontFace2* This) {
+    return This->lpVtbl->HasVerticalGlyphVariants(This);
+}
+/*** IDWriteFontFace2 methods ***/
+static FORCEINLINE WINBOOL IDWriteFontFace2_IsColorFont(IDWriteFontFace2* This) {
+    return This->lpVtbl->IsColorFont(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace2_GetColorPaletteCount(IDWriteFontFace2* This) {
+    return This->lpVtbl->GetColorPaletteCount(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace2_GetPaletteEntryCount(IDWriteFontFace2* This) {
+    return This->lpVtbl->GetPaletteEntryCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetPaletteEntries(IDWriteFontFace2* This,UINT32 palette_index,UINT32 first_entry_index,UINT32 entry_count,DWRITE_COLOR_F *entries) {
+    return This->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries);
+}
+static FORCEINLINE HRESULT IDWriteFontFace2_GetRecommendedRenderingMode(IDWriteFontFace2* This,FLOAT fontEmSize,FLOAT dpiX,FLOAT dpiY,const DWRITE_MATRIX *transform,WINBOOL is_sideways,DWRITE_OUTLINE_THRESHOLD threshold,DWRITE_MEASURING_MODE measuringmode,IDWriteRenderingParams *params,DWRITE_RENDERING_MODE *renderingmode,DWRITE_GRID_FIT_MODE *gridfitmode) {
+    return This->lpVtbl->IDWriteFontFace2_GetRecommendedRenderingMode(This,fontEmSize,dpiX,dpiY,transform,is_sideways,threshold,measuringmode,params,renderingmode,gridfitmode);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFace2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteColorGlyphRunEnumerator interface
+ */
+#ifndef __IDWriteColorGlyphRunEnumerator_INTERFACE_DEFINED__
+#define __IDWriteColorGlyphRunEnumerator_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteColorGlyphRunEnumerator, 0xd31fbe17, 0xf157, 0x41a2, 0x8d,0x24, 0xcb,0x77,0x9e,0x05,0x60,0xe8);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d31fbe17-f157-41a2-8d24-cb779e0560e8")
+IDWriteColorGlyphRunEnumerator : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE MoveNext(
+        WINBOOL *hasRun) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentRun(
+        const DWRITE_COLOR_GLYPH_RUN **run) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteColorGlyphRunEnumerator, 0xd31fbe17, 0xf157, 0x41a2, 0x8d,0x24, 0xcb,0x77,0x9e,0x05,0x60,0xe8)
+#endif
+#else
+typedef struct IDWriteColorGlyphRunEnumeratorVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteColorGlyphRunEnumerator *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteColorGlyphRunEnumerator *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteColorGlyphRunEnumerator *This);
+
+    /*** IDWriteColorGlyphRunEnumerator methods ***/
+    HRESULT (STDMETHODCALLTYPE *MoveNext)(
+        IDWriteColorGlyphRunEnumerator *This,
+        WINBOOL *hasRun);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentRun)(
+        IDWriteColorGlyphRunEnumerator *This,
+        const DWRITE_COLOR_GLYPH_RUN **run);
+
+    END_INTERFACE
+} IDWriteColorGlyphRunEnumeratorVtbl;
+
+interface IDWriteColorGlyphRunEnumerator {
+    CONST_VTBL IDWriteColorGlyphRunEnumeratorVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteColorGlyphRunEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteColorGlyphRunEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteColorGlyphRunEnumerator_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteColorGlyphRunEnumerator methods ***/
+#define IDWriteColorGlyphRunEnumerator_MoveNext(This,hasRun) (This)->lpVtbl->MoveNext(This,hasRun)
+#define IDWriteColorGlyphRunEnumerator_GetCurrentRun(This,run) (This)->lpVtbl->GetCurrentRun(This,run)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteColorGlyphRunEnumerator_QueryInterface(IDWriteColorGlyphRunEnumerator* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteColorGlyphRunEnumerator_AddRef(IDWriteColorGlyphRunEnumerator* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteColorGlyphRunEnumerator_Release(IDWriteColorGlyphRunEnumerator* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteColorGlyphRunEnumerator methods ***/
+static FORCEINLINE HRESULT IDWriteColorGlyphRunEnumerator_MoveNext(IDWriteColorGlyphRunEnumerator* This,WINBOOL *hasRun) {
+    return This->lpVtbl->MoveNext(This,hasRun);
+}
+static FORCEINLINE HRESULT IDWriteColorGlyphRunEnumerator_GetCurrentRun(IDWriteColorGlyphRunEnumerator* This,const DWRITE_COLOR_GLYPH_RUN **run) {
+    return This->lpVtbl->GetCurrentRun(This,run);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteColorGlyphRunEnumerator_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteRenderingParams2 interface
+ */
+#ifndef __IDWriteRenderingParams2_INTERFACE_DEFINED__
+#define __IDWriteRenderingParams2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteRenderingParams2, 0xf9d711c3, 0x9777, 0x40ae, 0x87,0xe8, 0x3e,0x5a,0xf9,0xbf,0x09,0x48);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f9d711c3-9777-40ae-87e8-3e5af9bf0948")
+IDWriteRenderingParams2 : public IDWriteRenderingParams1
+{
+    virtual DWRITE_GRID_FIT_MODE STDMETHODCALLTYPE GetGridFitMode(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteRenderingParams2, 0xf9d711c3, 0x9777, 0x40ae, 0x87,0xe8, 0x3e,0x5a,0xf9,0xbf,0x09,0x48)
+#endif
+#else
+typedef struct IDWriteRenderingParams2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteRenderingParams2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteRenderingParams2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteRenderingParams2 *This);
+
+    /*** IDWriteRenderingParams methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGamma)(
+        IDWriteRenderingParams2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetEnhancedContrast)(
+        IDWriteRenderingParams2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetClearTypeLevel)(
+        IDWriteRenderingParams2 *This);
+
+    DWRITE_PIXEL_GEOMETRY (STDMETHODCALLTYPE *GetPixelGeometry)(
+        IDWriteRenderingParams2 *This);
+
+    DWRITE_RENDERING_MODE (STDMETHODCALLTYPE *GetRenderingMode)(
+        IDWriteRenderingParams2 *This);
+
+    /*** IDWriteRenderingParams1 methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGrayscaleEnhancedContrast)(
+        IDWriteRenderingParams2 *This);
+
+    /*** IDWriteRenderingParams2 methods ***/
+    DWRITE_GRID_FIT_MODE (STDMETHODCALLTYPE *GetGridFitMode)(
+        IDWriteRenderingParams2 *This);
+
+    END_INTERFACE
+} IDWriteRenderingParams2Vtbl;
+
+interface IDWriteRenderingParams2 {
+    CONST_VTBL IDWriteRenderingParams2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteRenderingParams2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteRenderingParams2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteRenderingParams2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteRenderingParams methods ***/
+#define IDWriteRenderingParams2_GetGamma(This) (This)->lpVtbl->GetGamma(This)
+#define IDWriteRenderingParams2_GetEnhancedContrast(This) (This)->lpVtbl->GetEnhancedContrast(This)
+#define IDWriteRenderingParams2_GetClearTypeLevel(This) (This)->lpVtbl->GetClearTypeLevel(This)
+#define IDWriteRenderingParams2_GetPixelGeometry(This) (This)->lpVtbl->GetPixelGeometry(This)
+#define IDWriteRenderingParams2_GetRenderingMode(This) (This)->lpVtbl->GetRenderingMode(This)
+/*** IDWriteRenderingParams1 methods ***/
+#define IDWriteRenderingParams2_GetGrayscaleEnhancedContrast(This) (This)->lpVtbl->GetGrayscaleEnhancedContrast(This)
+/*** IDWriteRenderingParams2 methods ***/
+#define IDWriteRenderingParams2_GetGridFitMode(This) (This)->lpVtbl->GetGridFitMode(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteRenderingParams2_QueryInterface(IDWriteRenderingParams2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams2_AddRef(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams2_Release(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteRenderingParams methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams2_GetGamma(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetGamma(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams2_GetEnhancedContrast(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetEnhancedContrast(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams2_GetClearTypeLevel(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetClearTypeLevel(This);
+}
+static FORCEINLINE DWRITE_PIXEL_GEOMETRY IDWriteRenderingParams2_GetPixelGeometry(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetPixelGeometry(This);
+}
+static FORCEINLINE DWRITE_RENDERING_MODE IDWriteRenderingParams2_GetRenderingMode(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetRenderingMode(This);
+}
+/*** IDWriteRenderingParams1 methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams2_GetGrayscaleEnhancedContrast(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetGrayscaleEnhancedContrast(This);
+}
+/*** IDWriteRenderingParams2 methods ***/
+static FORCEINLINE DWRITE_GRID_FIT_MODE IDWriteRenderingParams2_GetGridFitMode(IDWriteRenderingParams2* This) {
+    return This->lpVtbl->GetGridFitMode(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteRenderingParams2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory2 interface
+ */
+#ifndef __IDWriteFactory2_INTERFACE_DEFINED__
+#define __IDWriteFactory2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory2, 0x0439fc60, 0xca44, 0x4994, 0x8d,0xee, 0x3a,0x9a,0xf7,0xb7,0x32,0xec);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("0439fc60-ca44-4994-8dee-3a9af7b732ec")
+IDWriteFactory2 : public IDWriteFactory1
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontFallback(
+        IDWriteFontFallback **fallback) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFallbackBuilder(
+        IDWriteFontFallbackBuilder **fallbackbuilder) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE TranslateColorGlyphRun(
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomRenderingParams(
         FLOAT gamma,
-        FLOAT enhancedContrast,
-        FLOAT grayscaleEnhancedContrast,
-        FLOAT clearTypeLevel,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
         DWRITE_PIXEL_GEOMETRY pixelGeometry,
         DWRITE_RENDERING_MODE renderingMode,
         DWRITE_GRID_FIT_MODE gridFitMode,
-        IDWriteRenderingParams2 **renderingParams) PURE;
+        IDWriteRenderingParams2 **params) = 0;
 
-#ifdef __cplusplus
-    using IDWriteFactory::CreateCustomRenderingParams;
-    using IDWriteFactory1::CreateCustomRenderingParams;
-#endif
-
-    STDMETHOD(CreateGlyphRunAnalysis)(THIS_
-        DWRITE_GLYPH_RUN const *glyphRun,
-        DWRITE_MATRIX const *transform,
+    virtual HRESULT STDMETHODCALLTYPE CreateGlyphRunAnalysis(
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
         DWRITE_RENDERING_MODE renderingMode,
         DWRITE_MEASURING_MODE measuringMode,
         DWRITE_GRID_FIT_MODE gridFitMode,
         DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
-        FLOAT baselineOriginX,
-        FLOAT baselineOriginY,
-        IDWriteGlyphRunAnalysis **glyphRunAnalysis) PURE;
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis) = 0;
 
-#ifdef __cplusplus
-    using IDWriteFactory::CreateGlyphRunAnalysis;
-#endif
-
-    END_INTERFACE
 };
-
-__CRT_UUID_DECL(IDWriteFactory2, 0x0439fc60,0xca44,0x4994,0x8d,0xee,0x3a,0x9a,0xf7,0xb7,0x32,0xec)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFace2
-DECLARE_INTERFACE_(IDWriteFontFace2,IDWriteFontFace1)
-{
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory2, 0x0439fc60, 0xca44, 0x4994, 0x8d,0xee, 0x3a,0x9a,0xf7,0xb7,0x32,0xec)
+#endif
+#else
+typedef struct IDWriteFactory2Vtbl {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory2 *This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDWriteFontFace methods */
-    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory2 *This);
 
-    STDMETHOD(GetFiles)(THIS_
-        UINT32 *numberOfFiles,
-        IDWriteFontFile **fontFiles) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory2 *This);
 
-    STDMETHOD_(UINT32, GetIndex)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)(THIS) PURE;
-    STDMETHOD_(WINBOOL, IsSymbolFont)(THIS) PURE;
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory2 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
 
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory2 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
 
-    STDMETHOD_(UINT16, GetGlyphCount)(THIS) PURE;
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory2 *This,
+        IDWriteFontCollectionLoader *loader);
 
-    STDMETHOD(GetDesignGlyphMetrics)(THIS_
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory2 *This,
+        IDWriteFontCollectionLoader *loader);
 
-    STDMETHOD(GetGlyphIndices)(THIS_
-        UINT32 const *codePoints,
-        UINT32 codePointCount,
-        UINT16 *glyphIndices) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory2 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
 
-    STDMETHOD(TryGetFontTable)(THIS_
-        UINT32 openTypeTableTag,
-        const void **tableData,
-        UINT32 *tableSize,
-        void **tableContext,
-        WINBOOL *exists) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory2 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
 
-    STDMETHOD_(void, ReleaseFontTable)(THIS_
-        void *tableContext) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory2 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
 
-    STDMETHOD(GetGlyphRunOutline)(THIS_
-        FLOAT emSize,
-        UINT16 const *glyphIndices,
-        FLOAT const *glyphAdvances,
-        DWRITE_GLYPH_OFFSET const *glyphOffsets,
-        UINT32 glyphCount,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        IDWriteGeometrySink *geometrySink) PURE;
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory2 *This,
+        IDWriteRenderingParams **params);
 
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory2 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory2 *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory2 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory2 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory2 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory2 *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory2 *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory2 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory2 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory2 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory2 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory2 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory2 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory2 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory2 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
+
+    /*** IDWriteFactory2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontFallback)(
+        IDWriteFactory2 *This,
+        IDWriteFontFallback **fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallbackBuilder)(
+        IDWriteFactory2 *This,
+        IDWriteFontFallbackBuilder **fallbackbuilder);
+
+    HRESULT (STDMETHODCALLTYPE *TranslateColorGlyphRun)(
+        IDWriteFactory2 *This,
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateCustomRenderingParams)(
+        IDWriteFactory2 *This,
+        FLOAT gamma,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        IDWriteRenderingParams2 **params);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateGlyphRunAnalysis)(
+        IDWriteFactory2 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE renderingMode,
         DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE *renderingMode) PURE;
-
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-    STDMETHOD(GetGdiCompatibleGlyphMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    /* IDWriteFontFace1 methods */
-    STDMETHOD_(void, GetMetrics)(THIS_ DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD_(void, GetCaretMetrics)(THIS_ DWRITE_CARET_METRICS*) PURE;
-    STDMETHOD(GetUnicodeRanges)(THIS_ UINT32, DWRITE_UNICODE_RANGE*,UINT32*) PURE;
-    STDMETHOD_(BOOL, IsMonospacedFont)(THIS) PURE;
-    STDMETHOD(GetDesignGlyphAdvances)(THIS_ UINT32,UINT16 const*,INT32*,BOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-    STDMETHOD(GetGdiCompatibleGlyphAdvances)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,BOOL,UINT32,
-            UINT16 const*,INT32*) PURE;
-    STDMETHOD(GetKerningPairAdjustments)(THIS_ UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(THIS);
-    STDMETHOD(GetRecommendedRenderingMode)(FLOAT,FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,
-            DWRITE_OUTLINE_THRESHOLD,DWRITE_MEASURING_MODE,DWRITE_RENDERING_MODE*) PURE;
-    STDMETHOD(GetVerticalGlyphVariants)(THIS_ UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(THIS);
-#endif
-
-    /* IDWriteFontFace2 methods */
-    STDMETHOD_(BOOL, IsColorFont)(THIS) PURE;
-    STDMETHOD_(UINT32, GetColorPaletteCount)(THIS) PURE;
-    STDMETHOD_(UINT32, GetPaletteEntryCount)(THIS) PURE;
-        STDMETHOD(GetPaletteEntries)(THIS_
-        UINT32 colorPaletteIndex,
-        UINT32 firstEntryIndex,
-        UINT32 entryCount,
-        DWRITE_COLOR_F* paletteEntries
-        ) PURE;
-
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT fontEmSize,
-        FLOAT dpiX,
-        FLOAT dpiY,
-        DWRITE_MATRIX const* transform,
-        BOOL isSideways,
-        DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams* renderingParams,
-        DWRITE_RENDERING_MODE* renderingMode,
-        DWRITE_GRID_FIT_MODE* gridFitMode
-        ) PURE;
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis);
 
     END_INTERFACE
+} IDWriteFactory2Vtbl;
+
+interface IDWriteFactory2 {
+    CONST_VTBL IDWriteFactory2Vtbl* lpVtbl;
 };
 
-__CRT_UUID_DECL(IDWriteFontFace2, 0xd8b768ff,0x64bc,0x4e66,0x98,0x2b,0xec,0x8e,0x87,0xf6,0x93,0xf7)
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory2_GetSystemFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetSystemFontCollection(This,collection,check_for_updates)
+#define IDWriteFactory2_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory2_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory2_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory2_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory2_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory2_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory2_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory2_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory2_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory2_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory2_CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format) (This)->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format)
+#define IDWriteFactory2_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory2_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory2_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory2_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory2_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory2_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory2_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory2_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+/*** IDWriteFactory2 methods ***/
+#define IDWriteFactory2_GetSystemFontFallback(This,fallback) (This)->lpVtbl->GetSystemFontFallback(This,fallback)
+#define IDWriteFactory2_CreateFontFallbackBuilder(This,fallbackbuilder) (This)->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder)
+#define IDWriteFactory2_TranslateColorGlyphRun(This,originX,originY,run,rundescr,mode,transform,palette_index,colorlayers) (This)->lpVtbl->TranslateColorGlyphRun(This,originX,originY,run,rundescr,mode,transform,palette_index,colorlayers)
+#define IDWriteFactory2_CreateCustomRenderingParams(This,gamma,contrast,grayscalecontrast,cleartypeLevel,pixelGeometry,renderingMode,gridFitMode,params) (This)->lpVtbl->IDWriteFactory2_CreateCustomRenderingParams(This,gamma,contrast,grayscalecontrast,cleartypeLevel,pixelGeometry,renderingMode,gridFitMode,params)
+#define IDWriteFactory2_CreateGlyphRunAnalysis(This,run,transform,renderingMode,measuringMode,gridFitMode,antialiasMode,originX,originY,analysis) (This)->lpVtbl->IDWriteFactory2_CreateGlyphRunAnalysis(This,run,transform,renderingMode,measuringMode,gridFitMode,antialiasMode,originX,originY,analysis)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory2_QueryInterface(IDWriteFactory2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory2_AddRef(IDWriteFactory2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory2_Release(IDWriteFactory2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory2_GetSystemFontCollection(IDWriteFactory2* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetSystemFontCollection(This,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateCustomFontCollection(IDWriteFactory2* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_RegisterFontCollectionLoader(IDWriteFactory2* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_UnregisterFontCollectionLoader(IDWriteFactory2* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateFontFileReference(IDWriteFactory2* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateCustomFontFileReference(IDWriteFactory2* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateFontFace(IDWriteFactory2* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateRenderingParams(IDWriteFactory2* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateMonitorRenderingParams(IDWriteFactory2* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_RegisterFontFileLoader(IDWriteFactory2* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_UnregisterFontFileLoader(IDWriteFactory2* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateTextFormat(IDWriteFactory2* This,const WCHAR *family_name,IDWriteFontCollection *collection,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STYLE style,DWRITE_FONT_STRETCH stretch,FLOAT size,const WCHAR *locale,IDWriteTextFormat **format) {
+    return This->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateTypography(IDWriteFactory2* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_GetGdiInterop(IDWriteFactory2* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateTextLayout(IDWriteFactory2* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateGdiCompatibleTextLayout(IDWriteFactory2* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateEllipsisTrimmingSign(IDWriteFactory2* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateTextAnalyzer(IDWriteFactory2* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateNumberSubstitution(IDWriteFactory2* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory2_GetEudcFontCollection(IDWriteFactory2* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+/*** IDWriteFactory2 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory2_GetSystemFontFallback(IDWriteFactory2* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetSystemFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateFontFallbackBuilder(IDWriteFactory2* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
+    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_TranslateColorGlyphRun(IDWriteFactory2* This,FLOAT originX,FLOAT originY,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,DWRITE_MEASURING_MODE mode,const DWRITE_MATRIX *transform,UINT32 palette_index,IDWriteColorGlyphRunEnumerator **colorlayers) {
+    return This->lpVtbl->TranslateColorGlyphRun(This,originX,originY,run,rundescr,mode,transform,palette_index,colorlayers);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateCustomRenderingParams(IDWriteFactory2* This,FLOAT gamma,FLOAT contrast,FLOAT grayscalecontrast,FLOAT cleartypeLevel,DWRITE_PIXEL_GEOMETRY pixelGeometry,DWRITE_RENDERING_MODE renderingMode,DWRITE_GRID_FIT_MODE gridFitMode,IDWriteRenderingParams2 **params) {
+    return This->lpVtbl->IDWriteFactory2_CreateCustomRenderingParams(This,gamma,contrast,grayscalecontrast,cleartypeLevel,pixelGeometry,renderingMode,gridFitMode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory2_CreateGlyphRunAnalysis(IDWriteFactory2* This,const DWRITE_GLYPH_RUN *run,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE renderingMode,DWRITE_MEASURING_MODE measuringMode,DWRITE_GRID_FIT_MODE gridFitMode,DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,FLOAT originX,FLOAT originY,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->IDWriteFactory2_CreateGlyphRunAnalysis(This,run,transform,renderingMode,measuringMode,gridFitMode,antialiasMode,originX,originY,analysis);
+}
+#endif
+#endif
 
-#endif /* DWRITE_2_H_INCLUDED */
+#endif
+
+
+#endif  /* __IDWriteFactory2_INTERFACE_DEFINED__ */
+
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __dwrite_2_h__ */
diff --git a/mingw-w64-headers/include/dwrite_2.idl b/mingw-w64-headers/include/dwrite_2.idl
new file mode 100644
index 0000000..5401cf3
--- /dev/null
+++ b/mingw-w64-headers/include/dwrite_2.idl
@@ -0,0 +1,332 @@
+/*
+ * Copyright 2014 Nikolay Sivov for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "dwrite_1.idl";
+
+typedef enum DWRITE_OPTICAL_ALIGNMENT
+{
+    DWRITE_OPTICAL_ALIGNMENT_NONE,
+    DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS
+} DWRITE_OPTICAL_ALIGNMENT;
+
+typedef enum DWRITE_GRID_FIT_MODE
+{
+    DWRITE_GRID_FIT_MODE_DEFAULT,
+    DWRITE_GRID_FIT_MODE_DISABLED,
+    DWRITE_GRID_FIT_MODE_ENABLED
+} DWRITE_GRID_FIT_MODE;
+
+typedef struct DWRITE_TEXT_METRICS1
+{
+    /* DWRITE_TEXT_METRICS fields */
+    FLOAT left;
+    FLOAT top;
+    FLOAT width;
+    FLOAT widthIncludingTrailingWhitespace;
+    FLOAT height;
+    FLOAT layoutWidth;
+    FLOAT layoutHeight;
+    UINT32 maxBidiReorderingDepth;
+    UINT32 lineCount;
+    /* DWRITE_TEXT_METRICS1 fields */
+    FLOAT heightIncludingTrailingWhitespace;
+} DWRITE_TEXT_METRICS1;
+
+cpp_quote("#ifndef D3DCOLORVALUE_DEFINED")
+typedef struct _D3DCOLORVALUE
+{
+    union {
+        FLOAT r;
+        FLOAT dvR;
+    };
+    union {
+        FLOAT g;
+        FLOAT dvG;
+    };
+    union {
+        FLOAT b;
+        FLOAT dvB;
+    };
+    union {
+        FLOAT a;
+        FLOAT dvA;
+    };
+} D3DCOLORVALUE;
+cpp_quote("#define D3DCOLORVALUE_DEFINED")
+cpp_quote("#endif")
+
+typedef D3DCOLORVALUE DWRITE_COLOR_F;
+
+typedef struct DWRITE_COLOR_GLYPH_RUN
+{
+    DWRITE_GLYPH_RUN glyphRun;
+    DWRITE_GLYPH_RUN_DESCRIPTION* glyphRunDescription;
+    FLOAT baselineOriginX;
+    FLOAT baselineOriginY;
+    DWRITE_COLOR_F runColor;
+    UINT16 paletteIndex;
+} DWRITE_COLOR_GLYPH_RUN;
+
+[
+    local,
+    object,
+    uuid(d3e0e934-22a0-427e-aae4-7d9574b59db1)
+]
+interface IDWriteTextRenderer1 : IDWriteTextRenderer
+{
+    HRESULT DrawGlyphRun(void *context,
+                         FLOAT originX,
+                         FLOAT originY,
+                         DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+                         DWRITE_MEASURING_MODE mode,
+                         DWRITE_GLYPH_RUN const *run,
+                         DWRITE_GLYPH_RUN_DESCRIPTION const *rundescr,
+                         IUnknown *effect);
+
+    HRESULT DrawUnderline(void *context,
+                          FLOAT originX,
+                          FLOAT originY,
+                          DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+                          DWRITE_UNDERLINE const *underline,
+                          IUnknown *effect);
+
+    HRESULT DrawStrikethrough(void *context,
+                              FLOAT originX,
+                              FLOAT originY,
+                              DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+                              DWRITE_STRIKETHROUGH const *strikethrough,
+                              IUnknown *effect
+                             );
+
+    HRESULT DrawInlineObject(void *context,
+                             FLOAT originX,
+                             FLOAT originY,
+                             DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+                             IDWriteInlineObject *inlineObject,
+                             BOOL is_sideways,
+                             BOOL is_rtl,
+                             IUnknown *effect
+                            );
+}
+
+[
+    local,
+    object,
+    uuid(efa008f9-f7a1-48bf-b05c-f224713cc0ff)
+]
+interface IDWriteFontFallback : IUnknown
+{
+    HRESULT MapCharacters(IDWriteTextAnalysisSource *source,
+                          UINT32 position,
+                          UINT32 length,
+                          IDWriteFontCollection *basecollection,
+                          const WCHAR *baseFamilyName,
+                          DWRITE_FONT_WEIGHT baseWeight,
+                          DWRITE_FONT_STYLE baseStyle,
+                          DWRITE_FONT_STRETCH baseStretch,
+                          UINT32 *mappedLength,
+                          IDWriteFont **mappedFont,
+                          FLOAT *scale
+                         );
+}
+
+[
+    local,
+    object,
+    uuid(5f174b49-0d8b-4cfb-8bca-f1cce9d06c67)
+]
+interface IDWriteTextFormat1 : IDWriteTextFormat
+{
+    HRESULT SetVerticalGlyphOrientation(DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+    DWRITE_VERTICAL_GLYPH_ORIENTATION GetVerticalGlyphOrientation();
+    HRESULT SetLastLineWrapping(BOOL lastline_wrapping_enabled);
+    BOOL GetLastLineWrapping();
+    HRESULT SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT alignment);
+    DWRITE_OPTICAL_ALIGNMENT GetOpticalAlignment();
+    HRESULT SetFontFallback(IDWriteFontFallback *fallback);
+    HRESULT GetFontFallback(IDWriteFontFallback **fallback);
+}
+
+[
+    local,
+    object,
+    uuid(1093c18f-8d5e-43f0-b064-0917311b525e)
+]
+interface IDWriteTextLayout2 : IDWriteTextLayout1
+{
+    HRESULT GetMetrics(DWRITE_TEXT_METRICS1 *metrics);
+    HRESULT SetVerticalGlyphOrientation(DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+    DWRITE_VERTICAL_GLYPH_ORIENTATION GetVerticalGlyphOrientation();
+    HRESULT SetLastLineWrapping(BOOL lastline_wrapping_enabled);
+    BOOL GetLastLineWrapping();
+    HRESULT SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT alignment);
+    DWRITE_OPTICAL_ALIGNMENT GetOpticalAlignment();
+    HRESULT SetFontFallback(IDWriteFontFallback *fallback);
+    HRESULT GetFontFallback(IDWriteFontFallback **fallback);
+}
+
+[
+    local,
+    object,
+    uuid(553a9ff3-5693-4df7-b52b-74806f7f2eb9)
+]
+interface IDWriteTextAnalyzer2 : IDWriteTextAnalyzer1
+{
+    HRESULT GetGlyphOrientationTransform(DWRITE_GLYPH_ORIENTATION_ANGLE angle,
+                                         BOOL is_sideways,
+                                         FLOAT originX,
+                                         FLOAT originY,
+                                         DWRITE_MATRIX *transform
+                                        );
+    HRESULT GetTypographicFeatures(IDWriteFontFace *fontface,
+                                   DWRITE_SCRIPT_ANALYSIS analysis,
+                                   const WCHAR *localeName,
+                                   UINT32 max_tagcount,
+                                   UINT32 *actual_tagcount,
+                                   DWRITE_FONT_FEATURE_TAG *tags
+                                  );
+
+    HRESULT CheckTypographicFeature(IDWriteFontFace *fontface,
+                                    DWRITE_SCRIPT_ANALYSIS analysis,
+                                    const WCHAR *localeName,
+                                    DWRITE_FONT_FEATURE_TAG feature,
+                                    UINT32 glyph_count,
+                                    const UINT16 *indices,
+                                    UINT8 *feature_applies
+                                   );
+}
+
+[
+    local,
+    object,
+    uuid(fd882d06-8aba-4fb8-b849-8be8b73e14de)
+]
+interface IDWriteFontFallbackBuilder : IUnknown
+{
+    HRESULT AddMapping(const DWRITE_UNICODE_RANGE *ranges,
+                       UINT32 rangesCount,
+                       WCHAR const **targetFamilyNames,
+                       UINT32 targetFamilyNamesCount,
+                       [defaultvalue(NULL)] IDWriteFontCollection *collection,
+                       [defaultvalue(NULL)] WCHAR const *localeName,
+                       [defaultvalue(NULL)] WCHAR const *baseFamilyName,
+                       [defaultvalue(1)] FLOAT scale
+                      );
+    HRESULT AddMappings(IDWriteFontFallback *fallback);
+    HRESULT CreateFontFallback(IDWriteFontFallback **fallback);
+}
+
+[
+    local,
+    object,
+    uuid(29748ed6-8c9c-4a6a-be0b-d912e8538944)
+]
+interface IDWriteFont2 : IDWriteFont1
+{
+    BOOL IsColorFont();
+}
+
+[
+    local,
+    object,
+    uuid(d8b768ff-64bc-4e66-982b-ec8e87f693f7)
+]
+interface IDWriteFontFace2 : IDWriteFontFace1
+{
+    BOOL IsColorFont();
+    UINT32 GetColorPaletteCount();
+    UINT32 GetPaletteEntryCount();
+    HRESULT GetPaletteEntries(UINT32 palette_index,
+                              UINT32 first_entry_index,
+                              UINT32 entry_count,
+                              DWRITE_COLOR_F *entries
+                             );
+    HRESULT GetRecommendedRenderingMode(FLOAT fontEmSize,
+                                        FLOAT dpiX,
+                                        FLOAT dpiY,
+                                        DWRITE_MATRIX const *transform,
+                                        BOOL is_sideways,
+                                        DWRITE_OUTLINE_THRESHOLD threshold,
+                                        DWRITE_MEASURING_MODE measuringmode,
+                                        IDWriteRenderingParams *params,
+                                        DWRITE_RENDERING_MODE *renderingmode,
+                                        DWRITE_GRID_FIT_MODE *gridfitmode
+                                       );
+}
+
+[
+    local,
+    object,
+    uuid(d31fbe17-f157-41a2-8d24-cb779e0560e8)
+]
+interface IDWriteColorGlyphRunEnumerator : IUnknown
+{
+    HRESULT MoveNext(BOOL *hasRun);
+    HRESULT GetCurrentRun(DWRITE_COLOR_GLYPH_RUN const **run);
+}
+
+[
+    local,
+    object,
+    uuid(f9d711c3-9777-40ae-87e8-3e5aF9bf0948)
+]
+interface IDWriteRenderingParams2 : IDWriteRenderingParams1
+{
+    DWRITE_GRID_FIT_MODE GetGridFitMode();
+}
+
+[
+    local,
+    object,
+    uuid(0439fc60-ca44-4994-8dee-3a9af7b732ec)
+]
+interface IDWriteFactory2 : IDWriteFactory1
+{
+    HRESULT GetSystemFontFallback(IDWriteFontFallback **fallback);
+    HRESULT CreateFontFallbackBuilder(IDWriteFontFallbackBuilder **fallbackbuilder);
+    HRESULT TranslateColorGlyphRun(FLOAT originX,
+                                   FLOAT originY,
+                                   const DWRITE_GLYPH_RUN *run,
+                                   const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+                                   DWRITE_MEASURING_MODE mode,
+                                   const DWRITE_MATRIX *transform,
+                                   UINT32 palette_index,
+                                   IDWriteColorGlyphRunEnumerator **colorlayers
+                                  );
+
+    HRESULT CreateCustomRenderingParams(FLOAT gamma,
+                                        FLOAT contrast,
+                                        FLOAT grayscalecontrast,
+                                        FLOAT cleartypeLevel,
+                                        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+                                        DWRITE_RENDERING_MODE renderingMode,
+                                        DWRITE_GRID_FIT_MODE gridFitMode,
+                                        IDWriteRenderingParams2 **params
+                                       );
+
+    HRESULT CreateGlyphRunAnalysis(const DWRITE_GLYPH_RUN *run,
+                                   const DWRITE_MATRIX *transform,
+                                   DWRITE_RENDERING_MODE renderingMode,
+                                   DWRITE_MEASURING_MODE measuringMode,
+                                   DWRITE_GRID_FIT_MODE gridFitMode,
+                                   DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+                                   FLOAT originX,
+                                   FLOAT originY,
+                                   IDWriteGlyphRunAnalysis **analysis
+                                  );
+}
diff --git a/mingw-w64-headers/include/dwrite_3.h b/mingw-w64-headers/include/dwrite_3.h
index 9c17173..f058ec8 100644
--- a/mingw-w64-headers/include/dwrite_3.h
+++ b/mingw-w64-headers/include/dwrite_3.h
@@ -1,44 +1,8153 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
+/*** Autogenerated by WIDL 5.13 from include/dwrite_3.idl - Do not edit ***/
 
-#ifndef DWRITE_3_H_INCLUDED
-#define DWRITE_3_H_INCLUDED
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#endif
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __dwrite_3_h__
+#define __dwrite_3_h__
+
+/* Forward declarations */
+
+#ifndef __IDWriteFontDownloadListener_FWD_DEFINED__
+#define __IDWriteFontDownloadListener_FWD_DEFINED__
+typedef interface IDWriteFontDownloadListener IDWriteFontDownloadListener;
+#ifdef __cplusplus
+interface IDWriteFontDownloadListener;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontDownloadQueue_FWD_DEFINED__
+#define __IDWriteFontDownloadQueue_FWD_DEFINED__
+typedef interface IDWriteFontDownloadQueue IDWriteFontDownloadQueue;
+#ifdef __cplusplus
+interface IDWriteFontDownloadQueue;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteRenderingParams3_FWD_DEFINED__
+#define __IDWriteRenderingParams3_FWD_DEFINED__
+typedef interface IDWriteRenderingParams3 IDWriteRenderingParams3;
+#ifdef __cplusplus
+interface IDWriteRenderingParams3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteStringList_FWD_DEFINED__
+#define __IDWriteStringList_FWD_DEFINED__
+typedef interface IDWriteStringList IDWriteStringList;
+#ifdef __cplusplus
+interface IDWriteStringList;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSet_FWD_DEFINED__
+#define __IDWriteFontSet_FWD_DEFINED__
+typedef interface IDWriteFontSet IDWriteFontSet;
+#ifdef __cplusplus
+interface IDWriteFontSet;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontResource_FWD_DEFINED__
+#define __IDWriteFontResource_FWD_DEFINED__
+typedef interface IDWriteFontResource IDWriteFontResource;
+#ifdef __cplusplus
+interface IDWriteFontResource;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSet1_FWD_DEFINED__
+#define __IDWriteFontSet1_FWD_DEFINED__
+typedef interface IDWriteFontSet1 IDWriteFontSet1;
+#ifdef __cplusplus
+interface IDWriteFontSet1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFont3_FWD_DEFINED__
+#define __IDWriteFont3_FWD_DEFINED__
+typedef interface IDWriteFont3 IDWriteFont3;
+#ifdef __cplusplus
+interface IDWriteFont3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFamily1_FWD_DEFINED__
+#define __IDWriteFontFamily1_FWD_DEFINED__
+typedef interface IDWriteFontFamily1 IDWriteFontFamily1;
+#ifdef __cplusplus
+interface IDWriteFontFamily1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFamily2_FWD_DEFINED__
+#define __IDWriteFontFamily2_FWD_DEFINED__
+typedef interface IDWriteFontFamily2 IDWriteFontFamily2;
+#ifdef __cplusplus
+interface IDWriteFontFamily2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontCollection1_FWD_DEFINED__
+#define __IDWriteFontCollection1_FWD_DEFINED__
+typedef interface IDWriteFontCollection1 IDWriteFontCollection1;
+#ifdef __cplusplus
+interface IDWriteFontCollection1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontCollection2_FWD_DEFINED__
+#define __IDWriteFontCollection2_FWD_DEFINED__
+typedef interface IDWriteFontCollection2 IDWriteFontCollection2;
+#ifdef __cplusplus
+interface IDWriteFontCollection2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontCollection3_FWD_DEFINED__
+#define __IDWriteFontCollection3_FWD_DEFINED__
+typedef interface IDWriteFontCollection3 IDWriteFontCollection3;
+#ifdef __cplusplus
+interface IDWriteFontCollection3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFaceReference_FWD_DEFINED__
+#define __IDWriteFontFaceReference_FWD_DEFINED__
+typedef interface IDWriteFontFaceReference IDWriteFontFaceReference;
+#ifdef __cplusplus
+interface IDWriteFontFaceReference;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFaceReference1_FWD_DEFINED__
+#define __IDWriteFontFaceReference1_FWD_DEFINED__
+typedef interface IDWriteFontFaceReference1 IDWriteFontFaceReference1;
+#ifdef __cplusplus
+interface IDWriteFontFaceReference1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontList1_FWD_DEFINED__
+#define __IDWriteFontList1_FWD_DEFINED__
+typedef interface IDWriteFontList1 IDWriteFontList1;
+#ifdef __cplusplus
+interface IDWriteFontList1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontList2_FWD_DEFINED__
+#define __IDWriteFontList2_FWD_DEFINED__
+typedef interface IDWriteFontList2 IDWriteFontList2;
+#ifdef __cplusplus
+interface IDWriteFontList2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSet2_FWD_DEFINED__
+#define __IDWriteFontSet2_FWD_DEFINED__
+typedef interface IDWriteFontSet2 IDWriteFontSet2;
+#ifdef __cplusplus
+interface IDWriteFontSet2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSet3_FWD_DEFINED__
+#define __IDWriteFontSet3_FWD_DEFINED__
+typedef interface IDWriteFontSet3 IDWriteFontSet3;
+#ifdef __cplusplus
+interface IDWriteFontSet3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace3_FWD_DEFINED__
+#define __IDWriteFontFace3_FWD_DEFINED__
+typedef interface IDWriteFontFace3 IDWriteFontFace3;
+#ifdef __cplusplus
+interface IDWriteFontFace3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextFormat2_FWD_DEFINED__
+#define __IDWriteTextFormat2_FWD_DEFINED__
+typedef interface IDWriteTextFormat2 IDWriteTextFormat2;
+#ifdef __cplusplus
+interface IDWriteTextFormat2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextFormat3_FWD_DEFINED__
+#define __IDWriteTextFormat3_FWD_DEFINED__
+typedef interface IDWriteTextFormat3 IDWriteTextFormat3;
+#ifdef __cplusplus
+interface IDWriteTextFormat3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextLayout3_FWD_DEFINED__
+#define __IDWriteTextLayout3_FWD_DEFINED__
+typedef interface IDWriteTextLayout3 IDWriteTextLayout3;
+#ifdef __cplusplus
+interface IDWriteTextLayout3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteTextLayout4_FWD_DEFINED__
+#define __IDWriteTextLayout4_FWD_DEFINED__
+typedef interface IDWriteTextLayout4 IDWriteTextLayout4;
+#ifdef __cplusplus
+interface IDWriteTextLayout4;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFallback1_FWD_DEFINED__
+#define __IDWriteFontFallback1_FWD_DEFINED__
+typedef interface IDWriteFontFallback1 IDWriteFontFallback1;
+#ifdef __cplusplus
+interface IDWriteFontFallback1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteGdiInterop1_FWD_DEFINED__
+#define __IDWriteGdiInterop1_FWD_DEFINED__
+typedef interface IDWriteGdiInterop1 IDWriteGdiInterop1;
+#ifdef __cplusplus
+interface IDWriteGdiInterop1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSetBuilder_FWD_DEFINED__
+#define __IDWriteFontSetBuilder_FWD_DEFINED__
+typedef interface IDWriteFontSetBuilder IDWriteFontSetBuilder;
+#ifdef __cplusplus
+interface IDWriteFontSetBuilder;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSetBuilder1_FWD_DEFINED__
+#define __IDWriteFontSetBuilder1_FWD_DEFINED__
+typedef interface IDWriteFontSetBuilder1 IDWriteFontSetBuilder1;
+#ifdef __cplusplus
+interface IDWriteFontSetBuilder1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSetBuilder2_FWD_DEFINED__
+#define __IDWriteFontSetBuilder2_FWD_DEFINED__
+typedef interface IDWriteFontSetBuilder2 IDWriteFontSetBuilder2;
+#ifdef __cplusplus
+interface IDWriteFontSetBuilder2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFactory3_FWD_DEFINED__
+#define __IDWriteFactory3_FWD_DEFINED__
+typedef interface IDWriteFactory3 IDWriteFactory3;
+#ifdef __cplusplus
+interface IDWriteFactory3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace4_FWD_DEFINED__
+#define __IDWriteFontFace4_FWD_DEFINED__
+typedef interface IDWriteFontFace4 IDWriteFontFace4;
+#ifdef __cplusplus
+interface IDWriteFontFace4;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace5_FWD_DEFINED__
+#define __IDWriteFontFace5_FWD_DEFINED__
+typedef interface IDWriteFontFace5 IDWriteFontFace5;
+#ifdef __cplusplus
+interface IDWriteFontFace5;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteColorGlyphRunEnumerator1_FWD_DEFINED__
+#define __IDWriteColorGlyphRunEnumerator1_FWD_DEFINED__
+typedef interface IDWriteColorGlyphRunEnumerator1 IDWriteColorGlyphRunEnumerator1;
+#ifdef __cplusplus
+interface IDWriteColorGlyphRunEnumerator1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFactory4_FWD_DEFINED__
+#define __IDWriteFactory4_FWD_DEFINED__
+typedef interface IDWriteFactory4 IDWriteFactory4;
+#ifdef __cplusplus
+interface IDWriteFactory4;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteAsyncResult_FWD_DEFINED__
+#define __IDWriteAsyncResult_FWD_DEFINED__
+typedef interface IDWriteAsyncResult IDWriteAsyncResult;
+#ifdef __cplusplus
+interface IDWriteAsyncResult;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteRemoteFontFileStream_FWD_DEFINED__
+#define __IDWriteRemoteFontFileStream_FWD_DEFINED__
+typedef interface IDWriteRemoteFontFileStream IDWriteRemoteFontFileStream;
+#ifdef __cplusplus
+interface IDWriteRemoteFontFileStream;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteRemoteFontFileLoader_FWD_DEFINED__
+#define __IDWriteRemoteFontFileLoader_FWD_DEFINED__
+typedef interface IDWriteRemoteFontFileLoader IDWriteRemoteFontFileLoader;
+#ifdef __cplusplus
+interface IDWriteRemoteFontFileLoader;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteInMemoryFontFileLoader_FWD_DEFINED__
+#define __IDWriteInMemoryFontFileLoader_FWD_DEFINED__
+typedef interface IDWriteInMemoryFontFileLoader IDWriteInMemoryFontFileLoader;
+#ifdef __cplusplus
+interface IDWriteInMemoryFontFileLoader;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFactory5_FWD_DEFINED__
+#define __IDWriteFactory5_FWD_DEFINED__
+typedef interface IDWriteFactory5 IDWriteFactory5;
+#ifdef __cplusplus
+interface IDWriteFactory5;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFactory6_FWD_DEFINED__
+#define __IDWriteFactory6_FWD_DEFINED__
+typedef interface IDWriteFactory6 IDWriteFactory6;
+#ifdef __cplusplus
+interface IDWriteFactory6;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFactory7_FWD_DEFINED__
+#define __IDWriteFactory7_FWD_DEFINED__
+typedef interface IDWriteFactory7 IDWriteFactory7;
+#ifdef __cplusplus
+interface IDWriteFactory7;
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
 
 #include <dwrite_2.h>
 
-#define DWRITE_MAKE_FONT_AXIS_TAG(a,b,c,d) \
-    (static_cast<DWRITE_FONT_AXIS_TAG>(DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d)))
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-enum DWRITE_RENDERING_MODE1 {
-    DWRITE_RENDERING_MODE1_DEFAULT = DWRITE_RENDERING_MODE_DEFAULT,
-    DWRITE_RENDERING_MODE1_ALIASED = DWRITE_RENDERING_MODE_ALIASED,
-    DWRITE_RENDERING_MODE1_GDI_CLASSIC = DWRITE_RENDERING_MODE_GDI_CLASSIC,
-    DWRITE_RENDERING_MODE1_GDI_NATURAL = DWRITE_RENDERING_MODE_GDI_NATURAL,
-    DWRITE_RENDERING_MODE1_NATURAL = DWRITE_RENDERING_MODE_NATURAL,
-    DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
-    DWRITE_RENDERING_MODE1_OUTLINE = DWRITE_RENDERING_MODE_OUTLINE,
-    DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC_DOWNSAMPLED
+#ifndef __IDWriteFontFaceReference_FWD_DEFINED__
+#define __IDWriteFontFaceReference_FWD_DEFINED__
+typedef interface IDWriteFontFaceReference IDWriteFontFaceReference;
+#ifdef __cplusplus
+interface IDWriteFontFaceReference;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFaceReference1_FWD_DEFINED__
+#define __IDWriteFontFaceReference1_FWD_DEFINED__
+typedef interface IDWriteFontFaceReference1 IDWriteFontFaceReference1;
+#ifdef __cplusplus
+interface IDWriteFontFaceReference1;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace3_FWD_DEFINED__
+#define __IDWriteFontFace3_FWD_DEFINED__
+typedef interface IDWriteFontFace3 IDWriteFontFace3;
+#ifdef __cplusplus
+interface IDWriteFontFace3;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontSet_FWD_DEFINED__
+#define __IDWriteFontSet_FWD_DEFINED__
+typedef interface IDWriteFontSet IDWriteFontSet;
+#ifdef __cplusplus
+interface IDWriteFontSet;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontDownloadQueue_FWD_DEFINED__
+#define __IDWriteFontDownloadQueue_FWD_DEFINED__
+typedef interface IDWriteFontDownloadQueue IDWriteFontDownloadQueue;
+#ifdef __cplusplus
+interface IDWriteFontDownloadQueue;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontFace5_FWD_DEFINED__
+#define __IDWriteFontFace5_FWD_DEFINED__
+typedef interface IDWriteFontFace5 IDWriteFontFace5;
+#ifdef __cplusplus
+interface IDWriteFontFace5;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDWriteFontList2_FWD_DEFINED__
+#define __IDWriteFontList2_FWD_DEFINED__
+typedef interface IDWriteFontList2 IDWriteFontList2;
+#ifdef __cplusplus
+interface IDWriteFontList2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef _WINGDI_
+typedef struct FONTSIGNATURE FONTSIGNATURE;
+#endif /* _WINGDI_ */
+typedef enum DWRITE_LOCALITY {
+    DWRITE_LOCALITY_REMOTE = 0,
+    DWRITE_LOCALITY_PARTIAL = 1,
+    DWRITE_LOCALITY_LOCAL = 2
+} DWRITE_LOCALITY;
+typedef enum DWRITE_RENDERING_MODE1 {
+    DWRITE_RENDERING_MODE1_DEFAULT = 0,
+    DWRITE_RENDERING_MODE1_ALIASED = 1,
+    DWRITE_RENDERING_MODE1_GDI_CLASSIC = 2,
+    DWRITE_RENDERING_MODE1_GDI_NATURAL = 3,
+    DWRITE_RENDERING_MODE1_NATURAL = 4,
+    DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC = 5,
+    DWRITE_RENDERING_MODE1_OUTLINE = 6,
+    DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC_DOWNSAMPLED = 7
+} DWRITE_RENDERING_MODE1;
+typedef enum DWRITE_FONT_PROPERTY_ID {
+    DWRITE_FONT_PROPERTY_ID_NONE = 0,
+    DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FAMILY_NAME = 1,
+    DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FAMILY_NAME = 2,
+    DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FACE_NAME = 3,
+    DWRITE_FONT_PROPERTY_ID_FULL_NAME = 4,
+    DWRITE_FONT_PROPERTY_ID_WIN32_FAMILY_NAME = 5,
+    DWRITE_FONT_PROPERTY_ID_POSTSCRIPT_NAME = 6,
+    DWRITE_FONT_PROPERTY_ID_DESIGN_SCRIPT_LANGUAGE_TAG = 7,
+    DWRITE_FONT_PROPERTY_ID_SUPPORTED_SCRIPT_LANGUAGE_TAG = 8,
+    DWRITE_FONT_PROPERTY_ID_SEMANTIC_TAG = 9,
+    DWRITE_FONT_PROPERTY_ID_WEIGHT = 10,
+    DWRITE_FONT_PROPERTY_ID_STRETCH = 11,
+    DWRITE_FONT_PROPERTY_ID_STYLE = 12,
+    DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FACE_NAME = 13,
+    DWRITE_FONT_PROPERTY_ID_TOTAL = DWRITE_FONT_PROPERTY_ID_STYLE + 1,
+    DWRITE_FONT_PROPERTY_ID_TOTAL_RS3 = DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FACE_NAME + 1,
+    DWRITE_FONT_PROPERTY_ID_FAMILY_NAME = DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_PREFERRED_FAMILY_NAME = DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_FACE_NAME = DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FACE_NAME
+} DWRITE_FONT_PROPERTY_ID;
+typedef struct DWRITE_FONT_PROPERTY {
+    DWRITE_FONT_PROPERTY_ID propertyId;
+    const WCHAR *propertyValue;
+    const WCHAR *localeName;
+} DWRITE_FONT_PROPERTY;
+typedef enum DWRITE_FONT_AXIS_TAG {
+    DWRITE_FONT_AXIS_TAG_WEIGHT = 0x74686777,
+    DWRITE_FONT_AXIS_TAG_WIDTH = 0x68746477,
+    DWRITE_FONT_AXIS_TAG_SLANT = 0x746e6c73,
+    DWRITE_FONT_AXIS_TAG_OPTICAL_SIZE = 0x7a73706f,
+    DWRITE_FONT_AXIS_TAG_ITALIC = 0x6c617469
+} DWRITE_FONT_AXIS_TAG;
+typedef enum DWRITE_FONT_SOURCE_TYPE {
+    DWRITE_FONT_SOURCE_TYPE_UNKNOWN = 0,
+    DWRITE_FONT_SOURCE_TYPE_PER_MACHINE = 1,
+    DWRITE_FONT_SOURCE_TYPE_PER_USER = 2,
+    DWRITE_FONT_SOURCE_TYPE_APPX_PACKAGE = 3,
+    DWRITE_FONT_SOURCE_TYPE_REMOTE_FONT_PROVIDER = 4
+} DWRITE_FONT_SOURCE_TYPE;
+typedef struct DWRITE_FONT_AXIS_VALUE {
+    DWRITE_FONT_AXIS_TAG axisTag;
+    FLOAT value;
+} DWRITE_FONT_AXIS_VALUE;
+typedef struct DWRITE_FONT_AXIS_RANGE {
+    DWRITE_FONT_AXIS_TAG axisTag;
+    FLOAT minValue;
+    FLOAT maxValue;
+} DWRITE_FONT_AXIS_RANGE;
+typedef enum DWRITE_AUTOMATIC_FONT_AXES {
+    DWRITE_AUTOMATIC_FONT_AXES_NONE = 0,
+    DWRITE_AUTOMATIC_FONT_AXES_OPTICAL_SIZE = 1
+} DWRITE_AUTOMATIC_FONT_AXES;
+typedef enum DWRITE_FONT_AXIS_ATTRIBUTES {
+    DWRITE_FONT_AXIS_ATTRIBUTES_NONE = 0,
+    DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE = 1,
+    DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN = 2
+} DWRITE_FONT_AXIS_ATTRIBUTES;
+typedef enum DWRITE_FONT_FAMILY_MODEL {
+    DWRITE_FONT_FAMILY_MODEL_TYPOGRAPHIC = 0,
+    DWRITE_FONT_FAMILY_MODEL_WEIGHT_STRETCH_STYLE = 1
+} DWRITE_FONT_FAMILY_MODEL;
+/*****************************************************************************
+ * IDWriteFontDownloadListener interface
+ */
+#ifndef __IDWriteFontDownloadListener_INTERFACE_DEFINED__
+#define __IDWriteFontDownloadListener_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontDownloadListener, 0xb06fe5b9, 0x43ec, 0x4393, 0x88,0x1b, 0xdb,0xe4,0xdc,0x72,0xfd,0xa7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b06fe5b9-43ec-4393-881b-dbe4dc72fda7")
+IDWriteFontDownloadListener : public IUnknown
+{
+    virtual void STDMETHODCALLTYPE DownloadCompleted(
+        IDWriteFontDownloadQueue *queue,
+        IUnknown *context,
+        HRESULT result) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontDownloadListener, 0xb06fe5b9, 0x43ec, 0x4393, 0x88,0x1b, 0xdb,0xe4,0xdc,0x72,0xfd,0xa7)
+#endif
+#else
+typedef struct IDWriteFontDownloadListenerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontDownloadListener *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontDownloadListener *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontDownloadListener *This);
+
+    /*** IDWriteFontDownloadListener methods ***/
+    void (STDMETHODCALLTYPE *DownloadCompleted)(
+        IDWriteFontDownloadListener *This,
+        IDWriteFontDownloadQueue *queue,
+        IUnknown *context,
+        HRESULT result);
+
+    END_INTERFACE
+} IDWriteFontDownloadListenerVtbl;
+
+interface IDWriteFontDownloadListener {
+    CONST_VTBL IDWriteFontDownloadListenerVtbl* lpVtbl;
 };
 
-enum DWRITE_FONT_AXIS_TAG : UINT32 {
-    DWRITE_FONT_AXIS_TAG_WEIGHT       = DWRITE_MAKE_FONT_AXIS_TAG('w','g','h','t'),
-    DWRITE_FONT_AXIS_TAG_WIDTH        = DWRITE_MAKE_FONT_AXIS_TAG('w','d','t','h'),
-    DWRITE_FONT_AXIS_TAG_SLANT        = DWRITE_MAKE_FONT_AXIS_TAG('s','l','n','t'),
-    DWRITE_FONT_AXIS_TAG_OPTICAL_SIZE = DWRITE_MAKE_FONT_AXIS_TAG('o','p','s','z'),
-    DWRITE_FONT_AXIS_TAG_ITALIC       = DWRITE_MAKE_FONT_AXIS_TAG('i','t','a','l')
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontDownloadListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontDownloadListener_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontDownloadListener_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontDownloadListener methods ***/
+#define IDWriteFontDownloadListener_DownloadCompleted(This,queue,context,result) (This)->lpVtbl->DownloadCompleted(This,queue,context,result)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontDownloadListener_QueryInterface(IDWriteFontDownloadListener* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontDownloadListener_AddRef(IDWriteFontDownloadListener* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontDownloadListener_Release(IDWriteFontDownloadListener* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontDownloadListener methods ***/
+static FORCEINLINE void IDWriteFontDownloadListener_DownloadCompleted(IDWriteFontDownloadListener* This,IDWriteFontDownloadQueue *queue,IUnknown *context,HRESULT result) {
+    This->lpVtbl->DownloadCompleted(This,queue,context,result);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontDownloadListener_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontDownloadQueue interface
+ */
+#ifndef __IDWriteFontDownloadQueue_INTERFACE_DEFINED__
+#define __IDWriteFontDownloadQueue_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontDownloadQueue, 0xb71e6052, 0x5aea, 0x4fa3, 0x83,0x2e, 0xf6,0x0d,0x43,0x1f,0x7e,0x91);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b71e6052-5aea-4fa3-832e-f60d431f7e91")
+IDWriteFontDownloadQueue : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddListener(
+        IDWriteFontDownloadListener *listener,
+        UINT32 *token) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveListener(
+        UINT32 token) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsEmpty(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginDownload(
+        IUnknown *context) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CancelDownload(
+        ) = 0;
+
+    virtual UINT64 STDMETHODCALLTYPE GetGenerationCount(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontDownloadQueue, 0xb71e6052, 0x5aea, 0x4fa3, 0x83,0x2e, 0xf6,0x0d,0x43,0x1f,0x7e,0x91)
+#endif
+#else
+typedef struct IDWriteFontDownloadQueueVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontDownloadQueue *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontDownloadQueue *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontDownloadQueue *This);
+
+    /*** IDWriteFontDownloadQueue methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddListener)(
+        IDWriteFontDownloadQueue *This,
+        IDWriteFontDownloadListener *listener,
+        UINT32 *token);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveListener)(
+        IDWriteFontDownloadQueue *This,
+        UINT32 token);
+
+    WINBOOL (STDMETHODCALLTYPE *IsEmpty)(
+        IDWriteFontDownloadQueue *This);
+
+    HRESULT (STDMETHODCALLTYPE *BeginDownload)(
+        IDWriteFontDownloadQueue *This,
+        IUnknown *context);
+
+    HRESULT (STDMETHODCALLTYPE *CancelDownload)(
+        IDWriteFontDownloadQueue *This);
+
+    UINT64 (STDMETHODCALLTYPE *GetGenerationCount)(
+        IDWriteFontDownloadQueue *This);
+
+    END_INTERFACE
+} IDWriteFontDownloadQueueVtbl;
+
+interface IDWriteFontDownloadQueue {
+    CONST_VTBL IDWriteFontDownloadQueueVtbl* lpVtbl;
 };
 
-enum DWRITE_FONT_AXIS_ATTRIBUTES {
-    DWRITE_FONT_AXIS_ATTRIBUTES_NONE     = 0x0000,
-    DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE = 0x0001,
-    DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN   = 0x0002
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontDownloadQueue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontDownloadQueue_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontDownloadQueue_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontDownloadQueue methods ***/
+#define IDWriteFontDownloadQueue_AddListener(This,listener,token) (This)->lpVtbl->AddListener(This,listener,token)
+#define IDWriteFontDownloadQueue_RemoveListener(This,token) (This)->lpVtbl->RemoveListener(This,token)
+#define IDWriteFontDownloadQueue_IsEmpty(This) (This)->lpVtbl->IsEmpty(This)
+#define IDWriteFontDownloadQueue_BeginDownload(This,context) (This)->lpVtbl->BeginDownload(This,context)
+#define IDWriteFontDownloadQueue_CancelDownload(This) (This)->lpVtbl->CancelDownload(This)
+#define IDWriteFontDownloadQueue_GetGenerationCount(This) (This)->lpVtbl->GetGenerationCount(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontDownloadQueue_QueryInterface(IDWriteFontDownloadQueue* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontDownloadQueue_AddRef(IDWriteFontDownloadQueue* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontDownloadQueue_Release(IDWriteFontDownloadQueue* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontDownloadQueue methods ***/
+static FORCEINLINE HRESULT IDWriteFontDownloadQueue_AddListener(IDWriteFontDownloadQueue* This,IDWriteFontDownloadListener *listener,UINT32 *token) {
+    return This->lpVtbl->AddListener(This,listener,token);
+}
+static FORCEINLINE HRESULT IDWriteFontDownloadQueue_RemoveListener(IDWriteFontDownloadQueue* This,UINT32 token) {
+    return This->lpVtbl->RemoveListener(This,token);
+}
+static FORCEINLINE WINBOOL IDWriteFontDownloadQueue_IsEmpty(IDWriteFontDownloadQueue* This) {
+    return This->lpVtbl->IsEmpty(This);
+}
+static FORCEINLINE HRESULT IDWriteFontDownloadQueue_BeginDownload(IDWriteFontDownloadQueue* This,IUnknown *context) {
+    return This->lpVtbl->BeginDownload(This,context);
+}
+static FORCEINLINE HRESULT IDWriteFontDownloadQueue_CancelDownload(IDWriteFontDownloadQueue* This) {
+    return This->lpVtbl->CancelDownload(This);
+}
+static FORCEINLINE UINT64 IDWriteFontDownloadQueue_GetGenerationCount(IDWriteFontDownloadQueue* This) {
+    return This->lpVtbl->GetGenerationCount(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontDownloadQueue_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteRenderingParams3 interface
+ */
+#ifndef __IDWriteRenderingParams3_INTERFACE_DEFINED__
+#define __IDWriteRenderingParams3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteRenderingParams3, 0xb7924baa, 0x391b, 0x412a, 0x8c,0x5c, 0xe4,0x4c,0xc2,0xd8,0x67,0xdc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b7924baa-391b-412a-8c5c-e44cc2d867dc")
+IDWriteRenderingParams3 : public IDWriteRenderingParams2
+{
+    virtual DWRITE_RENDERING_MODE1 STDMETHODCALLTYPE GetRenderingMode1(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteRenderingParams3, 0xb7924baa, 0x391b, 0x412a, 0x8c,0x5c, 0xe4,0x4c,0xc2,0xd8,0x67,0xdc)
+#endif
+#else
+typedef struct IDWriteRenderingParams3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteRenderingParams3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteRenderingParams3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteRenderingParams3 *This);
+
+    /*** IDWriteRenderingParams methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGamma)(
+        IDWriteRenderingParams3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetEnhancedContrast)(
+        IDWriteRenderingParams3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetClearTypeLevel)(
+        IDWriteRenderingParams3 *This);
+
+    DWRITE_PIXEL_GEOMETRY (STDMETHODCALLTYPE *GetPixelGeometry)(
+        IDWriteRenderingParams3 *This);
+
+    DWRITE_RENDERING_MODE (STDMETHODCALLTYPE *GetRenderingMode)(
+        IDWriteRenderingParams3 *This);
+
+    /*** IDWriteRenderingParams1 methods ***/
+    FLOAT (STDMETHODCALLTYPE *GetGrayscaleEnhancedContrast)(
+        IDWriteRenderingParams3 *This);
+
+    /*** IDWriteRenderingParams2 methods ***/
+    DWRITE_GRID_FIT_MODE (STDMETHODCALLTYPE *GetGridFitMode)(
+        IDWriteRenderingParams3 *This);
+
+    /*** IDWriteRenderingParams3 methods ***/
+    DWRITE_RENDERING_MODE1 (STDMETHODCALLTYPE *GetRenderingMode1)(
+        IDWriteRenderingParams3 *This);
+
+    END_INTERFACE
+} IDWriteRenderingParams3Vtbl;
+
+interface IDWriteRenderingParams3 {
+    CONST_VTBL IDWriteRenderingParams3Vtbl* lpVtbl;
 };
 
-struct DWRITE_GLYPH_IMAGE_DATA {
-    void const *imageData;
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteRenderingParams3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteRenderingParams3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteRenderingParams3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteRenderingParams methods ***/
+#define IDWriteRenderingParams3_GetGamma(This) (This)->lpVtbl->GetGamma(This)
+#define IDWriteRenderingParams3_GetEnhancedContrast(This) (This)->lpVtbl->GetEnhancedContrast(This)
+#define IDWriteRenderingParams3_GetClearTypeLevel(This) (This)->lpVtbl->GetClearTypeLevel(This)
+#define IDWriteRenderingParams3_GetPixelGeometry(This) (This)->lpVtbl->GetPixelGeometry(This)
+#define IDWriteRenderingParams3_GetRenderingMode(This) (This)->lpVtbl->GetRenderingMode(This)
+/*** IDWriteRenderingParams1 methods ***/
+#define IDWriteRenderingParams3_GetGrayscaleEnhancedContrast(This) (This)->lpVtbl->GetGrayscaleEnhancedContrast(This)
+/*** IDWriteRenderingParams2 methods ***/
+#define IDWriteRenderingParams3_GetGridFitMode(This) (This)->lpVtbl->GetGridFitMode(This)
+/*** IDWriteRenderingParams3 methods ***/
+#define IDWriteRenderingParams3_GetRenderingMode1(This) (This)->lpVtbl->GetRenderingMode1(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteRenderingParams3_QueryInterface(IDWriteRenderingParams3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams3_AddRef(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteRenderingParams3_Release(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteRenderingParams methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams3_GetGamma(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetGamma(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams3_GetEnhancedContrast(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetEnhancedContrast(This);
+}
+static FORCEINLINE FLOAT IDWriteRenderingParams3_GetClearTypeLevel(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetClearTypeLevel(This);
+}
+static FORCEINLINE DWRITE_PIXEL_GEOMETRY IDWriteRenderingParams3_GetPixelGeometry(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetPixelGeometry(This);
+}
+static FORCEINLINE DWRITE_RENDERING_MODE IDWriteRenderingParams3_GetRenderingMode(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetRenderingMode(This);
+}
+/*** IDWriteRenderingParams1 methods ***/
+static FORCEINLINE FLOAT IDWriteRenderingParams3_GetGrayscaleEnhancedContrast(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetGrayscaleEnhancedContrast(This);
+}
+/*** IDWriteRenderingParams2 methods ***/
+static FORCEINLINE DWRITE_GRID_FIT_MODE IDWriteRenderingParams3_GetGridFitMode(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetGridFitMode(This);
+}
+/*** IDWriteRenderingParams3 methods ***/
+static FORCEINLINE DWRITE_RENDERING_MODE1 IDWriteRenderingParams3_GetRenderingMode1(IDWriteRenderingParams3* This) {
+    return This->lpVtbl->GetRenderingMode1(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteRenderingParams3_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteStringList interface
+ */
+#ifndef __IDWriteStringList_INTERFACE_DEFINED__
+#define __IDWriteStringList_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteStringList, 0xcfee3140, 0x1257, 0x47ca, 0x8b,0x85, 0x31,0xbf,0xcf,0x3f,0x2d,0x0e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("cfee3140-1257-47ca-8b85-31bfcf3f2d0e")
+IDWriteStringList : public IUnknown
+{
+    virtual UINT32 STDMETHODCALLTYPE GetCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleNameLength(
+        UINT32 index,
+        UINT32 *length) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocaleName(
+        UINT32 index,
+        WCHAR *name,
+        UINT32 size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStringLength(
+        UINT32 index,
+        UINT32 *length) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetString(
+        UINT32 index,
+        WCHAR *string,
+        UINT32 size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteStringList, 0xcfee3140, 0x1257, 0x47ca, 0x8b,0x85, 0x31,0xbf,0xcf,0x3f,0x2d,0x0e)
+#endif
+#else
+typedef struct IDWriteStringListVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteStringList *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteStringList *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteStringList *This);
+
+    /*** IDWriteStringList methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetCount)(
+        IDWriteStringList *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteStringList *This,
+        UINT32 index,
+        UINT32 *length);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteStringList *This,
+        UINT32 index,
+        WCHAR *name,
+        UINT32 size);
+
+    HRESULT (STDMETHODCALLTYPE *GetStringLength)(
+        IDWriteStringList *This,
+        UINT32 index,
+        UINT32 *length);
+
+    HRESULT (STDMETHODCALLTYPE *GetString)(
+        IDWriteStringList *This,
+        UINT32 index,
+        WCHAR *string,
+        UINT32 size);
+
+    END_INTERFACE
+} IDWriteStringListVtbl;
+
+interface IDWriteStringList {
+    CONST_VTBL IDWriteStringListVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteStringList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteStringList_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteStringList_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteStringList methods ***/
+#define IDWriteStringList_GetCount(This) (This)->lpVtbl->GetCount(This)
+#define IDWriteStringList_GetLocaleNameLength(This,index,length) (This)->lpVtbl->GetLocaleNameLength(This,index,length)
+#define IDWriteStringList_GetLocaleName(This,index,name,size) (This)->lpVtbl->GetLocaleName(This,index,name,size)
+#define IDWriteStringList_GetStringLength(This,index,length) (This)->lpVtbl->GetStringLength(This,index,length)
+#define IDWriteStringList_GetString(This,index,string,size) (This)->lpVtbl->GetString(This,index,string,size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteStringList_QueryInterface(IDWriteStringList* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteStringList_AddRef(IDWriteStringList* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteStringList_Release(IDWriteStringList* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteStringList methods ***/
+static FORCEINLINE UINT32 IDWriteStringList_GetCount(IDWriteStringList* This) {
+    return This->lpVtbl->GetCount(This);
+}
+static FORCEINLINE HRESULT IDWriteStringList_GetLocaleNameLength(IDWriteStringList* This,UINT32 index,UINT32 *length) {
+    return This->lpVtbl->GetLocaleNameLength(This,index,length);
+}
+static FORCEINLINE HRESULT IDWriteStringList_GetLocaleName(IDWriteStringList* This,UINT32 index,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetLocaleName(This,index,name,size);
+}
+static FORCEINLINE HRESULT IDWriteStringList_GetStringLength(IDWriteStringList* This,UINT32 index,UINT32 *length) {
+    return This->lpVtbl->GetStringLength(This,index,length);
+}
+static FORCEINLINE HRESULT IDWriteStringList_GetString(IDWriteStringList* This,UINT32 index,WCHAR *string,UINT32 size) {
+    return This->lpVtbl->GetString(This,index,string,size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteStringList_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSet interface
+ */
+#ifndef __IDWriteFontSet_INTERFACE_DEFINED__
+#define __IDWriteFontSet_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSet, 0x53585141, 0xd9f8, 0x4095, 0x83,0x21, 0xd7,0x3c,0xf6,0xbd,0x11,0x6b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("53585141-d9f8-4095-8321-d73cf6bd116b")
+IDWriteFontSet : public IUnknown
+{
+    virtual UINT32 STDMETHODCALLTYPE GetFontCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFaceReference(
+        UINT32 index,
+        IDWriteFontFaceReference **reference) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindFontFaceReference(
+        IDWriteFontFaceReference *reference,
+        UINT32 *index,
+        WINBOOL *exists) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindFontFace(
+        IDWriteFontFace *fontface,
+        UINT32 *index,
+        WINBOOL *exists) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPropertyValues__(
+        DWRITE_FONT_PROPERTY_ID id,
+        IDWriteStringList **values) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPropertyValues_(
+        DWRITE_FONT_PROPERTY_ID id,
+        const WCHAR *preferred_locales,
+        IDWriteStringList **values) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPropertyValues(
+        UINT32 index,
+        DWRITE_FONT_PROPERTY_ID id,
+        WINBOOL *exists,
+        IDWriteLocalizedStrings **values) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPropertyOccurrenceCount(
+        const DWRITE_FONT_PROPERTY *property,
+        UINT32 *count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts_(
+        const WCHAR *family,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontSet **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts(
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 count,
+        IDWriteFontSet **fontset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSet, 0x53585141, 0xd9f8, 0x4095, 0x83,0x21, 0xd7,0x3c,0xf6,0xbd,0x11,0x6b)
+#endif
+#else
+typedef struct IDWriteFontSetVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSet *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSet *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSet *This);
+
+    /*** IDWriteFontSet methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontSet *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontSet *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFaceReference)(
+        IDWriteFontSet *This,
+        IDWriteFontFaceReference *reference,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFace)(
+        IDWriteFontSet *This,
+        IDWriteFontFace *fontface,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues__)(
+        IDWriteFontSet *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues_)(
+        IDWriteFontSet *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        const WCHAR *preferred_locales,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues)(
+        IDWriteFontSet *This,
+        UINT32 index,
+        DWRITE_FONT_PROPERTY_ID id,
+        WINBOOL *exists,
+        IDWriteLocalizedStrings **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyOccurrenceCount)(
+        IDWriteFontSet *This,
+        const DWRITE_FONT_PROPERTY *property,
+        UINT32 *count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts_)(
+        IDWriteFontSet *This,
+        const WCHAR *family,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontSet *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 count,
+        IDWriteFontSet **fontset);
+
+    END_INTERFACE
+} IDWriteFontSetVtbl;
+
+interface IDWriteFontSet {
+    CONST_VTBL IDWriteFontSetVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSet_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSet_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSet methods ***/
+#define IDWriteFontSet_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+#define IDWriteFontSet_GetFontFaceReference(This,index,reference) (This)->lpVtbl->GetFontFaceReference(This,index,reference)
+#define IDWriteFontSet_FindFontFaceReference(This,reference,index,exists) (This)->lpVtbl->FindFontFaceReference(This,reference,index,exists)
+#define IDWriteFontSet_FindFontFace(This,fontface,index,exists) (This)->lpVtbl->FindFontFace(This,fontface,index,exists)
+#define IDWriteFontSet_GetPropertyValues__(This,id,values) (This)->lpVtbl->GetPropertyValues__(This,id,values)
+#define IDWriteFontSet_GetPropertyValues_(This,id,preferred_locales,values) (This)->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values)
+#define IDWriteFontSet_GetPropertyValues(This,index,id,exists,values) (This)->lpVtbl->GetPropertyValues(This,index,id,exists,values)
+#define IDWriteFontSet_GetPropertyOccurrenceCount(This,property,count) (This)->lpVtbl->GetPropertyOccurrenceCount(This,property,count)
+#define IDWriteFontSet_GetMatchingFonts_(This,family,weight,stretch,style,fontset) (This)->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset)
+#define IDWriteFontSet_GetMatchingFonts(This,props,count,fontset) (This)->lpVtbl->GetMatchingFonts(This,props,count,fontset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet_QueryInterface(IDWriteFontSet* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSet_AddRef(IDWriteFontSet* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSet_Release(IDWriteFontSet* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSet methods ***/
+static FORCEINLINE UINT32 IDWriteFontSet_GetFontCount(IDWriteFontSet* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetFontFaceReference(IDWriteFontSet* This,UINT32 index,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,index,reference);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_FindFontFaceReference(IDWriteFontSet* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_FindFontFace(IDWriteFontSet* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetPropertyValues__(IDWriteFontSet* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues__(This,id,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetPropertyValues_(IDWriteFontSet* This,DWRITE_FONT_PROPERTY_ID id,const WCHAR *preferred_locales,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetPropertyValues(IDWriteFontSet* This,UINT32 index,DWRITE_FONT_PROPERTY_ID id,WINBOOL *exists,IDWriteLocalizedStrings **values) {
+    return This->lpVtbl->GetPropertyValues(This,index,id,exists,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetPropertyOccurrenceCount(IDWriteFontSet* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
+    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetMatchingFonts_(IDWriteFontSet* This,const WCHAR *family,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet_GetMatchingFonts(IDWriteFontSet* This,const DWRITE_FONT_PROPERTY *props,UINT32 count,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetMatchingFonts(This,props,count,fontset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSet_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontResource interface
+ */
+#ifndef __IDWriteFontResource_INTERFACE_DEFINED__
+#define __IDWriteFontResource_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontResource, 0x1f803a76, 0x6871, 0x48e8, 0x98,0x7f, 0xb9,0x75,0x55,0x1c,0x50,0xf2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1f803a76-6871-48e8-987f-b975551c50f2")
+IDWriteFontResource : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontFile(
+        IDWriteFontFile **fontfile) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontFaceIndex(
+        ) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontAxisCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDefaultFontAxisValues(
+        const DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisRanges(
+        const DWRITE_FONT_AXIS_RANGE *ranges,
+        UINT32 num_ranges) = 0;
+
+    virtual DWRITE_FONT_AXIS_ATTRIBUTES STDMETHODCALLTYPE GetFontAxisAttributes(
+        UINT32 axis) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAxisNames(
+        UINT32 axis,
+        IDWriteLocalizedStrings **names) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetAxisValueNameCount(
+        UINT32 axis) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAxisValueNames(
+        UINT32 axis,
+        UINT32 axis_value,
+        DWRITE_FONT_AXIS_RANGE *axis_range,
+        IDWriteLocalizedStrings **names) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE HasVariations(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontFace5 **fontface) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFaceReference(
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontFaceReference1 **reference) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontResource, 0x1f803a76, 0x6871, 0x48e8, 0x98,0x7f, 0xb9,0x75,0x55,0x1c,0x50,0xf2)
+#endif
+#else
+typedef struct IDWriteFontResourceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontResource *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontResource *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontResource *This);
+
+    /*** IDWriteFontResource methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFile)(
+        IDWriteFontResource *This,
+        IDWriteFontFile **fontfile);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFaceIndex)(
+        IDWriteFontResource *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontAxisCount)(
+        IDWriteFontResource *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDefaultFontAxisValues)(
+        IDWriteFontResource *This,
+        const DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges)(
+        IDWriteFontResource *This,
+        const DWRITE_FONT_AXIS_RANGE *ranges,
+        UINT32 num_ranges);
+
+    DWRITE_FONT_AXIS_ATTRIBUTES (STDMETHODCALLTYPE *GetFontAxisAttributes)(
+        IDWriteFontResource *This,
+        UINT32 axis);
+
+    HRESULT (STDMETHODCALLTYPE *GetAxisNames)(
+        IDWriteFontResource *This,
+        UINT32 axis,
+        IDWriteLocalizedStrings **names);
+
+    UINT32 (STDMETHODCALLTYPE *GetAxisValueNameCount)(
+        IDWriteFontResource *This,
+        UINT32 axis);
+
+    HRESULT (STDMETHODCALLTYPE *GetAxisValueNames)(
+        IDWriteFontResource *This,
+        UINT32 axis,
+        UINT32 axis_value,
+        DWRITE_FONT_AXIS_RANGE *axis_range,
+        IDWriteLocalizedStrings **names);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVariations)(
+        IDWriteFontResource *This);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFontResource *This,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontFace5 **fontface);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference)(
+        IDWriteFontResource *This,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontFaceReference1 **reference);
+
+    END_INTERFACE
+} IDWriteFontResourceVtbl;
+
+interface IDWriteFontResource {
+    CONST_VTBL IDWriteFontResourceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontResource_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontResource_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontResource methods ***/
+#define IDWriteFontResource_GetFontFile(This,fontfile) (This)->lpVtbl->GetFontFile(This,fontfile)
+#define IDWriteFontResource_GetFontFaceIndex(This) (This)->lpVtbl->GetFontFaceIndex(This)
+#define IDWriteFontResource_GetFontAxisCount(This) (This)->lpVtbl->GetFontAxisCount(This)
+#define IDWriteFontResource_GetDefaultFontAxisValues(This,values,num_values) (This)->lpVtbl->GetDefaultFontAxisValues(This,values,num_values)
+#define IDWriteFontResource_GetFontAxisRanges(This,ranges,num_ranges) (This)->lpVtbl->GetFontAxisRanges(This,ranges,num_ranges)
+#define IDWriteFontResource_GetFontAxisAttributes(This,axis) (This)->lpVtbl->GetFontAxisAttributes(This,axis)
+#define IDWriteFontResource_GetAxisNames(This,axis,names) (This)->lpVtbl->GetAxisNames(This,axis,names)
+#define IDWriteFontResource_GetAxisValueNameCount(This,axis) (This)->lpVtbl->GetAxisValueNameCount(This,axis)
+#define IDWriteFontResource_GetAxisValueNames(This,axis,axis_value,axis_range,names) (This)->lpVtbl->GetAxisValueNames(This,axis,axis_value,axis_range,names)
+#define IDWriteFontResource_HasVariations(This) (This)->lpVtbl->HasVariations(This)
+#define IDWriteFontResource_CreateFontFace(This,simulations,axis_values,num_values,fontface) (This)->lpVtbl->CreateFontFace(This,simulations,axis_values,num_values,fontface)
+#define IDWriteFontResource_CreateFontFaceReference(This,simulations,axis_values,num_values,reference) (This)->lpVtbl->CreateFontFaceReference(This,simulations,axis_values,num_values,reference)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontResource_QueryInterface(IDWriteFontResource* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontResource_AddRef(IDWriteFontResource* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontResource_Release(IDWriteFontResource* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontResource methods ***/
+static FORCEINLINE HRESULT IDWriteFontResource_GetFontFile(IDWriteFontResource* This,IDWriteFontFile **fontfile) {
+    return This->lpVtbl->GetFontFile(This,fontfile);
+}
+static FORCEINLINE UINT32 IDWriteFontResource_GetFontFaceIndex(IDWriteFontResource* This) {
+    return This->lpVtbl->GetFontFaceIndex(This);
+}
+static FORCEINLINE UINT32 IDWriteFontResource_GetFontAxisCount(IDWriteFontResource* This) {
+    return This->lpVtbl->GetFontAxisCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontResource_GetDefaultFontAxisValues(IDWriteFontResource* This,const DWRITE_FONT_AXIS_VALUE *values,UINT32 num_values) {
+    return This->lpVtbl->GetDefaultFontAxisValues(This,values,num_values);
+}
+static FORCEINLINE HRESULT IDWriteFontResource_GetFontAxisRanges(IDWriteFontResource* This,const DWRITE_FONT_AXIS_RANGE *ranges,UINT32 num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges(This,ranges,num_ranges);
+}
+static FORCEINLINE DWRITE_FONT_AXIS_ATTRIBUTES IDWriteFontResource_GetFontAxisAttributes(IDWriteFontResource* This,UINT32 axis) {
+    return This->lpVtbl->GetFontAxisAttributes(This,axis);
+}
+static FORCEINLINE HRESULT IDWriteFontResource_GetAxisNames(IDWriteFontResource* This,UINT32 axis,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetAxisNames(This,axis,names);
+}
+static FORCEINLINE UINT32 IDWriteFontResource_GetAxisValueNameCount(IDWriteFontResource* This,UINT32 axis) {
+    return This->lpVtbl->GetAxisValueNameCount(This,axis);
+}
+static FORCEINLINE HRESULT IDWriteFontResource_GetAxisValueNames(IDWriteFontResource* This,UINT32 axis,UINT32 axis_value,DWRITE_FONT_AXIS_RANGE *axis_range,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetAxisValueNames(This,axis,axis_value,axis_range,names);
+}
+static FORCEINLINE WINBOOL IDWriteFontResource_HasVariations(IDWriteFontResource* This) {
+    return This->lpVtbl->HasVariations(This);
+}
+static FORCEINLINE HRESULT IDWriteFontResource_CreateFontFace(IDWriteFontResource* This,DWRITE_FONT_SIMULATIONS simulations,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontFace5 **fontface) {
+    return This->lpVtbl->CreateFontFace(This,simulations,axis_values,num_values,fontface);
+}
+static FORCEINLINE HRESULT IDWriteFontResource_CreateFontFaceReference(IDWriteFontResource* This,DWRITE_FONT_SIMULATIONS simulations,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontFaceReference1 **reference) {
+    return This->lpVtbl->CreateFontFaceReference(This,simulations,axis_values,num_values,reference);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontResource_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSet1 interface
+ */
+#ifndef __IDWriteFontSet1_INTERFACE_DEFINED__
+#define __IDWriteFontSet1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSet1, 0x7e9fda85, 0x6c92, 0x4053, 0xbc,0x47, 0x7a,0xe3,0x53,0x0d,0xb4,0xd3);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("7e9fda85-6c92-4053-bc47-7ae3530db4d3")
+IDWriteFontSet1 : public IDWriteFontSet
+{
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts(
+        const DWRITE_FONT_PROPERTY *property,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontSet1 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFirstFontResources(
+        IDWriteFontSet1 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilteredFonts__(
+        const UINT32 *indices,
+        UINT32 num_indices,
+        IDWriteFontSet1 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilteredFonts_(
+        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        IDWriteFontSet1 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilteredFonts(
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_property,
+        IDWriteFontSet1 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilteredFontIndices_(
+        const DWRITE_FONT_AXIS_RANGE *ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilteredFontIndices(
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisRanges_(
+        UINT32 font_index,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisRanges(
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFaceReference(
+        UINT32 index,
+        IDWriteFontFaceReference1 **reference) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontResource(
+        UINT32 index,
+        IDWriteFontResource **resource) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        UINT32 index,
+        IDWriteFontFace5 **fontface) = 0;
+
+    virtual DWRITE_LOCALITY STDMETHODCALLTYPE GetFontLocality(
+        UINT32 index) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSet1, 0x7e9fda85, 0x6c92, 0x4053, 0xbc,0x47, 0x7a,0xe3,0x53,0x0d,0xb4,0xd3)
+#endif
+#else
+typedef struct IDWriteFontSet1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSet1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSet1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSet1 *This);
+
+    /*** IDWriteFontSet methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontSet1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontSet1 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFaceReference)(
+        IDWriteFontSet1 *This,
+        IDWriteFontFaceReference *reference,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFace)(
+        IDWriteFontSet1 *This,
+        IDWriteFontFace *fontface,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues__)(
+        IDWriteFontSet1 *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues_)(
+        IDWriteFontSet1 *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        const WCHAR *preferred_locales,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues)(
+        IDWriteFontSet1 *This,
+        UINT32 index,
+        DWRITE_FONT_PROPERTY_ID id,
+        WINBOOL *exists,
+        IDWriteLocalizedStrings **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyOccurrenceCount)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_PROPERTY *property,
+        UINT32 *count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts_)(
+        IDWriteFontSet1 *This,
+        const WCHAR *family,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 count,
+        IDWriteFontSet **fontset);
+
+    /*** IDWriteFontSet1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetMatchingFonts)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_PROPERTY *property,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFirstFontResources)(
+        IDWriteFontSet1 *This,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts__)(
+        IDWriteFontSet1 *This,
+        const UINT32 *indices,
+        UINT32 num_indices,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts_)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_property,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices_)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_AXIS_RANGE *ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices)(
+        IDWriteFontSet1 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges_)(
+        IDWriteFontSet1 *This,
+        UINT32 font_index,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges)(
+        IDWriteFontSet1 *This,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetFontFaceReference)(
+        IDWriteFontSet1 *This,
+        UINT32 index,
+        IDWriteFontFaceReference1 **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
+        IDWriteFontSet1 *This,
+        UINT32 index,
+        IDWriteFontResource **resource);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFontSet1 *This,
+        UINT32 index,
+        IDWriteFontFace5 **fontface);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontSet1 *This,
+        UINT32 index);
+
+    END_INTERFACE
+} IDWriteFontSet1Vtbl;
+
+interface IDWriteFontSet1 {
+    CONST_VTBL IDWriteFontSet1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSet1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSet1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSet1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSet methods ***/
+#define IDWriteFontSet1_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+#define IDWriteFontSet1_FindFontFaceReference(This,reference,index,exists) (This)->lpVtbl->FindFontFaceReference(This,reference,index,exists)
+#define IDWriteFontSet1_FindFontFace(This,fontface,index,exists) (This)->lpVtbl->FindFontFace(This,fontface,index,exists)
+#define IDWriteFontSet1_GetPropertyValues__(This,id,values) (This)->lpVtbl->GetPropertyValues__(This,id,values)
+#define IDWriteFontSet1_GetPropertyValues_(This,id,preferred_locales,values) (This)->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values)
+#define IDWriteFontSet1_GetPropertyValues(This,index,id,exists,values) (This)->lpVtbl->GetPropertyValues(This,index,id,exists,values)
+#define IDWriteFontSet1_GetPropertyOccurrenceCount(This,property,count) (This)->lpVtbl->GetPropertyOccurrenceCount(This,property,count)
+#define IDWriteFontSet1_GetMatchingFonts_(This,family,weight,stretch,style,fontset) (This)->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset)
+/*** IDWriteFontSet1 methods ***/
+#define IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset) (This)->lpVtbl->IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset)
+#define IDWriteFontSet1_GetFirstFontResources(This,fontset) (This)->lpVtbl->GetFirstFontResources(This,fontset)
+#define IDWriteFontSet1_GetFilteredFonts__(This,indices,num_indices,fontset) (This)->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset)
+#define IDWriteFontSet1_GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset) (This)->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset)
+#define IDWriteFontSet1_GetFilteredFonts(This,props,num_properties,select_any_property,fontset) (This)->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset)
+#define IDWriteFontSet1_GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices) (This)->lpVtbl->GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices)
+#define IDWriteFontSet1_GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices) (This)->lpVtbl->GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices)
+#define IDWriteFontSet1_GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges)
+#define IDWriteFontSet1_GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges)
+#define IDWriteFontSet1_GetFontFaceReference(This,index,reference) (This)->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference)
+#define IDWriteFontSet1_CreateFontResource(This,index,resource) (This)->lpVtbl->CreateFontResource(This,index,resource)
+#define IDWriteFontSet1_CreateFontFace(This,index,fontface) (This)->lpVtbl->CreateFontFace(This,index,fontface)
+#define IDWriteFontSet1_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet1_QueryInterface(IDWriteFontSet1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSet1_AddRef(IDWriteFontSet1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSet1_Release(IDWriteFontSet1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSet methods ***/
+static FORCEINLINE UINT32 IDWriteFontSet1_GetFontCount(IDWriteFontSet1* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_FindFontFaceReference(IDWriteFontSet1* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_FindFontFace(IDWriteFontSet1* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetPropertyValues__(IDWriteFontSet1* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues__(This,id,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetPropertyValues_(IDWriteFontSet1* This,DWRITE_FONT_PROPERTY_ID id,const WCHAR *preferred_locales,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetPropertyValues(IDWriteFontSet1* This,UINT32 index,DWRITE_FONT_PROPERTY_ID id,WINBOOL *exists,IDWriteLocalizedStrings **values) {
+    return This->lpVtbl->GetPropertyValues(This,index,id,exists,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetPropertyOccurrenceCount(IDWriteFontSet1* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
+    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetMatchingFonts_(IDWriteFontSet1* This,const WCHAR *family,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset);
+}
+/*** IDWriteFontSet1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet1_GetMatchingFonts(IDWriteFontSet1* This,const DWRITE_FONT_PROPERTY *property,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFirstFontResources(IDWriteFontSet1* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFirstFontResources(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFilteredFonts__(IDWriteFontSet1* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFilteredFonts_(IDWriteFontSet1* This,const DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,WINBOOL select_any_range,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFilteredFonts(IDWriteFontSet1* This,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties,WINBOOL select_any_property,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFilteredFontIndices_(IDWriteFontSet1* This,const DWRITE_FONT_AXIS_RANGE *ranges,UINT32 num_ranges,WINBOOL select_any_range,UINT32 *indices,UINT32 num_indices,UINT32 *actual_num_indices) {
+    return This->lpVtbl->GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFilteredFontIndices(IDWriteFontSet1* This,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties,WINBOOL select_any_range,UINT32 *indices,UINT32 num_indices,UINT32 *actual_num_indices) {
+    return This->lpVtbl->GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFontAxisRanges_(IDWriteFontSet1* This,UINT32 font_index,DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,UINT32 *actual_num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFontAxisRanges(IDWriteFontSet1* This,DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,UINT32 *actual_num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_GetFontFaceReference(IDWriteFontSet1* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
+    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_CreateFontResource(IDWriteFontSet1* This,UINT32 index,IDWriteFontResource **resource) {
+    return This->lpVtbl->CreateFontResource(This,index,resource);
+}
+static FORCEINLINE HRESULT IDWriteFontSet1_CreateFontFace(IDWriteFontSet1* This,UINT32 index,IDWriteFontFace5 **fontface) {
+    return This->lpVtbl->CreateFontFace(This,index,fontface);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontSet1_GetFontLocality(IDWriteFontSet1* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSet1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFont3 interface
+ */
+#ifndef __IDWriteFont3_INTERFACE_DEFINED__
+#define __IDWriteFont3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFont3, 0x29748ed6, 0x8c9c, 0x4a6a, 0xbe,0x0b, 0xd9,0x12,0xe8,0x53,0x89,0x44);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("29748ed6-8c9c-4a6a-be0b-d912e8538944")
+IDWriteFont3 : public IDWriteFont2
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        IDWriteFontFace3 **fontface) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE Equals(
+        IDWriteFont *font) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFaceReference(
+        IDWriteFontFaceReference **reference) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE HasCharacter(
+        UINT32 character) = 0;
+
+    virtual DWRITE_LOCALITY STDMETHODCALLTYPE GetLocality(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFont3, 0x29748ed6, 0x8c9c, 0x4a6a, 0xbe,0x0b, 0xd9,0x12,0xe8,0x53,0x89,0x44)
+#endif
+#else
+typedef struct IDWriteFont3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFont3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFont3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFont3 *This);
+
+    /*** IDWriteFont methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFont3 *This,
+        IDWriteFontFamily **family);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFont3 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFont3 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFont3 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFont3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFont3 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFont3 *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFont3 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFont3 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFont3 *This,
+        UINT32 value,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFont3 *This,
+        IDWriteFontFace **face);
+
+    /*** IDWriteFont1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFont1_GetMetrics)(
+        IDWriteFont3 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetPanose)(
+        IDWriteFont3 *This,
+        DWRITE_PANOSE *panose);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFont3 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFont3 *This);
+
+    /*** IDWriteFont2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
+        IDWriteFont3 *This);
+
+    /*** IDWriteFont3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFont3_CreateFontFace)(
+        IDWriteFont3 *This,
+        IDWriteFontFace3 **fontface);
+
+    WINBOOL (STDMETHODCALLTYPE *Equals)(
+        IDWriteFont3 *This,
+        IDWriteFont *font);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFont3 *This,
+        IDWriteFontFaceReference **reference);
+
+    WINBOOL (STDMETHODCALLTYPE *IDWriteFont3_HasCharacter)(
+        IDWriteFont3 *This,
+        UINT32 character);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetLocality)(
+        IDWriteFont3 *This);
+
+    END_INTERFACE
+} IDWriteFont3Vtbl;
+
+interface IDWriteFont3 {
+    CONST_VTBL IDWriteFont3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFont3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFont3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFont3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFont methods ***/
+#define IDWriteFont3_GetFontFamily(This,family) (This)->lpVtbl->GetFontFamily(This,family)
+#define IDWriteFont3_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFont3_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFont3_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFont3_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFont3_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFont3_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFont3_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+/*** IDWriteFont1 methods ***/
+#define IDWriteFont3_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFont1_GetMetrics(This,metrics)
+#define IDWriteFont3_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
+#define IDWriteFont3_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFont3_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+/*** IDWriteFont2 methods ***/
+#define IDWriteFont3_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
+/*** IDWriteFont3 methods ***/
+#define IDWriteFont3_CreateFontFace(This,fontface) (This)->lpVtbl->IDWriteFont3_CreateFontFace(This,fontface)
+#define IDWriteFont3_Equals(This,font) (This)->lpVtbl->Equals(This,font)
+#define IDWriteFont3_GetFontFaceReference(This,reference) (This)->lpVtbl->GetFontFaceReference(This,reference)
+#define IDWriteFont3_HasCharacter(This,character) (This)->lpVtbl->IDWriteFont3_HasCharacter(This,character)
+#define IDWriteFont3_GetLocality(This) (This)->lpVtbl->GetLocality(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFont3_QueryInterface(IDWriteFont3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFont3_AddRef(IDWriteFont3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFont3_Release(IDWriteFont3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFont methods ***/
+static FORCEINLINE HRESULT IDWriteFont3_GetFontFamily(IDWriteFont3* This,IDWriteFontFamily **family) {
+    return This->lpVtbl->GetFontFamily(This,family);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFont3_GetWeight(IDWriteFont3* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFont3_GetStretch(IDWriteFont3* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFont3_GetStyle(IDWriteFont3* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE WINBOOL IDWriteFont3_IsSymbolFont(IDWriteFont3* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFont3_GetFaceNames(IDWriteFont3* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFont3_GetInformationalStrings(IDWriteFont3* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFont3_GetSimulations(IDWriteFont3* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+/*** IDWriteFont1 methods ***/
+static FORCEINLINE void IDWriteFont3_GetMetrics(IDWriteFont3* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFont1_GetMetrics(This,metrics);
+}
+static FORCEINLINE void IDWriteFont3_GetPanose(IDWriteFont3* This,DWRITE_PANOSE *panose) {
+    This->lpVtbl->GetPanose(This,panose);
+}
+static FORCEINLINE HRESULT IDWriteFont3_GetUnicodeRanges(IDWriteFont3* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFont3_IsMonospacedFont(IDWriteFont3* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+/*** IDWriteFont2 methods ***/
+static FORCEINLINE WINBOOL IDWriteFont3_IsColorFont(IDWriteFont3* This) {
+    return This->lpVtbl->IsColorFont(This);
+}
+/*** IDWriteFont3 methods ***/
+static FORCEINLINE HRESULT IDWriteFont3_CreateFontFace(IDWriteFont3* This,IDWriteFontFace3 **fontface) {
+    return This->lpVtbl->IDWriteFont3_CreateFontFace(This,fontface);
+}
+static FORCEINLINE WINBOOL IDWriteFont3_Equals(IDWriteFont3* This,IDWriteFont *font) {
+    return This->lpVtbl->Equals(This,font);
+}
+static FORCEINLINE HRESULT IDWriteFont3_GetFontFaceReference(IDWriteFont3* This,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,reference);
+}
+static FORCEINLINE WINBOOL IDWriteFont3_HasCharacter(IDWriteFont3* This,UINT32 character) {
+    return This->lpVtbl->IDWriteFont3_HasCharacter(This,character);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteFont3_GetLocality(IDWriteFont3* This) {
+    return This->lpVtbl->GetLocality(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFont3_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFamily1 interface
+ */
+#ifndef __IDWriteFontFamily1_INTERFACE_DEFINED__
+#define __IDWriteFontFamily1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFamily1, 0xda20d8ef, 0x812a, 0x4c43, 0x98,0x02, 0x62,0xec,0x4a,0xbd,0x7a,0xdf);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7adf")
+IDWriteFontFamily1 : public IDWriteFontFamily
+{
+    virtual DWRITE_LOCALITY STDMETHODCALLTYPE GetFontLocality(
+        UINT32 index) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFont(
+        UINT32 index,
+        IDWriteFont3 **font) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFaceReference(
+        UINT32 index,
+        IDWriteFontFaceReference **reference) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFamily1, 0xda20d8ef, 0x812a, 0x4c43, 0x98,0x02, 0x62,0xec,0x4a,0xbd,0x7a,0xdf)
+#endif
+#else
+typedef struct IDWriteFontFamily1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFamily1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFamily1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFamily1 *This);
+
+    /*** IDWriteFontList methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteFontFamily1 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontFamily1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFont)(
+        IDWriteFontFamily1 *This,
+        UINT32 index,
+        IDWriteFont **font);
+
+    /*** IDWriteFontFamily methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
+        IDWriteFontFamily1 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetFirstMatchingFont)(
+        IDWriteFontFamily1 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFont **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontFamily1 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontList **fonts);
+
+    /*** IDWriteFontFamily1 methods ***/
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontFamily1 *This,
+        UINT32 index);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFamily1_GetFont)(
+        IDWriteFontFamily1 *This,
+        UINT32 index,
+        IDWriteFont3 **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontFamily1 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    END_INTERFACE
+} IDWriteFontFamily1Vtbl;
+
+interface IDWriteFontFamily1 {
+    CONST_VTBL IDWriteFontFamily1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFamily1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFamily1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFamily1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontList methods ***/
+#define IDWriteFontFamily1_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteFontFamily1_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+/*** IDWriteFontFamily methods ***/
+#define IDWriteFontFamily1_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
+#define IDWriteFontFamily1_GetFirstMatchingFont(This,weight,stretch,style,font) (This)->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,font)
+#define IDWriteFontFamily1_GetMatchingFonts(This,weight,stretch,style,fonts) (This)->lpVtbl->GetMatchingFonts(This,weight,stretch,style,fonts)
+/*** IDWriteFontFamily1 methods ***/
+#define IDWriteFontFamily1_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+#define IDWriteFontFamily1_GetFont(This,index,font) (This)->lpVtbl->IDWriteFontFamily1_GetFont(This,index,font)
+#define IDWriteFontFamily1_GetFontFaceReference(This,index,reference) (This)->lpVtbl->GetFontFaceReference(This,index,reference)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily1_QueryInterface(IDWriteFontFamily1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFamily1_AddRef(IDWriteFontFamily1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFamily1_Release(IDWriteFontFamily1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontList methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily1_GetFontCollection(IDWriteFontFamily1* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteFontFamily1_GetFontCount(IDWriteFontFamily1* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+/*** IDWriteFontFamily methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily1_GetFamilyNames(IDWriteFontFamily1* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFamilyNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily1_GetFirstMatchingFont(IDWriteFontFamily1* This,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFont **font) {
+    return This->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,font);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily1_GetMatchingFonts(IDWriteFontFamily1* This,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFontList **fonts) {
+    return This->lpVtbl->GetMatchingFonts(This,weight,stretch,style,fonts);
+}
+/*** IDWriteFontFamily1 methods ***/
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontFamily1_GetFontLocality(IDWriteFontFamily1* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily1_GetFont(IDWriteFontFamily1* This,UINT32 index,IDWriteFont3 **font) {
+    return This->lpVtbl->IDWriteFontFamily1_GetFont(This,index,font);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily1_GetFontFaceReference(IDWriteFontFamily1* This,UINT32 index,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,index,reference);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFamily1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFamily2 interface
+ */
+#ifndef __IDWriteFontFamily2_INTERFACE_DEFINED__
+#define __IDWriteFontFamily2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFamily2, 0x3ed49e77, 0xa398, 0x4261, 0xb9,0xcf, 0xc1,0x26,0xc2,0x13,0x1e,0xf3);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("3ed49e77-a398-4261-b9cf-c126c2131ef3")
+IDWriteFontFamily2 : public IDWriteFontFamily1
+{
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts(
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontSet(
+        IDWriteFontSet1 **fontset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFamily2, 0x3ed49e77, 0xa398, 0x4261, 0xb9,0xcf, 0xc1,0x26,0xc2,0x13,0x1e,0xf3)
+#endif
+#else
+typedef struct IDWriteFontFamily2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFamily2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFamily2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFamily2 *This);
+
+    /*** IDWriteFontList methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteFontFamily2 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontFamily2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFont)(
+        IDWriteFontFamily2 *This,
+        UINT32 index,
+        IDWriteFont **font);
+
+    /*** IDWriteFontFamily methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
+        IDWriteFontFamily2 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetFirstMatchingFont)(
+        IDWriteFontFamily2 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFont **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontFamily2 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontList **fonts);
+
+    /*** IDWriteFontFamily1 methods ***/
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontFamily2 *This,
+        UINT32 index);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFamily1_GetFont)(
+        IDWriteFontFamily2 *This,
+        UINT32 index,
+        IDWriteFont3 **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontFamily2 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    /*** IDWriteFontFamily2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFamily2_GetMatchingFonts)(
+        IDWriteFontFamily2 *This,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontSet)(
+        IDWriteFontFamily2 *This,
+        IDWriteFontSet1 **fontset);
+
+    END_INTERFACE
+} IDWriteFontFamily2Vtbl;
+
+interface IDWriteFontFamily2 {
+    CONST_VTBL IDWriteFontFamily2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFamily2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFamily2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFamily2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontList methods ***/
+#define IDWriteFontFamily2_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteFontFamily2_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+/*** IDWriteFontFamily methods ***/
+#define IDWriteFontFamily2_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
+#define IDWriteFontFamily2_GetFirstMatchingFont(This,weight,stretch,style,font) (This)->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,font)
+/*** IDWriteFontFamily1 methods ***/
+#define IDWriteFontFamily2_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+#define IDWriteFontFamily2_GetFont(This,index,font) (This)->lpVtbl->IDWriteFontFamily1_GetFont(This,index,font)
+#define IDWriteFontFamily2_GetFontFaceReference(This,index,reference) (This)->lpVtbl->GetFontFaceReference(This,index,reference)
+/*** IDWriteFontFamily2 methods ***/
+#define IDWriteFontFamily2_GetMatchingFonts(This,axis_values,num_values,fontlist) (This)->lpVtbl->IDWriteFontFamily2_GetMatchingFonts(This,axis_values,num_values,fontlist)
+#define IDWriteFontFamily2_GetFontSet(This,fontset) (This)->lpVtbl->GetFontSet(This,fontset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily2_QueryInterface(IDWriteFontFamily2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFamily2_AddRef(IDWriteFontFamily2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFamily2_Release(IDWriteFontFamily2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontList methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetFontCollection(IDWriteFontFamily2* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteFontFamily2_GetFontCount(IDWriteFontFamily2* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+/*** IDWriteFontFamily methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetFamilyNames(IDWriteFontFamily2* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFamilyNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetFirstMatchingFont(IDWriteFontFamily2* This,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFont **font) {
+    return This->lpVtbl->GetFirstMatchingFont(This,weight,stretch,style,font);
+}
+/*** IDWriteFontFamily1 methods ***/
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontFamily2_GetFontLocality(IDWriteFontFamily2* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetFont(IDWriteFontFamily2* This,UINT32 index,IDWriteFont3 **font) {
+    return This->lpVtbl->IDWriteFontFamily1_GetFont(This,index,font);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetFontFaceReference(IDWriteFontFamily2* This,UINT32 index,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,index,reference);
+}
+/*** IDWriteFontFamily2 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetMatchingFonts(IDWriteFontFamily2* This,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontList2 **fontlist) {
+    return This->lpVtbl->IDWriteFontFamily2_GetMatchingFonts(This,axis_values,num_values,fontlist);
+}
+static FORCEINLINE HRESULT IDWriteFontFamily2_GetFontSet(IDWriteFontFamily2* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFontSet(This,fontset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFamily2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontCollection1 interface
+ */
+#ifndef __IDWriteFontCollection1_INTERFACE_DEFINED__
+#define __IDWriteFontCollection1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontCollection1, 0x53585141, 0xd9f8, 0x4095, 0x83,0x21, 0xd7,0x3c,0xf6,0xbd,0x11,0x6c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("53585141-d9f8-4095-8321-d73cf6bd116c")
+IDWriteFontCollection1 : public IDWriteFontCollection
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontSet(
+        IDWriteFontSet **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamily(
+        UINT32 index,
+        IDWriteFontFamily1 **family) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontCollection1, 0x53585141, 0xd9f8, 0x4095, 0x83,0x21, 0xd7,0x3c,0xf6,0xbd,0x11,0x6c)
+#endif
+#else
+typedef struct IDWriteFontCollection1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontCollection1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontCollection1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontCollection1 *This);
+
+    /*** IDWriteFontCollection methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyCount)(
+        IDWriteFontCollection1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFontCollection1 *This,
+        UINT32 index,
+        IDWriteFontFamily **family);
+
+    HRESULT (STDMETHODCALLTYPE *FindFamilyName)(
+        IDWriteFontCollection1 *This,
+        const WCHAR *name,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFromFontFace)(
+        IDWriteFontCollection1 *This,
+        IDWriteFontFace *face,
+        IDWriteFont **font);
+
+    /*** IDWriteFontCollection1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontSet)(
+        IDWriteFontCollection1 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection1_GetFontFamily)(
+        IDWriteFontCollection1 *This,
+        UINT32 index,
+        IDWriteFontFamily1 **family);
+
+    END_INTERFACE
+} IDWriteFontCollection1Vtbl;
+
+interface IDWriteFontCollection1 {
+    CONST_VTBL IDWriteFontCollection1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontCollection1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontCollection1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontCollection1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontCollection methods ***/
+#define IDWriteFontCollection1_GetFontFamilyCount(This) (This)->lpVtbl->GetFontFamilyCount(This)
+#define IDWriteFontCollection1_FindFamilyName(This,name,index,exists) (This)->lpVtbl->FindFamilyName(This,name,index,exists)
+#define IDWriteFontCollection1_GetFontFromFontFace(This,face,font) (This)->lpVtbl->GetFontFromFontFace(This,face,font)
+/*** IDWriteFontCollection1 methods ***/
+#define IDWriteFontCollection1_GetFontSet(This,fontset) (This)->lpVtbl->GetFontSet(This,fontset)
+#define IDWriteFontCollection1_GetFontFamily(This,index,family) (This)->lpVtbl->IDWriteFontCollection1_GetFontFamily(This,index,family)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection1_QueryInterface(IDWriteFontCollection1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontCollection1_AddRef(IDWriteFontCollection1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontCollection1_Release(IDWriteFontCollection1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontCollection methods ***/
+static FORCEINLINE UINT32 IDWriteFontCollection1_GetFontFamilyCount(IDWriteFontCollection1* This) {
+    return This->lpVtbl->GetFontFamilyCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection1_FindFamilyName(IDWriteFontCollection1* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFamilyName(This,name,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection1_GetFontFromFontFace(IDWriteFontCollection1* This,IDWriteFontFace *face,IDWriteFont **font) {
+    return This->lpVtbl->GetFontFromFontFace(This,face,font);
+}
+/*** IDWriteFontCollection1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection1_GetFontSet(IDWriteFontCollection1* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection1_GetFontFamily(IDWriteFontCollection1* This,UINT32 index,IDWriteFontFamily1 **family) {
+    return This->lpVtbl->IDWriteFontCollection1_GetFontFamily(This,index,family);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontCollection1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontCollection2 interface
+ */
+#ifndef __IDWriteFontCollection2_INTERFACE_DEFINED__
+#define __IDWriteFontCollection2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontCollection2, 0x514039c6, 0x4617, 0x4064, 0xbf,0x8b, 0x92,0xea,0x83,0xe5,0x06,0xe0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("514039c6-4617-4064-bf8b-92ea83e506e0")
+IDWriteFontCollection2 : public IDWriteFontCollection1
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontFamily(
+        UINT32 index,
+        IDWriteFontFamily2 **family) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts(
+        const WCHAR *familyname,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist) = 0;
+
+    virtual DWRITE_FONT_FAMILY_MODEL STDMETHODCALLTYPE GetFontFamilyModel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontSet(
+        IDWriteFontSet1 **fontset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontCollection2, 0x514039c6, 0x4617, 0x4064, 0xbf,0x8b, 0x92,0xea,0x83,0xe5,0x06,0xe0)
+#endif
+#else
+typedef struct IDWriteFontCollection2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontCollection2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontCollection2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontCollection2 *This);
+
+    /*** IDWriteFontCollection methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyCount)(
+        IDWriteFontCollection2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFontCollection2 *This,
+        UINT32 index,
+        IDWriteFontFamily **family);
+
+    HRESULT (STDMETHODCALLTYPE *FindFamilyName)(
+        IDWriteFontCollection2 *This,
+        const WCHAR *name,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFromFontFace)(
+        IDWriteFontCollection2 *This,
+        IDWriteFontFace *face,
+        IDWriteFont **font);
+
+    /*** IDWriteFontCollection1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontSet)(
+        IDWriteFontCollection2 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection1_GetFontFamily)(
+        IDWriteFontCollection2 *This,
+        UINT32 index,
+        IDWriteFontFamily1 **family);
+
+    /*** IDWriteFontCollection2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection2_GetFontFamily)(
+        IDWriteFontCollection2 *This,
+        UINT32 index,
+        IDWriteFontFamily2 **family);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontCollection2 *This,
+        const WCHAR *familyname,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist);
+
+    DWRITE_FONT_FAMILY_MODEL (STDMETHODCALLTYPE *GetFontFamilyModel)(
+        IDWriteFontCollection2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection2_GetFontSet)(
+        IDWriteFontCollection2 *This,
+        IDWriteFontSet1 **fontset);
+
+    END_INTERFACE
+} IDWriteFontCollection2Vtbl;
+
+interface IDWriteFontCollection2 {
+    CONST_VTBL IDWriteFontCollection2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontCollection2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontCollection methods ***/
+#define IDWriteFontCollection2_GetFontFamilyCount(This) (This)->lpVtbl->GetFontFamilyCount(This)
+#define IDWriteFontCollection2_FindFamilyName(This,name,index,exists) (This)->lpVtbl->FindFamilyName(This,name,index,exists)
+#define IDWriteFontCollection2_GetFontFromFontFace(This,face,font) (This)->lpVtbl->GetFontFromFontFace(This,face,font)
+/*** IDWriteFontCollection1 methods ***/
+/*** IDWriteFontCollection2 methods ***/
+#define IDWriteFontCollection2_GetFontFamily(This,index,family) (This)->lpVtbl->IDWriteFontCollection2_GetFontFamily(This,index,family)
+#define IDWriteFontCollection2_GetMatchingFonts(This,familyname,axis_values,num_values,fontlist) (This)->lpVtbl->GetMatchingFonts(This,familyname,axis_values,num_values,fontlist)
+#define IDWriteFontCollection2_GetFontFamilyModel(This) (This)->lpVtbl->GetFontFamilyModel(This)
+#define IDWriteFontCollection2_GetFontSet(This,fontset) (This)->lpVtbl->IDWriteFontCollection2_GetFontSet(This,fontset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection2_QueryInterface(IDWriteFontCollection2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontCollection2_AddRef(IDWriteFontCollection2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontCollection2_Release(IDWriteFontCollection2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontCollection methods ***/
+static FORCEINLINE UINT32 IDWriteFontCollection2_GetFontFamilyCount(IDWriteFontCollection2* This) {
+    return This->lpVtbl->GetFontFamilyCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection2_FindFamilyName(IDWriteFontCollection2* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFamilyName(This,name,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection2_GetFontFromFontFace(IDWriteFontCollection2* This,IDWriteFontFace *face,IDWriteFont **font) {
+    return This->lpVtbl->GetFontFromFontFace(This,face,font);
+}
+/*** IDWriteFontCollection1 methods ***/
+/*** IDWriteFontCollection2 methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection2_GetFontFamily(IDWriteFontCollection2* This,UINT32 index,IDWriteFontFamily2 **family) {
+    return This->lpVtbl->IDWriteFontCollection2_GetFontFamily(This,index,family);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection2_GetMatchingFonts(IDWriteFontCollection2* This,const WCHAR *familyname,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontList2 **fontlist) {
+    return This->lpVtbl->GetMatchingFonts(This,familyname,axis_values,num_values,fontlist);
+}
+static FORCEINLINE DWRITE_FONT_FAMILY_MODEL IDWriteFontCollection2_GetFontFamilyModel(IDWriteFontCollection2* This) {
+    return This->lpVtbl->GetFontFamilyModel(This);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection2_GetFontSet(IDWriteFontCollection2* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->IDWriteFontCollection2_GetFontSet(This,fontset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontCollection2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontCollection3 interface
+ */
+#ifndef __IDWriteFontCollection3_INTERFACE_DEFINED__
+#define __IDWriteFontCollection3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontCollection3, 0xa4d055a6, 0xf9e3, 0x4e25, 0x93,0xb7, 0x9e,0x30,0x9f,0x3a,0xf8,0xe9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a4d055a6-f9e3-4e25-93b7-9e309f3af8e9")
+IDWriteFontCollection3 : public IDWriteFontCollection2
+{
+    virtual HANDLE STDMETHODCALLTYPE GetExpirationEvent(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontCollection3, 0xa4d055a6, 0xf9e3, 0x4e25, 0x93,0xb7, 0x9e,0x30,0x9f,0x3a,0xf8,0xe9)
+#endif
+#else
+typedef struct IDWriteFontCollection3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontCollection3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontCollection3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontCollection3 *This);
+
+    /*** IDWriteFontCollection methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyCount)(
+        IDWriteFontCollection3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamily)(
+        IDWriteFontCollection3 *This,
+        UINT32 index,
+        IDWriteFontFamily **family);
+
+    HRESULT (STDMETHODCALLTYPE *FindFamilyName)(
+        IDWriteFontCollection3 *This,
+        const WCHAR *name,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFromFontFace)(
+        IDWriteFontCollection3 *This,
+        IDWriteFontFace *face,
+        IDWriteFont **font);
+
+    /*** IDWriteFontCollection1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontSet)(
+        IDWriteFontCollection3 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection1_GetFontFamily)(
+        IDWriteFontCollection3 *This,
+        UINT32 index,
+        IDWriteFontFamily1 **family);
+
+    /*** IDWriteFontCollection2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection2_GetFontFamily)(
+        IDWriteFontCollection3 *This,
+        UINT32 index,
+        IDWriteFontFamily2 **family);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontCollection3 *This,
+        const WCHAR *familyname,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist);
+
+    DWRITE_FONT_FAMILY_MODEL (STDMETHODCALLTYPE *GetFontFamilyModel)(
+        IDWriteFontCollection3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontCollection2_GetFontSet)(
+        IDWriteFontCollection3 *This,
+        IDWriteFontSet1 **fontset);
+
+    /*** IDWriteFontCollection3 methods ***/
+    HANDLE (STDMETHODCALLTYPE *GetExpirationEvent)(
+        IDWriteFontCollection3 *This);
+
+    END_INTERFACE
+} IDWriteFontCollection3Vtbl;
+
+interface IDWriteFontCollection3 {
+    CONST_VTBL IDWriteFontCollection3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontCollection3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontCollection3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontCollection3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontCollection methods ***/
+#define IDWriteFontCollection3_GetFontFamilyCount(This) (This)->lpVtbl->GetFontFamilyCount(This)
+#define IDWriteFontCollection3_FindFamilyName(This,name,index,exists) (This)->lpVtbl->FindFamilyName(This,name,index,exists)
+#define IDWriteFontCollection3_GetFontFromFontFace(This,face,font) (This)->lpVtbl->GetFontFromFontFace(This,face,font)
+/*** IDWriteFontCollection1 methods ***/
+/*** IDWriteFontCollection2 methods ***/
+#define IDWriteFontCollection3_GetFontFamily(This,index,family) (This)->lpVtbl->IDWriteFontCollection2_GetFontFamily(This,index,family)
+#define IDWriteFontCollection3_GetMatchingFonts(This,familyname,axis_values,num_values,fontlist) (This)->lpVtbl->GetMatchingFonts(This,familyname,axis_values,num_values,fontlist)
+#define IDWriteFontCollection3_GetFontFamilyModel(This) (This)->lpVtbl->GetFontFamilyModel(This)
+#define IDWriteFontCollection3_GetFontSet(This,fontset) (This)->lpVtbl->IDWriteFontCollection2_GetFontSet(This,fontset)
+/*** IDWriteFontCollection3 methods ***/
+#define IDWriteFontCollection3_GetExpirationEvent(This) (This)->lpVtbl->GetExpirationEvent(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection3_QueryInterface(IDWriteFontCollection3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontCollection3_AddRef(IDWriteFontCollection3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontCollection3_Release(IDWriteFontCollection3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontCollection methods ***/
+static FORCEINLINE UINT32 IDWriteFontCollection3_GetFontFamilyCount(IDWriteFontCollection3* This) {
+    return This->lpVtbl->GetFontFamilyCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection3_FindFamilyName(IDWriteFontCollection3* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFamilyName(This,name,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection3_GetFontFromFontFace(IDWriteFontCollection3* This,IDWriteFontFace *face,IDWriteFont **font) {
+    return This->lpVtbl->GetFontFromFontFace(This,face,font);
+}
+/*** IDWriteFontCollection1 methods ***/
+/*** IDWriteFontCollection2 methods ***/
+static FORCEINLINE HRESULT IDWriteFontCollection3_GetFontFamily(IDWriteFontCollection3* This,UINT32 index,IDWriteFontFamily2 **family) {
+    return This->lpVtbl->IDWriteFontCollection2_GetFontFamily(This,index,family);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection3_GetMatchingFonts(IDWriteFontCollection3* This,const WCHAR *familyname,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontList2 **fontlist) {
+    return This->lpVtbl->GetMatchingFonts(This,familyname,axis_values,num_values,fontlist);
+}
+static FORCEINLINE DWRITE_FONT_FAMILY_MODEL IDWriteFontCollection3_GetFontFamilyModel(IDWriteFontCollection3* This) {
+    return This->lpVtbl->GetFontFamilyModel(This);
+}
+static FORCEINLINE HRESULT IDWriteFontCollection3_GetFontSet(IDWriteFontCollection3* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->IDWriteFontCollection2_GetFontSet(This,fontset);
+}
+/*** IDWriteFontCollection3 methods ***/
+static FORCEINLINE HANDLE IDWriteFontCollection3_GetExpirationEvent(IDWriteFontCollection3* This) {
+    return This->lpVtbl->GetExpirationEvent(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontCollection3_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFaceReference interface
+ */
+#ifndef __IDWriteFontFaceReference_INTERFACE_DEFINED__
+#define __IDWriteFontFaceReference_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFaceReference, 0x5e7fa7ca, 0xdde3, 0x424c, 0x89,0xf0, 0x9f,0xcd,0x6f,0xed,0x58,0xcd);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5e7fa7ca-dde3-424c-89f0-9fcd6fed58cd")
+IDWriteFontFaceReference : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        IDWriteFontFace3 **fontface) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFaceWithSimulations(
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFace3 **fontface) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE Equals(
+        IDWriteFontFaceReference *reference) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontFaceIndex(
+        ) = 0;
+
+    virtual DWRITE_FONT_SIMULATIONS STDMETHODCALLTYPE GetSimulations(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFile(
+        IDWriteFontFile **fontfile) = 0;
+
+    virtual UINT64 STDMETHODCALLTYPE GetLocalFileSize(
+        ) = 0;
+
+    virtual UINT64 STDMETHODCALLTYPE GetFileSize(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileTime(
+        FILETIME *writetime) = 0;
+
+    virtual DWRITE_LOCALITY STDMETHODCALLTYPE GetLocality(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnqueueFontDownloadRequest(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnqueueCharacterDownloadRequest(
+        const WCHAR *chars,
+        UINT32 count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnqueueGlyphDownloadRequest(
+        const UINT16 *glyphs,
+        UINT32 count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnqueueFileFragmentDownloadRequest(
+        UINT64 offset,
+        UINT64 size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFaceReference, 0x5e7fa7ca, 0xdde3, 0x424c, 0x89,0xf0, 0x9f,0xcd,0x6f,0xed,0x58,0xcd)
+#endif
+#else
+typedef struct IDWriteFontFaceReferenceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFaceReference *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFaceReference *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFaceReference *This);
+
+    /*** IDWriteFontFaceReference methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFontFaceReference *This,
+        IDWriteFontFace3 **fontface);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceWithSimulations)(
+        IDWriteFontFaceReference *This,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFace3 **fontface);
+
+    WINBOOL (STDMETHODCALLTYPE *Equals)(
+        IDWriteFontFaceReference *This,
+        IDWriteFontFaceReference *reference);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFaceIndex)(
+        IDWriteFontFaceReference *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFaceReference *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFile)(
+        IDWriteFontFaceReference *This,
+        IDWriteFontFile **fontfile);
+
+    UINT64 (STDMETHODCALLTYPE *GetLocalFileSize)(
+        IDWriteFontFaceReference *This);
+
+    UINT64 (STDMETHODCALLTYPE *GetFileSize)(
+        IDWriteFontFaceReference *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileTime)(
+        IDWriteFontFaceReference *This,
+        FILETIME *writetime);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetLocality)(
+        IDWriteFontFaceReference *This);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueFontDownloadRequest)(
+        IDWriteFontFaceReference *This);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueCharacterDownloadRequest)(
+        IDWriteFontFaceReference *This,
+        const WCHAR *chars,
+        UINT32 count);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueGlyphDownloadRequest)(
+        IDWriteFontFaceReference *This,
+        const UINT16 *glyphs,
+        UINT32 count);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueFileFragmentDownloadRequest)(
+        IDWriteFontFaceReference *This,
+        UINT64 offset,
+        UINT64 size);
+
+    END_INTERFACE
+} IDWriteFontFaceReferenceVtbl;
+
+interface IDWriteFontFaceReference {
+    CONST_VTBL IDWriteFontFaceReferenceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFaceReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFaceReference_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFaceReference_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFaceReference methods ***/
+#define IDWriteFontFaceReference_CreateFontFace(This,fontface) (This)->lpVtbl->CreateFontFace(This,fontface)
+#define IDWriteFontFaceReference_CreateFontFaceWithSimulations(This,simulations,fontface) (This)->lpVtbl->CreateFontFaceWithSimulations(This,simulations,fontface)
+#define IDWriteFontFaceReference_Equals(This,reference) (This)->lpVtbl->Equals(This,reference)
+#define IDWriteFontFaceReference_GetFontFaceIndex(This) (This)->lpVtbl->GetFontFaceIndex(This)
+#define IDWriteFontFaceReference_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFaceReference_GetFontFile(This,fontfile) (This)->lpVtbl->GetFontFile(This,fontfile)
+#define IDWriteFontFaceReference_GetLocalFileSize(This) (This)->lpVtbl->GetLocalFileSize(This)
+#define IDWriteFontFaceReference_GetFileSize(This) (This)->lpVtbl->GetFileSize(This)
+#define IDWriteFontFaceReference_GetFileTime(This,writetime) (This)->lpVtbl->GetFileTime(This,writetime)
+#define IDWriteFontFaceReference_GetLocality(This) (This)->lpVtbl->GetLocality(This)
+#define IDWriteFontFaceReference_EnqueueFontDownloadRequest(This) (This)->lpVtbl->EnqueueFontDownloadRequest(This)
+#define IDWriteFontFaceReference_EnqueueCharacterDownloadRequest(This,chars,count) (This)->lpVtbl->EnqueueCharacterDownloadRequest(This,chars,count)
+#define IDWriteFontFaceReference_EnqueueGlyphDownloadRequest(This,glyphs,count) (This)->lpVtbl->EnqueueGlyphDownloadRequest(This,glyphs,count)
+#define IDWriteFontFaceReference_EnqueueFileFragmentDownloadRequest(This,offset,size) (This)->lpVtbl->EnqueueFileFragmentDownloadRequest(This,offset,size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFaceReference_QueryInterface(IDWriteFontFaceReference* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFaceReference_AddRef(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFaceReference_Release(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFaceReference methods ***/
+static FORCEINLINE HRESULT IDWriteFontFaceReference_CreateFontFace(IDWriteFontFaceReference* This,IDWriteFontFace3 **fontface) {
+    return This->lpVtbl->CreateFontFace(This,fontface);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_CreateFontFaceWithSimulations(IDWriteFontFaceReference* This,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFace3 **fontface) {
+    return This->lpVtbl->CreateFontFaceWithSimulations(This,simulations,fontface);
+}
+static FORCEINLINE WINBOOL IDWriteFontFaceReference_Equals(IDWriteFontFaceReference* This,IDWriteFontFaceReference *reference) {
+    return This->lpVtbl->Equals(This,reference);
+}
+static FORCEINLINE UINT32 IDWriteFontFaceReference_GetFontFaceIndex(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->GetFontFaceIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFaceReference_GetSimulations(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_GetFontFile(IDWriteFontFaceReference* This,IDWriteFontFile **fontfile) {
+    return This->lpVtbl->GetFontFile(This,fontfile);
+}
+static FORCEINLINE UINT64 IDWriteFontFaceReference_GetLocalFileSize(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->GetLocalFileSize(This);
+}
+static FORCEINLINE UINT64 IDWriteFontFaceReference_GetFileSize(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->GetFileSize(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_GetFileTime(IDWriteFontFaceReference* This,FILETIME *writetime) {
+    return This->lpVtbl->GetFileTime(This,writetime);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontFaceReference_GetLocality(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->GetLocality(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_EnqueueFontDownloadRequest(IDWriteFontFaceReference* This) {
+    return This->lpVtbl->EnqueueFontDownloadRequest(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_EnqueueCharacterDownloadRequest(IDWriteFontFaceReference* This,const WCHAR *chars,UINT32 count) {
+    return This->lpVtbl->EnqueueCharacterDownloadRequest(This,chars,count);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_EnqueueGlyphDownloadRequest(IDWriteFontFaceReference* This,const UINT16 *glyphs,UINT32 count) {
+    return This->lpVtbl->EnqueueGlyphDownloadRequest(This,glyphs,count);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference_EnqueueFileFragmentDownloadRequest(IDWriteFontFaceReference* This,UINT64 offset,UINT64 size) {
+    return This->lpVtbl->EnqueueFileFragmentDownloadRequest(This,offset,size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFaceReference_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFaceReference1 interface
+ */
+#ifndef __IDWriteFontFaceReference1_INTERFACE_DEFINED__
+#define __IDWriteFontFaceReference1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFaceReference1, 0xc081fe77, 0x2fd1, 0x41ac, 0xa5,0xa3, 0x34,0x98,0x3c,0x4b,0xa6,0x1a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c081fe77-2fd1-41ac-a5a3-34983c4ba61a")
+IDWriteFontFaceReference1 : public IDWriteFontFaceReference
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFace(
+        IDWriteFontFace5 **fontface) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontAxisValueCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFaceReference1, 0xc081fe77, 0x2fd1, 0x41ac, 0xa5,0xa3, 0x34,0x98,0x3c,0x4b,0xa6,0x1a)
+#endif
+#else
+typedef struct IDWriteFontFaceReference1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFaceReference1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFaceReference1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFaceReference1 *This);
+
+    /*** IDWriteFontFaceReference methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFontFaceReference1 *This,
+        IDWriteFontFace3 **fontface);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceWithSimulations)(
+        IDWriteFontFaceReference1 *This,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFace3 **fontface);
+
+    WINBOOL (STDMETHODCALLTYPE *Equals)(
+        IDWriteFontFaceReference1 *This,
+        IDWriteFontFaceReference *reference);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFaceIndex)(
+        IDWriteFontFaceReference1 *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFaceReference1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFile)(
+        IDWriteFontFaceReference1 *This,
+        IDWriteFontFile **fontfile);
+
+    UINT64 (STDMETHODCALLTYPE *GetLocalFileSize)(
+        IDWriteFontFaceReference1 *This);
+
+    UINT64 (STDMETHODCALLTYPE *GetFileSize)(
+        IDWriteFontFaceReference1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileTime)(
+        IDWriteFontFaceReference1 *This,
+        FILETIME *writetime);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetLocality)(
+        IDWriteFontFaceReference1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueFontDownloadRequest)(
+        IDWriteFontFaceReference1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueCharacterDownloadRequest)(
+        IDWriteFontFaceReference1 *This,
+        const WCHAR *chars,
+        UINT32 count);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueGlyphDownloadRequest)(
+        IDWriteFontFaceReference1 *This,
+        const UINT16 *glyphs,
+        UINT32 count);
+
+    HRESULT (STDMETHODCALLTYPE *EnqueueFileFragmentDownloadRequest)(
+        IDWriteFontFaceReference1 *This,
+        UINT64 offset,
+        UINT64 size);
+
+    /*** IDWriteFontFaceReference1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFaceReference1_CreateFontFace)(
+        IDWriteFontFaceReference1 *This,
+        IDWriteFontFace5 **fontface);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontAxisValueCount)(
+        IDWriteFontFaceReference1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisValues)(
+        IDWriteFontFaceReference1 *This,
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values);
+
+    END_INTERFACE
+} IDWriteFontFaceReference1Vtbl;
+
+interface IDWriteFontFaceReference1 {
+    CONST_VTBL IDWriteFontFaceReference1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFaceReference1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFaceReference1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFaceReference1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFaceReference methods ***/
+#define IDWriteFontFaceReference1_CreateFontFaceWithSimulations(This,simulations,fontface) (This)->lpVtbl->CreateFontFaceWithSimulations(This,simulations,fontface)
+#define IDWriteFontFaceReference1_Equals(This,reference) (This)->lpVtbl->Equals(This,reference)
+#define IDWriteFontFaceReference1_GetFontFaceIndex(This) (This)->lpVtbl->GetFontFaceIndex(This)
+#define IDWriteFontFaceReference1_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFaceReference1_GetFontFile(This,fontfile) (This)->lpVtbl->GetFontFile(This,fontfile)
+#define IDWriteFontFaceReference1_GetLocalFileSize(This) (This)->lpVtbl->GetLocalFileSize(This)
+#define IDWriteFontFaceReference1_GetFileSize(This) (This)->lpVtbl->GetFileSize(This)
+#define IDWriteFontFaceReference1_GetFileTime(This,writetime) (This)->lpVtbl->GetFileTime(This,writetime)
+#define IDWriteFontFaceReference1_GetLocality(This) (This)->lpVtbl->GetLocality(This)
+#define IDWriteFontFaceReference1_EnqueueFontDownloadRequest(This) (This)->lpVtbl->EnqueueFontDownloadRequest(This)
+#define IDWriteFontFaceReference1_EnqueueCharacterDownloadRequest(This,chars,count) (This)->lpVtbl->EnqueueCharacterDownloadRequest(This,chars,count)
+#define IDWriteFontFaceReference1_EnqueueGlyphDownloadRequest(This,glyphs,count) (This)->lpVtbl->EnqueueGlyphDownloadRequest(This,glyphs,count)
+#define IDWriteFontFaceReference1_EnqueueFileFragmentDownloadRequest(This,offset,size) (This)->lpVtbl->EnqueueFileFragmentDownloadRequest(This,offset,size)
+/*** IDWriteFontFaceReference1 methods ***/
+#define IDWriteFontFaceReference1_CreateFontFace(This,fontface) (This)->lpVtbl->IDWriteFontFaceReference1_CreateFontFace(This,fontface)
+#define IDWriteFontFaceReference1_GetFontAxisValueCount(This) (This)->lpVtbl->GetFontAxisValueCount(This)
+#define IDWriteFontFaceReference1_GetFontAxisValues(This,values,num_values) (This)->lpVtbl->GetFontAxisValues(This,values,num_values)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_QueryInterface(IDWriteFontFaceReference1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFaceReference1_AddRef(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFaceReference1_Release(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFaceReference methods ***/
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_CreateFontFaceWithSimulations(IDWriteFontFaceReference1* This,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFace3 **fontface) {
+    return This->lpVtbl->CreateFontFaceWithSimulations(This,simulations,fontface);
+}
+static FORCEINLINE WINBOOL IDWriteFontFaceReference1_Equals(IDWriteFontFaceReference1* This,IDWriteFontFaceReference *reference) {
+    return This->lpVtbl->Equals(This,reference);
+}
+static FORCEINLINE UINT32 IDWriteFontFaceReference1_GetFontFaceIndex(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->GetFontFaceIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFaceReference1_GetSimulations(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_GetFontFile(IDWriteFontFaceReference1* This,IDWriteFontFile **fontfile) {
+    return This->lpVtbl->GetFontFile(This,fontfile);
+}
+static FORCEINLINE UINT64 IDWriteFontFaceReference1_GetLocalFileSize(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->GetLocalFileSize(This);
+}
+static FORCEINLINE UINT64 IDWriteFontFaceReference1_GetFileSize(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->GetFileSize(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_GetFileTime(IDWriteFontFaceReference1* This,FILETIME *writetime) {
+    return This->lpVtbl->GetFileTime(This,writetime);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontFaceReference1_GetLocality(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->GetLocality(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_EnqueueFontDownloadRequest(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->EnqueueFontDownloadRequest(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_EnqueueCharacterDownloadRequest(IDWriteFontFaceReference1* This,const WCHAR *chars,UINT32 count) {
+    return This->lpVtbl->EnqueueCharacterDownloadRequest(This,chars,count);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_EnqueueGlyphDownloadRequest(IDWriteFontFaceReference1* This,const UINT16 *glyphs,UINT32 count) {
+    return This->lpVtbl->EnqueueGlyphDownloadRequest(This,glyphs,count);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_EnqueueFileFragmentDownloadRequest(IDWriteFontFaceReference1* This,UINT64 offset,UINT64 size) {
+    return This->lpVtbl->EnqueueFileFragmentDownloadRequest(This,offset,size);
+}
+/*** IDWriteFontFaceReference1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_CreateFontFace(IDWriteFontFaceReference1* This,IDWriteFontFace5 **fontface) {
+    return This->lpVtbl->IDWriteFontFaceReference1_CreateFontFace(This,fontface);
+}
+static FORCEINLINE UINT32 IDWriteFontFaceReference1_GetFontAxisValueCount(IDWriteFontFaceReference1* This) {
+    return This->lpVtbl->GetFontAxisValueCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFaceReference1_GetFontAxisValues(IDWriteFontFaceReference1* This,DWRITE_FONT_AXIS_VALUE *values,UINT32 num_values) {
+    return This->lpVtbl->GetFontAxisValues(This,values,num_values);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFaceReference1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontList1 interface
+ */
+#ifndef __IDWriteFontList1_INTERFACE_DEFINED__
+#define __IDWriteFontList1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontList1, 0xda20d8ef, 0x812a, 0x4c43, 0x98,0x02, 0x62,0xec,0x4a,0xbd,0x7a,0xde);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7ade")
+IDWriteFontList1 : public IDWriteFontList
+{
+    virtual DWRITE_LOCALITY STDMETHODCALLTYPE GetFontLocality(
+        UINT32 index) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFont(
+        UINT32 index,
+        IDWriteFont3 **font) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontFaceReference(
+        UINT32 index,
+        IDWriteFontFaceReference **reference) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontList1, 0xda20d8ef, 0x812a, 0x4c43, 0x98,0x02, 0x62,0xec,0x4a,0xbd,0x7a,0xde)
+#endif
+#else
+typedef struct IDWriteFontList1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontList1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontList1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontList1 *This);
+
+    /*** IDWriteFontList methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteFontList1 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontList1 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFont)(
+        IDWriteFontList1 *This,
+        UINT32 index,
+        IDWriteFont **font);
+
+    /*** IDWriteFontList1 methods ***/
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontList1 *This,
+        UINT32 index);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontList1_GetFont)(
+        IDWriteFontList1 *This,
+        UINT32 index,
+        IDWriteFont3 **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontList1 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    END_INTERFACE
+} IDWriteFontList1Vtbl;
+
+interface IDWriteFontList1 {
+    CONST_VTBL IDWriteFontList1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontList1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontList1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontList1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontList methods ***/
+#define IDWriteFontList1_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteFontList1_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+/*** IDWriteFontList1 methods ***/
+#define IDWriteFontList1_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+#define IDWriteFontList1_GetFont(This,index,font) (This)->lpVtbl->IDWriteFontList1_GetFont(This,index,font)
+#define IDWriteFontList1_GetFontFaceReference(This,index,reference) (This)->lpVtbl->GetFontFaceReference(This,index,reference)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontList1_QueryInterface(IDWriteFontList1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontList1_AddRef(IDWriteFontList1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontList1_Release(IDWriteFontList1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontList methods ***/
+static FORCEINLINE HRESULT IDWriteFontList1_GetFontCollection(IDWriteFontList1* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteFontList1_GetFontCount(IDWriteFontList1* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+/*** IDWriteFontList1 methods ***/
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontList1_GetFontLocality(IDWriteFontList1* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+static FORCEINLINE HRESULT IDWriteFontList1_GetFont(IDWriteFontList1* This,UINT32 index,IDWriteFont3 **font) {
+    return This->lpVtbl->IDWriteFontList1_GetFont(This,index,font);
+}
+static FORCEINLINE HRESULT IDWriteFontList1_GetFontFaceReference(IDWriteFontList1* This,UINT32 index,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,index,reference);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontList1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontList2 interface
+ */
+#ifndef __IDWriteFontList2_INTERFACE_DEFINED__
+#define __IDWriteFontList2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontList2, 0xc0763a34, 0x77af, 0x445a, 0xb7,0x35, 0x08,0xc3,0x7b,0x0a,0x5b,0xf5);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c0763a34-77af-445a-b735-08c37b0a5bf5")
+IDWriteFontList2 : public IDWriteFontList1
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontSet(
+        IDWriteFontSet1 **fontset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontList2, 0xc0763a34, 0x77af, 0x445a, 0xb7,0x35, 0x08,0xc3,0x7b,0x0a,0x5b,0xf5)
+#endif
+#else
+typedef struct IDWriteFontList2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontList2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontList2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontList2 *This);
+
+    /*** IDWriteFontList methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteFontList2 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontList2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFont)(
+        IDWriteFontList2 *This,
+        UINT32 index,
+        IDWriteFont **font);
+
+    /*** IDWriteFontList1 methods ***/
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontList2 *This,
+        UINT32 index);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontList1_GetFont)(
+        IDWriteFontList2 *This,
+        UINT32 index,
+        IDWriteFont3 **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontList2 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    /*** IDWriteFontList2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontSet)(
+        IDWriteFontList2 *This,
+        IDWriteFontSet1 **fontset);
+
+    END_INTERFACE
+} IDWriteFontList2Vtbl;
+
+interface IDWriteFontList2 {
+    CONST_VTBL IDWriteFontList2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontList2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontList2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontList2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontList methods ***/
+#define IDWriteFontList2_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteFontList2_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+/*** IDWriteFontList1 methods ***/
+#define IDWriteFontList2_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+#define IDWriteFontList2_GetFont(This,index,font) (This)->lpVtbl->IDWriteFontList1_GetFont(This,index,font)
+#define IDWriteFontList2_GetFontFaceReference(This,index,reference) (This)->lpVtbl->GetFontFaceReference(This,index,reference)
+/*** IDWriteFontList2 methods ***/
+#define IDWriteFontList2_GetFontSet(This,fontset) (This)->lpVtbl->GetFontSet(This,fontset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontList2_QueryInterface(IDWriteFontList2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontList2_AddRef(IDWriteFontList2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontList2_Release(IDWriteFontList2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontList methods ***/
+static FORCEINLINE HRESULT IDWriteFontList2_GetFontCollection(IDWriteFontList2* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteFontList2_GetFontCount(IDWriteFontList2* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+/*** IDWriteFontList1 methods ***/
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontList2_GetFontLocality(IDWriteFontList2* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+static FORCEINLINE HRESULT IDWriteFontList2_GetFont(IDWriteFontList2* This,UINT32 index,IDWriteFont3 **font) {
+    return This->lpVtbl->IDWriteFontList1_GetFont(This,index,font);
+}
+static FORCEINLINE HRESULT IDWriteFontList2_GetFontFaceReference(IDWriteFontList2* This,UINT32 index,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,index,reference);
+}
+/*** IDWriteFontList2 methods ***/
+static FORCEINLINE HRESULT IDWriteFontList2_GetFontSet(IDWriteFontList2* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFontSet(This,fontset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontList2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSet2 interface
+ */
+#ifndef __IDWriteFontSet2_INTERFACE_DEFINED__
+#define __IDWriteFontSet2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSet2, 0xdc7ead19, 0xe54c, 0x43af, 0xb2,0xda, 0x4e,0x2b,0x79,0xba,0x3f,0x7f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("dc7ead19-e54c-43af-b2da-4e2b79ba3f7f")
+IDWriteFontSet2 : public IDWriteFontSet1
+{
+    virtual HANDLE STDMETHODCALLTYPE GetExpirationEvent(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSet2, 0xdc7ead19, 0xe54c, 0x43af, 0xb2,0xda, 0x4e,0x2b,0x79,0xba,0x3f,0x7f)
+#endif
+#else
+typedef struct IDWriteFontSet2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSet2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSet2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSet2 *This);
+
+    /*** IDWriteFontSet methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontSet2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontSet2 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFaceReference)(
+        IDWriteFontSet2 *This,
+        IDWriteFontFaceReference *reference,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFace)(
+        IDWriteFontSet2 *This,
+        IDWriteFontFace *fontface,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues__)(
+        IDWriteFontSet2 *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues_)(
+        IDWriteFontSet2 *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        const WCHAR *preferred_locales,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues)(
+        IDWriteFontSet2 *This,
+        UINT32 index,
+        DWRITE_FONT_PROPERTY_ID id,
+        WINBOOL *exists,
+        IDWriteLocalizedStrings **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyOccurrenceCount)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_PROPERTY *property,
+        UINT32 *count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts_)(
+        IDWriteFontSet2 *This,
+        const WCHAR *family,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 count,
+        IDWriteFontSet **fontset);
+
+    /*** IDWriteFontSet1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetMatchingFonts)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_PROPERTY *property,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFirstFontResources)(
+        IDWriteFontSet2 *This,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts__)(
+        IDWriteFontSet2 *This,
+        const UINT32 *indices,
+        UINT32 num_indices,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts_)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_property,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices_)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_AXIS_RANGE *ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices)(
+        IDWriteFontSet2 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges_)(
+        IDWriteFontSet2 *This,
+        UINT32 font_index,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges)(
+        IDWriteFontSet2 *This,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetFontFaceReference)(
+        IDWriteFontSet2 *This,
+        UINT32 index,
+        IDWriteFontFaceReference1 **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
+        IDWriteFontSet2 *This,
+        UINT32 index,
+        IDWriteFontResource **resource);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFontSet2 *This,
+        UINT32 index,
+        IDWriteFontFace5 **fontface);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontSet2 *This,
+        UINT32 index);
+
+    /*** IDWriteFontSet2 methods ***/
+    HANDLE (STDMETHODCALLTYPE *GetExpirationEvent)(
+        IDWriteFontSet2 *This);
+
+    END_INTERFACE
+} IDWriteFontSet2Vtbl;
+
+interface IDWriteFontSet2 {
+    CONST_VTBL IDWriteFontSet2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSet2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSet2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSet2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSet methods ***/
+#define IDWriteFontSet2_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+#define IDWriteFontSet2_FindFontFaceReference(This,reference,index,exists) (This)->lpVtbl->FindFontFaceReference(This,reference,index,exists)
+#define IDWriteFontSet2_FindFontFace(This,fontface,index,exists) (This)->lpVtbl->FindFontFace(This,fontface,index,exists)
+#define IDWriteFontSet2_GetPropertyValues__(This,id,values) (This)->lpVtbl->GetPropertyValues__(This,id,values)
+#define IDWriteFontSet2_GetPropertyValues_(This,id,preferred_locales,values) (This)->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values)
+#define IDWriteFontSet2_GetPropertyValues(This,index,id,exists,values) (This)->lpVtbl->GetPropertyValues(This,index,id,exists,values)
+#define IDWriteFontSet2_GetPropertyOccurrenceCount(This,property,count) (This)->lpVtbl->GetPropertyOccurrenceCount(This,property,count)
+#define IDWriteFontSet2_GetMatchingFonts_(This,family,weight,stretch,style,fontset) (This)->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset)
+/*** IDWriteFontSet1 methods ***/
+#define IDWriteFontSet2_GetMatchingFonts(This,property,axis_values,num_values,fontset) (This)->lpVtbl->IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset)
+#define IDWriteFontSet2_GetFirstFontResources(This,fontset) (This)->lpVtbl->GetFirstFontResources(This,fontset)
+#define IDWriteFontSet2_GetFilteredFonts__(This,indices,num_indices,fontset) (This)->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset)
+#define IDWriteFontSet2_GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset) (This)->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset)
+#define IDWriteFontSet2_GetFilteredFonts(This,props,num_properties,select_any_property,fontset) (This)->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset)
+#define IDWriteFontSet2_GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices) (This)->lpVtbl->GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices)
+#define IDWriteFontSet2_GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices) (This)->lpVtbl->GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices)
+#define IDWriteFontSet2_GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges)
+#define IDWriteFontSet2_GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges)
+#define IDWriteFontSet2_GetFontFaceReference(This,index,reference) (This)->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference)
+#define IDWriteFontSet2_CreateFontResource(This,index,resource) (This)->lpVtbl->CreateFontResource(This,index,resource)
+#define IDWriteFontSet2_CreateFontFace(This,index,fontface) (This)->lpVtbl->CreateFontFace(This,index,fontface)
+#define IDWriteFontSet2_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+/*** IDWriteFontSet2 methods ***/
+#define IDWriteFontSet2_GetExpirationEvent(This) (This)->lpVtbl->GetExpirationEvent(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet2_QueryInterface(IDWriteFontSet2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSet2_AddRef(IDWriteFontSet2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSet2_Release(IDWriteFontSet2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSet methods ***/
+static FORCEINLINE UINT32 IDWriteFontSet2_GetFontCount(IDWriteFontSet2* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_FindFontFaceReference(IDWriteFontSet2* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_FindFontFace(IDWriteFontSet2* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetPropertyValues__(IDWriteFontSet2* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues__(This,id,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetPropertyValues_(IDWriteFontSet2* This,DWRITE_FONT_PROPERTY_ID id,const WCHAR *preferred_locales,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetPropertyValues(IDWriteFontSet2* This,UINT32 index,DWRITE_FONT_PROPERTY_ID id,WINBOOL *exists,IDWriteLocalizedStrings **values) {
+    return This->lpVtbl->GetPropertyValues(This,index,id,exists,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetPropertyOccurrenceCount(IDWriteFontSet2* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
+    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetMatchingFonts_(IDWriteFontSet2* This,const WCHAR *family,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset);
+}
+/*** IDWriteFontSet1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet2_GetMatchingFonts(IDWriteFontSet2* This,const DWRITE_FONT_PROPERTY *property,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFirstFontResources(IDWriteFontSet2* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFirstFontResources(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFilteredFonts__(IDWriteFontSet2* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFilteredFonts_(IDWriteFontSet2* This,const DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,WINBOOL select_any_range,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFilteredFonts(IDWriteFontSet2* This,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties,WINBOOL select_any_property,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFilteredFontIndices_(IDWriteFontSet2* This,const DWRITE_FONT_AXIS_RANGE *ranges,UINT32 num_ranges,WINBOOL select_any_range,UINT32 *indices,UINT32 num_indices,UINT32 *actual_num_indices) {
+    return This->lpVtbl->GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFilteredFontIndices(IDWriteFontSet2* This,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties,WINBOOL select_any_range,UINT32 *indices,UINT32 num_indices,UINT32 *actual_num_indices) {
+    return This->lpVtbl->GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFontAxisRanges_(IDWriteFontSet2* This,UINT32 font_index,DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,UINT32 *actual_num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFontAxisRanges(IDWriteFontSet2* This,DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,UINT32 *actual_num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_GetFontFaceReference(IDWriteFontSet2* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
+    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_CreateFontResource(IDWriteFontSet2* This,UINT32 index,IDWriteFontResource **resource) {
+    return This->lpVtbl->CreateFontResource(This,index,resource);
+}
+static FORCEINLINE HRESULT IDWriteFontSet2_CreateFontFace(IDWriteFontSet2* This,UINT32 index,IDWriteFontFace5 **fontface) {
+    return This->lpVtbl->CreateFontFace(This,index,fontface);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontSet2_GetFontLocality(IDWriteFontSet2* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+/*** IDWriteFontSet2 methods ***/
+static FORCEINLINE HANDLE IDWriteFontSet2_GetExpirationEvent(IDWriteFontSet2* This) {
+    return This->lpVtbl->GetExpirationEvent(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSet2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSet3 interface
+ */
+#ifndef __IDWriteFontSet3_INTERFACE_DEFINED__
+#define __IDWriteFontSet3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSet3, 0x7c073ef2, 0xa7f4, 0x4045, 0x8c,0x32, 0x8a,0xb8,0xae,0x64,0x0f,0x90);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("7c073ef2-a7f4-4045-8c32-8ab8ae640f90")
+IDWriteFontSet3 : public IDWriteFontSet2
+{
+    virtual DWRITE_FONT_SOURCE_TYPE STDMETHODCALLTYPE GetFontSourceType(
+        UINT32 index) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontSourceNameLength(
+        UINT32 index) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontSourceName(
+        UINT32 index,
+        WCHAR *buffer,
+        UINT32 buffer_size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSet3, 0x7c073ef2, 0xa7f4, 0x4045, 0x8c,0x32, 0x8a,0xb8,0xae,0x64,0x0f,0x90)
+#endif
+#else
+typedef struct IDWriteFontSet3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSet3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSet3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSet3 *This);
+
+    /*** IDWriteFontSet methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
+        IDWriteFontSet3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontSet3 *This,
+        UINT32 index,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFaceReference)(
+        IDWriteFontSet3 *This,
+        IDWriteFontFaceReference *reference,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *FindFontFace)(
+        IDWriteFontSet3 *This,
+        IDWriteFontFace *fontface,
+        UINT32 *index,
+        WINBOOL *exists);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues__)(
+        IDWriteFontSet3 *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues_)(
+        IDWriteFontSet3 *This,
+        DWRITE_FONT_PROPERTY_ID id,
+        const WCHAR *preferred_locales,
+        IDWriteStringList **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyValues)(
+        IDWriteFontSet3 *This,
+        UINT32 index,
+        DWRITE_FONT_PROPERTY_ID id,
+        WINBOOL *exists,
+        IDWriteLocalizedStrings **values);
+
+    HRESULT (STDMETHODCALLTYPE *GetPropertyOccurrenceCount)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_PROPERTY *property,
+        UINT32 *count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts_)(
+        IDWriteFontSet3 *This,
+        const WCHAR *family,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 count,
+        IDWriteFontSet **fontset);
+
+    /*** IDWriteFontSet1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetMatchingFonts)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_PROPERTY *property,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFirstFontResources)(
+        IDWriteFontSet3 *This,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts__)(
+        IDWriteFontSet3 *This,
+        const UINT32 *indices,
+        UINT32 num_indices,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts_)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_property,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices_)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_AXIS_RANGE *ranges,
+        UINT32 num_ranges,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices)(
+        IDWriteFontSet3 *This,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties,
+        WINBOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges_)(
+        IDWriteFontSet3 *This,
+        UINT32 font_index,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges)(
+        IDWriteFontSet3 *This,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetFontFaceReference)(
+        IDWriteFontSet3 *This,
+        UINT32 index,
+        IDWriteFontFaceReference1 **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
+        IDWriteFontSet3 *This,
+        UINT32 index,
+        IDWriteFontResource **resource);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFontSet3 *This,
+        UINT32 index,
+        IDWriteFontFace5 **fontface);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
+        IDWriteFontSet3 *This,
+        UINT32 index);
+
+    /*** IDWriteFontSet2 methods ***/
+    HANDLE (STDMETHODCALLTYPE *GetExpirationEvent)(
+        IDWriteFontSet3 *This);
+
+    /*** IDWriteFontSet3 methods ***/
+    DWRITE_FONT_SOURCE_TYPE (STDMETHODCALLTYPE *GetFontSourceType)(
+        IDWriteFontSet3 *This,
+        UINT32 index);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontSourceNameLength)(
+        IDWriteFontSet3 *This,
+        UINT32 index);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontSourceName)(
+        IDWriteFontSet3 *This,
+        UINT32 index,
+        WCHAR *buffer,
+        UINT32 buffer_size);
+
+    END_INTERFACE
+} IDWriteFontSet3Vtbl;
+
+interface IDWriteFontSet3 {
+    CONST_VTBL IDWriteFontSet3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSet3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSet3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSet3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSet methods ***/
+#define IDWriteFontSet3_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
+#define IDWriteFontSet3_FindFontFaceReference(This,reference,index,exists) (This)->lpVtbl->FindFontFaceReference(This,reference,index,exists)
+#define IDWriteFontSet3_FindFontFace(This,fontface,index,exists) (This)->lpVtbl->FindFontFace(This,fontface,index,exists)
+#define IDWriteFontSet3_GetPropertyValues__(This,id,values) (This)->lpVtbl->GetPropertyValues__(This,id,values)
+#define IDWriteFontSet3_GetPropertyValues_(This,id,preferred_locales,values) (This)->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values)
+#define IDWriteFontSet3_GetPropertyValues(This,index,id,exists,values) (This)->lpVtbl->GetPropertyValues(This,index,id,exists,values)
+#define IDWriteFontSet3_GetPropertyOccurrenceCount(This,property,count) (This)->lpVtbl->GetPropertyOccurrenceCount(This,property,count)
+#define IDWriteFontSet3_GetMatchingFonts_(This,family,weight,stretch,style,fontset) (This)->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset)
+/*** IDWriteFontSet1 methods ***/
+#define IDWriteFontSet3_GetMatchingFonts(This,property,axis_values,num_values,fontset) (This)->lpVtbl->IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset)
+#define IDWriteFontSet3_GetFirstFontResources(This,fontset) (This)->lpVtbl->GetFirstFontResources(This,fontset)
+#define IDWriteFontSet3_GetFilteredFonts__(This,indices,num_indices,fontset) (This)->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset)
+#define IDWriteFontSet3_GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset) (This)->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset)
+#define IDWriteFontSet3_GetFilteredFonts(This,props,num_properties,select_any_property,fontset) (This)->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset)
+#define IDWriteFontSet3_GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices) (This)->lpVtbl->GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices)
+#define IDWriteFontSet3_GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices) (This)->lpVtbl->GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices)
+#define IDWriteFontSet3_GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges)
+#define IDWriteFontSet3_GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges)
+#define IDWriteFontSet3_GetFontFaceReference(This,index,reference) (This)->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference)
+#define IDWriteFontSet3_CreateFontResource(This,index,resource) (This)->lpVtbl->CreateFontResource(This,index,resource)
+#define IDWriteFontSet3_CreateFontFace(This,index,fontface) (This)->lpVtbl->CreateFontFace(This,index,fontface)
+#define IDWriteFontSet3_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
+/*** IDWriteFontSet2 methods ***/
+#define IDWriteFontSet3_GetExpirationEvent(This) (This)->lpVtbl->GetExpirationEvent(This)
+/*** IDWriteFontSet3 methods ***/
+#define IDWriteFontSet3_GetFontSourceType(This,index) (This)->lpVtbl->GetFontSourceType(This,index)
+#define IDWriteFontSet3_GetFontSourceNameLength(This,index) (This)->lpVtbl->GetFontSourceNameLength(This,index)
+#define IDWriteFontSet3_GetFontSourceName(This,index,buffer,buffer_size) (This)->lpVtbl->GetFontSourceName(This,index,buffer,buffer_size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet3_QueryInterface(IDWriteFontSet3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSet3_AddRef(IDWriteFontSet3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSet3_Release(IDWriteFontSet3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSet methods ***/
+static FORCEINLINE UINT32 IDWriteFontSet3_GetFontCount(IDWriteFontSet3* This) {
+    return This->lpVtbl->GetFontCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_FindFontFaceReference(IDWriteFontSet3* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_FindFontFace(IDWriteFontSet3* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
+    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetPropertyValues__(IDWriteFontSet3* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues__(This,id,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetPropertyValues_(IDWriteFontSet3* This,DWRITE_FONT_PROPERTY_ID id,const WCHAR *preferred_locales,IDWriteStringList **values) {
+    return This->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetPropertyValues(IDWriteFontSet3* This,UINT32 index,DWRITE_FONT_PROPERTY_ID id,WINBOOL *exists,IDWriteLocalizedStrings **values) {
+    return This->lpVtbl->GetPropertyValues(This,index,id,exists,values);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetPropertyOccurrenceCount(IDWriteFontSet3* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
+    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetMatchingFonts_(IDWriteFontSet3* This,const WCHAR *family,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset);
+}
+/*** IDWriteFontSet1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontSet3_GetMatchingFonts(IDWriteFontSet3* This,const DWRITE_FONT_PROPERTY *property,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->IDWriteFontSet1_GetMatchingFonts(This,property,axis_values,num_values,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFirstFontResources(IDWriteFontSet3* This,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFirstFontResources(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFilteredFonts__(IDWriteFontSet3* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFilteredFonts_(IDWriteFontSet3* This,const DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,WINBOOL select_any_range,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFilteredFonts(IDWriteFontSet3* This,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties,WINBOOL select_any_property,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFilteredFontIndices_(IDWriteFontSet3* This,const DWRITE_FONT_AXIS_RANGE *ranges,UINT32 num_ranges,WINBOOL select_any_range,UINT32 *indices,UINT32 num_indices,UINT32 *actual_num_indices) {
+    return This->lpVtbl->GetFilteredFontIndices_(This,ranges,num_ranges,select_any_range,indices,num_indices,actual_num_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFilteredFontIndices(IDWriteFontSet3* This,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties,WINBOOL select_any_range,UINT32 *indices,UINT32 num_indices,UINT32 *actual_num_indices) {
+    return This->lpVtbl->GetFilteredFontIndices(This,props,num_properties,select_any_range,indices,num_indices,actual_num_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFontAxisRanges_(IDWriteFontSet3* This,UINT32 font_index,DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,UINT32 *actual_num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges_(This,font_index,axis_ranges,num_ranges,actual_num_ranges);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFontAxisRanges(IDWriteFontSet3* This,DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,UINT32 *actual_num_ranges) {
+    return This->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFontFaceReference(IDWriteFontSet3* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
+    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_CreateFontResource(IDWriteFontSet3* This,UINT32 index,IDWriteFontResource **resource) {
+    return This->lpVtbl->CreateFontResource(This,index,resource);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_CreateFontFace(IDWriteFontSet3* This,UINT32 index,IDWriteFontFace5 **fontface) {
+    return This->lpVtbl->CreateFontFace(This,index,fontface);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteFontSet3_GetFontLocality(IDWriteFontSet3* This,UINT32 index) {
+    return This->lpVtbl->GetFontLocality(This,index);
+}
+/*** IDWriteFontSet2 methods ***/
+static FORCEINLINE HANDLE IDWriteFontSet3_GetExpirationEvent(IDWriteFontSet3* This) {
+    return This->lpVtbl->GetExpirationEvent(This);
+}
+/*** IDWriteFontSet3 methods ***/
+static FORCEINLINE DWRITE_FONT_SOURCE_TYPE IDWriteFontSet3_GetFontSourceType(IDWriteFontSet3* This,UINT32 index) {
+    return This->lpVtbl->GetFontSourceType(This,index);
+}
+static FORCEINLINE UINT32 IDWriteFontSet3_GetFontSourceNameLength(IDWriteFontSet3* This,UINT32 index) {
+    return This->lpVtbl->GetFontSourceNameLength(This,index);
+}
+static FORCEINLINE HRESULT IDWriteFontSet3_GetFontSourceName(IDWriteFontSet3* This,UINT32 index,WCHAR *buffer,UINT32 buffer_size) {
+    return This->lpVtbl->GetFontSourceName(This,index,buffer,buffer_size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSet3_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFace3 interface
+ */
+#ifndef __IDWriteFontFace3_INTERFACE_DEFINED__
+#define __IDWriteFontFace3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFace3, 0xd37d7598, 0x09be, 0x4222, 0xa2,0x36, 0x20,0x81,0x34,0x1c,0xc1,0xf2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d37d7598-09be-4222-a236-2081341cc1f2")
+IDWriteFontFace3 : public IDWriteFontFace2
+{
+    virtual HRESULT STDMETHODCALLTYPE GetFontFaceReference(
+        IDWriteFontFaceReference **reference) = 0;
+
+    virtual void STDMETHODCALLTYPE GetPanose(
+        DWRITE_PANOSE *panose) = 0;
+
+    virtual DWRITE_FONT_WEIGHT STDMETHODCALLTYPE GetWeight(
+        ) = 0;
+
+    virtual DWRITE_FONT_STRETCH STDMETHODCALLTYPE GetStretch(
+        ) = 0;
+
+    virtual DWRITE_FONT_STYLE STDMETHODCALLTYPE GetStyle(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFamilyNames(
+        IDWriteLocalizedStrings **names) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFaceNames(
+        IDWriteLocalizedStrings **names) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInformationalStrings(
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE HasCharacter(
+        UINT32 character) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRecommendedRenderingMode(
+        FLOAT emsize,
+        FLOAT dpi_x,
+        FLOAT dpi_y,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE1 *rendering_mode,
+        DWRITE_GRID_FIT_MODE *gridfit_mode) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsCharacterLocal(
+        UINT32 character) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE IsGlyphLocal(
+        UINT16 glyph) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AreCharactersLocal(
+        const WCHAR *characters,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AreGlyphsLocal(
+        const UINT16 *glyphs,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFace3, 0xd37d7598, 0x09be, 0x4222, 0xa2,0x36, 0x20,0x81,0x34,0x1c,0xc1,0xf2)
+#endif
+#else
+typedef struct IDWriteFontFace3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFace3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFace3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFace3 *This);
+
+    /*** IDWriteFontFace methods ***/
+    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
+        IDWriteFontFace3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiles)(
+        IDWriteFontFace3 *This,
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles);
+
+    UINT32 (STDMETHODCALLTYPE *GetIndex)(
+        IDWriteFontFace3 *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFace3 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFontFace3 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFontFace3 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
+        IDWriteFontFace3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
+        IDWriteFontFace3 *This,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
+        IDWriteFontFace3 *This,
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
+        IDWriteFontFace3 *This,
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists);
+
+    void (STDMETHODCALLTYPE *ReleaseFontTable)(
+        IDWriteFontFace3 *This,
+        void *table_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
+        IDWriteFontFace3 *This,
+        FLOAT emSize,
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
+
+    HRESULT (STDMETHODCALLTYPE *GetRecommendedRenderingMode)(
+        IDWriteFontFace3 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
+        IDWriteFontFace3 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
+        IDWriteFontFace3 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    /*** IDWriteFontFace1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFontFace1_GetMetrics)(
+        IDWriteFontFace3 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
+        IDWriteFontFace3 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetCaretMetrics)(
+        IDWriteFontFace3 *This,
+        DWRITE_CARET_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFontFace3 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFontFace3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
+        IDWriteFontFace3 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
+        IDWriteFontFace3 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances);
+
+    HRESULT (STDMETHODCALLTYPE *GetKerningPairAdjustments)(
+        IDWriteFontFace3 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *adjustments);
+
+    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
+        IDWriteFontFace3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
+        IDWriteFontFace3 *This,
+        FLOAT font_emsize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetVerticalGlyphVariants)(
+        IDWriteFontFace3 *This,
+        UINT32 glyph_count,
+        const UINT16 *nominal_indices,
+        UINT16 *vertical_indices);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
+        IDWriteFontFace3 *This);
+
+    /*** IDWriteFontFace2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
+        IDWriteFontFace3 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetColorPaletteCount)(
+        IDWriteFontFace3 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetPaletteEntryCount)(
+        IDWriteFontFace3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetPaletteEntries)(
+        IDWriteFontFace3 *This,
+        UINT32 palette_index,
+        UINT32 first_entry_index,
+        UINT32 entry_count,
+        DWRITE_COLOR_F *entries);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace2_GetRecommendedRenderingMode)(
+        IDWriteFontFace3 *This,
+        FLOAT fontEmSize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuringmode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *renderingmode,
+        DWRITE_GRID_FIT_MODE *gridfitmode);
+
+    /*** IDWriteFontFace3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontFace3 *This,
+        IDWriteFontFaceReference **reference);
+
+    void (STDMETHODCALLTYPE *GetPanose)(
+        IDWriteFontFace3 *This,
+        DWRITE_PANOSE *panose);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFontFace3 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFontFace3 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFontFace3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
+        IDWriteFontFace3 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFontFace3 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFontFace3 *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    WINBOOL (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFontFace3 *This,
+        UINT32 character);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace3_GetRecommendedRenderingMode)(
+        IDWriteFontFace3 *This,
+        FLOAT emsize,
+        FLOAT dpi_x,
+        FLOAT dpi_y,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE1 *rendering_mode,
+        DWRITE_GRID_FIT_MODE *gridfit_mode);
+
+    WINBOOL (STDMETHODCALLTYPE *IsCharacterLocal)(
+        IDWriteFontFace3 *This,
+        UINT32 character);
+
+    WINBOOL (STDMETHODCALLTYPE *IsGlyphLocal)(
+        IDWriteFontFace3 *This,
+        UINT16 glyph);
+
+    HRESULT (STDMETHODCALLTYPE *AreCharactersLocal)(
+        IDWriteFontFace3 *This,
+        const WCHAR *characters,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local);
+
+    HRESULT (STDMETHODCALLTYPE *AreGlyphsLocal)(
+        IDWriteFontFace3 *This,
+        const UINT16 *glyphs,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local);
+
+    END_INTERFACE
+} IDWriteFontFace3Vtbl;
+
+interface IDWriteFontFace3 {
+    CONST_VTBL IDWriteFontFace3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFace3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFace3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFace3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFace methods ***/
+#define IDWriteFontFace3_GetType(This) (This)->lpVtbl->GetType(This)
+#define IDWriteFontFace3_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
+#define IDWriteFontFace3_GetIndex(This) (This)->lpVtbl->GetIndex(This)
+#define IDWriteFontFace3_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFace3_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFontFace3_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
+#define IDWriteFontFace3_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
+#define IDWriteFontFace3_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
+#define IDWriteFontFace3_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
+#define IDWriteFontFace3_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
+#define IDWriteFontFace3_GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink)
+#define IDWriteFontFace3_GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways)
+/*** IDWriteFontFace1 methods ***/
+#define IDWriteFontFace3_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
+#define IDWriteFontFace3_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
+#define IDWriteFontFace3_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
+#define IDWriteFontFace3_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFontFace3_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+#define IDWriteFontFace3_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
+#define IDWriteFontFace3_GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances) (This)->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances)
+#define IDWriteFontFace3_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
+#define IDWriteFontFace3_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
+#define IDWriteFontFace3_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
+#define IDWriteFontFace3_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
+/*** IDWriteFontFace2 methods ***/
+#define IDWriteFontFace3_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
+#define IDWriteFontFace3_GetColorPaletteCount(This) (This)->lpVtbl->GetColorPaletteCount(This)
+#define IDWriteFontFace3_GetPaletteEntryCount(This) (This)->lpVtbl->GetPaletteEntryCount(This)
+#define IDWriteFontFace3_GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries) (This)->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries)
+/*** IDWriteFontFace3 methods ***/
+#define IDWriteFontFace3_GetFontFaceReference(This,reference) (This)->lpVtbl->GetFontFaceReference(This,reference)
+#define IDWriteFontFace3_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
+#define IDWriteFontFace3_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFontFace3_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFontFace3_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFontFace3_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
+#define IDWriteFontFace3_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFontFace3_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFontFace3_HasCharacter(This,character) (This)->lpVtbl->HasCharacter(This,character)
+#define IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode) (This)->lpVtbl->IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode)
+#define IDWriteFontFace3_IsCharacterLocal(This,character) (This)->lpVtbl->IsCharacterLocal(This,character)
+#define IDWriteFontFace3_IsGlyphLocal(This,glyph) (This)->lpVtbl->IsGlyphLocal(This,glyph)
+#define IDWriteFontFace3_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
+#define IDWriteFontFace3_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace3_QueryInterface(IDWriteFontFace3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFace3_AddRef(IDWriteFontFace3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFace3_Release(IDWriteFontFace3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFace methods ***/
+static FORCEINLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace3_GetType(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetType(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetFiles(IDWriteFontFace3* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
+    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
+}
+static FORCEINLINE UINT32 IDWriteFontFace3_GetIndex(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace3_GetSimulations(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_IsSymbolFont(IDWriteFontFace3* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE UINT16 IDWriteFontFace3_GetGlyphCount(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetGlyphCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetDesignGlyphMetrics(IDWriteFontFace3* This,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetGlyphIndices(IDWriteFontFace3* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
+    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_TryGetFontTable(IDWriteFontFace3* This,UINT32 table_tag,const void **table_data,UINT32 *table_size,void **context,WINBOOL *exists) {
+    return This->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists);
+}
+static FORCEINLINE void IDWriteFontFace3_ReleaseFontTable(IDWriteFontFace3* This,void *table_context) {
+    This->lpVtbl->ReleaseFontTable(This,table_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetGlyphRunOutline(IDWriteFontFace3* This,FLOAT emSize,const UINT16 *glyph_indices,const FLOAT *glyph_advances,const DWRITE_GLYPH_OFFSET *glyph_offsets,UINT32 glyph_count,WINBOOL is_sideways,WINBOOL is_rtl,IDWriteGeometrySink *geometrysink) {
+    return This->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetGdiCompatibleGlyphMetrics(IDWriteFontFace3* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways);
+}
+/*** IDWriteFontFace1 methods ***/
+static FORCEINLINE void IDWriteFontFace3_GetMetrics(IDWriteFontFace3* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetGdiCompatibleMetrics(IDWriteFontFace3* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_FONT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics);
+}
+static FORCEINLINE void IDWriteFontFace3_GetCaretMetrics(IDWriteFontFace3* This,DWRITE_CARET_METRICS *metrics) {
+    This->lpVtbl->GetCaretMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetUnicodeRanges(IDWriteFontFace3* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_IsMonospacedFont(IDWriteFontFace3* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetDesignGlyphAdvances(IDWriteFontFace3* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetGdiCompatibleGlyphAdvances(IDWriteFontFace3* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,UINT32 glyph_count,const UINT16 *indices,INT32 *advances) {
+    return This->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetKerningPairAdjustments(IDWriteFontFace3* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
+    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_HasKerningPairs(IDWriteFontFace3* This) {
+    return This->lpVtbl->HasKerningPairs(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetVerticalGlyphVariants(IDWriteFontFace3* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
+    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_HasVerticalGlyphVariants(IDWriteFontFace3* This) {
+    return This->lpVtbl->HasVerticalGlyphVariants(This);
+}
+/*** IDWriteFontFace2 methods ***/
+static FORCEINLINE WINBOOL IDWriteFontFace3_IsColorFont(IDWriteFontFace3* This) {
+    return This->lpVtbl->IsColorFont(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace3_GetColorPaletteCount(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetColorPaletteCount(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace3_GetPaletteEntryCount(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetPaletteEntryCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetPaletteEntries(IDWriteFontFace3* This,UINT32 palette_index,UINT32 first_entry_index,UINT32 entry_count,DWRITE_COLOR_F *entries) {
+    return This->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries);
+}
+/*** IDWriteFontFace3 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace3_GetFontFaceReference(IDWriteFontFace3* This,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,reference);
+}
+static FORCEINLINE void IDWriteFontFace3_GetPanose(IDWriteFontFace3* This,DWRITE_PANOSE *panose) {
+    This->lpVtbl->GetPanose(This,panose);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFontFace3_GetWeight(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFontFace3_GetStretch(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFontFace3_GetStyle(IDWriteFontFace3* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetFamilyNames(IDWriteFontFace3* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFamilyNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetFaceNames(IDWriteFontFace3* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetInformationalStrings(IDWriteFontFace3* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_HasCharacter(IDWriteFontFace3* This,UINT32 character) {
+    return This->lpVtbl->HasCharacter(This,character);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_GetRecommendedRenderingMode(IDWriteFontFace3* This,FLOAT emsize,FLOAT dpi_x,FLOAT dpi_y,const DWRITE_MATRIX *transform,WINBOOL is_sideways,DWRITE_OUTLINE_THRESHOLD threshold,DWRITE_MEASURING_MODE measuring_mode,IDWriteRenderingParams *params,DWRITE_RENDERING_MODE1 *rendering_mode,DWRITE_GRID_FIT_MODE *gridfit_mode) {
+    return This->lpVtbl->IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_IsCharacterLocal(IDWriteFontFace3* This,UINT32 character) {
+    return This->lpVtbl->IsCharacterLocal(This,character);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace3_IsGlyphLocal(IDWriteFontFace3* This,UINT16 glyph) {
+    return This->lpVtbl->IsGlyphLocal(This,glyph);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_AreCharactersLocal(IDWriteFontFace3* This,const WCHAR *characters,UINT32 count,WINBOOL enqueue_if_not,WINBOOL *are_local) {
+    return This->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local);
+}
+static FORCEINLINE HRESULT IDWriteFontFace3_AreGlyphsLocal(IDWriteFontFace3* This,const UINT16 *glyphs,UINT32 count,WINBOOL enqueue_if_not,WINBOOL *are_local) {
+    return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFace3_INTERFACE_DEFINED__ */
+
+typedef struct DWRITE_LINE_METRICS1 {
+    UINT32 length;
+    UINT32 trailingWhitespaceLength;
+    UINT32 newlineLength;
+    FLOAT height;
+    FLOAT baseline;
+    WINBOOL isTrimmed;
+    FLOAT leadingBefore;
+    FLOAT leadingAfter;
+} DWRITE_LINE_METRICS1;
+typedef enum DWRITE_FONT_LINE_GAP_USAGE {
+    DWRITE_FONT_LINE_GAP_USAGE_DEFAULT = 0,
+    DWRITE_FONT_LINE_GAP_USAGE_DISABLED = 1,
+    DWRITE_FONT_LINE_GAP_USAGE_ENABLED = 2
+} DWRITE_FONT_LINE_GAP_USAGE;
+typedef struct DWRITE_LINE_SPACING {
+    DWRITE_LINE_SPACING_METHOD method;
+    FLOAT height;
+    FLOAT baseline;
+    FLOAT leadingBefore;
+    DWRITE_FONT_LINE_GAP_USAGE fontLineGapUsage;
+} DWRITE_LINE_SPACING;
+/*****************************************************************************
+ * IDWriteTextFormat2 interface
+ */
+#ifndef __IDWriteTextFormat2_INTERFACE_DEFINED__
+#define __IDWriteTextFormat2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextFormat2, 0xf67e0edd, 0x9e3d, 0x4ecc, 0x8c,0x32, 0x41,0x83,0x25,0x3d,0xfe,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f67e0edd-9e3d-4ecc-8c32-4183253dfe70")
+IDWriteTextFormat2 : public IDWriteTextFormat1
+{
+    virtual HRESULT STDMETHODCALLTYPE SetLineSpacing(
+        const DWRITE_LINE_SPACING *spacing) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLineSpacing(
+        DWRITE_LINE_SPACING *spacing) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextFormat2, 0xf67e0edd, 0x9e3d, 0x4ecc, 0x8c,0x32, 0x41,0x83,0x25,0x3d,0xfe,0x70)
+#endif
+#else
+typedef struct IDWriteTextFormat2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextFormat2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextFormat2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextFormat2 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextFormat2 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextFormat2 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextFormat2 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextFormat2 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextFormat2 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextFormat2 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextFormat2 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextFormat2 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextFormat2 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextFormat2 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextFormat2 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextFormat2 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextFormat2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextFormat2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextFormat2 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextFormat2 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextFormat2 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextFormat2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextFormat2 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextFormat2 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextFormat2 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextFormat2 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextFormat2 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextFormat2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextFormat2 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextFormat1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetVerticalGlyphOrientation)(
+        IDWriteTextFormat2 *This,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+
+    DWRITE_VERTICAL_GLYPH_ORIENTATION (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextFormat2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetLastLineWrapping)(
+        IDWriteTextFormat2 *This,
+        WINBOOL lastline_wrapping_enabled);
+
+    WINBOOL (STDMETHODCALLTYPE *GetLastLineWrapping)(
+        IDWriteTextFormat2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetOpticalAlignment)(
+        IDWriteTextFormat2 *This,
+        DWRITE_OPTICAL_ALIGNMENT alignment);
+
+    DWRITE_OPTICAL_ALIGNMENT (STDMETHODCALLTYPE *GetOpticalAlignment)(
+        IDWriteTextFormat2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFallback)(
+        IDWriteTextFormat2 *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFallback)(
+        IDWriteTextFormat2 *This,
+        IDWriteFontFallback **fallback);
+
+    /*** IDWriteTextFormat2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextFormat2_SetLineSpacing)(
+        IDWriteTextFormat2 *This,
+        const DWRITE_LINE_SPACING *spacing);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextFormat2_GetLineSpacing)(
+        IDWriteTextFormat2 *This,
+        DWRITE_LINE_SPACING *spacing);
+
+    END_INTERFACE
+} IDWriteTextFormat2Vtbl;
+
+interface IDWriteTextFormat2 {
+    CONST_VTBL IDWriteTextFormat2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextFormat2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextFormat2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextFormat2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextFormat2_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextFormat2_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextFormat2_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextFormat2_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextFormat2_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextFormat2_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextFormat2_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextFormat2_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextFormat2_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextFormat2_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextFormat2_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextFormat2_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextFormat2_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextFormat2_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextFormat2_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteTextFormat2_GetFontFamilyNameLength(This) (This)->lpVtbl->GetFontFamilyNameLength(This)
+#define IDWriteTextFormat2_GetFontFamilyName(This,name,size) (This)->lpVtbl->GetFontFamilyName(This,name,size)
+#define IDWriteTextFormat2_GetFontWeight(This) (This)->lpVtbl->GetFontWeight(This)
+#define IDWriteTextFormat2_GetFontStyle(This) (This)->lpVtbl->GetFontStyle(This)
+#define IDWriteTextFormat2_GetFontStretch(This) (This)->lpVtbl->GetFontStretch(This)
+#define IDWriteTextFormat2_GetFontSize(This) (This)->lpVtbl->GetFontSize(This)
+#define IDWriteTextFormat2_GetLocaleNameLength(This) (This)->lpVtbl->GetLocaleNameLength(This)
+#define IDWriteTextFormat2_GetLocaleName(This,name,size) (This)->lpVtbl->GetLocaleName(This,name,size)
+/*** IDWriteTextFormat1 methods ***/
+#define IDWriteTextFormat2_SetVerticalGlyphOrientation(This,orientation) (This)->lpVtbl->SetVerticalGlyphOrientation(This,orientation)
+#define IDWriteTextFormat2_GetVerticalGlyphOrientation(This) (This)->lpVtbl->GetVerticalGlyphOrientation(This)
+#define IDWriteTextFormat2_SetLastLineWrapping(This,lastline_wrapping_enabled) (This)->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled)
+#define IDWriteTextFormat2_GetLastLineWrapping(This) (This)->lpVtbl->GetLastLineWrapping(This)
+#define IDWriteTextFormat2_SetOpticalAlignment(This,alignment) (This)->lpVtbl->SetOpticalAlignment(This,alignment)
+#define IDWriteTextFormat2_GetOpticalAlignment(This) (This)->lpVtbl->GetOpticalAlignment(This)
+#define IDWriteTextFormat2_SetFontFallback(This,fallback) (This)->lpVtbl->SetFontFallback(This,fallback)
+#define IDWriteTextFormat2_GetFontFallback(This,fallback) (This)->lpVtbl->GetFontFallback(This,fallback)
+/*** IDWriteTextFormat2 methods ***/
+#define IDWriteTextFormat2_SetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextFormat2_SetLineSpacing(This,spacing)
+#define IDWriteTextFormat2_GetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextFormat2_GetLineSpacing(This,spacing)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat2_QueryInterface(IDWriteTextFormat2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextFormat2_AddRef(IDWriteTextFormat2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextFormat2_Release(IDWriteTextFormat2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetTextAlignment(IDWriteTextFormat2* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetParagraphAlignment(IDWriteTextFormat2* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetWordWrapping(IDWriteTextFormat2* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetReadingDirection(IDWriteTextFormat2* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetFlowDirection(IDWriteTextFormat2* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetIncrementalTabStop(IDWriteTextFormat2* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetTrimming(IDWriteTextFormat2* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextFormat2_GetTextAlignment(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextFormat2_GetParagraphAlignment(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextFormat2_GetWordWrapping(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextFormat2_GetReadingDirection(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextFormat2_GetFlowDirection(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat2_GetIncrementalTabStop(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_GetTrimming(IDWriteTextFormat2* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_GetFontCollection(IDWriteTextFormat2* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat2_GetFontFamilyNameLength(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetFontFamilyNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_GetFontFamilyName(IDWriteTextFormat2* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetFontFamilyName(This,name,size);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteTextFormat2_GetFontWeight(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetFontWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteTextFormat2_GetFontStyle(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetFontStyle(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteTextFormat2_GetFontStretch(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetFontStretch(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat2_GetFontSize(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetFontSize(This);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat2_GetLocaleNameLength(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetLocaleNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_GetLocaleName(IDWriteTextFormat2* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetLocaleName(This,name,size);
+}
+/*** IDWriteTextFormat1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetVerticalGlyphOrientation(IDWriteTextFormat2* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
+    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
+}
+static FORCEINLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextFormat2_GetVerticalGlyphOrientation(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetLastLineWrapping(IDWriteTextFormat2* This,WINBOOL lastline_wrapping_enabled) {
+    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
+}
+static FORCEINLINE WINBOOL IDWriteTextFormat2_GetLastLineWrapping(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetLastLineWrapping(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetOpticalAlignment(IDWriteTextFormat2* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
+    return This->lpVtbl->SetOpticalAlignment(This,alignment);
+}
+static FORCEINLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextFormat2_GetOpticalAlignment(IDWriteTextFormat2* This) {
+    return This->lpVtbl->GetOpticalAlignment(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetFontFallback(IDWriteTextFormat2* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->SetFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_GetFontFallback(IDWriteTextFormat2* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetFontFallback(This,fallback);
+}
+/*** IDWriteTextFormat2 methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat2_SetLineSpacing(IDWriteTextFormat2* This,const DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextFormat2_SetLineSpacing(This,spacing);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat2_GetLineSpacing(IDWriteTextFormat2* This,DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextFormat2_GetLineSpacing(This,spacing);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextFormat2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextFormat3 interface
+ */
+#ifndef __IDWriteTextFormat3_INTERFACE_DEFINED__
+#define __IDWriteTextFormat3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextFormat3, 0x6d3b5641, 0xe550, 0x430d, 0xa8,0x5b, 0xb7,0xbf,0x48,0xa9,0x34,0x27);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("6d3b5641-e550-430d-a85b-b7bf48a93427")
+IDWriteTextFormat3 : public IDWriteTextFormat2
+{
+    virtual HRESULT STDMETHODCALLTYPE SetFontAxisValues(
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontAxisValueCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisValues(
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values) = 0;
+
+    virtual DWRITE_AUTOMATIC_FONT_AXES STDMETHODCALLTYPE GetAutomaticFontAxes(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetAutomaticFontAxes(
+        DWRITE_AUTOMATIC_FONT_AXES axes) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextFormat3, 0x6d3b5641, 0xe550, 0x430d, 0xa8,0x5b, 0xb7,0xbf,0x48,0xa9,0x34,0x27)
+#endif
+#else
+typedef struct IDWriteTextFormat3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextFormat3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextFormat3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextFormat3 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextFormat3 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextFormat3 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextFormat3 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextFormat3 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextFormat3 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextFormat3 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextFormat3 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextFormat3 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextFormat3 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextFormat3 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextFormat3 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextFormat3 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextFormat3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextFormat3 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextFormat3 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextFormat3 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextFormat3 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextFormat3 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextFormat3 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextFormat3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextFormat3 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextFormat3 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextFormat1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetVerticalGlyphOrientation)(
+        IDWriteTextFormat3 *This,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+
+    DWRITE_VERTICAL_GLYPH_ORIENTATION (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetLastLineWrapping)(
+        IDWriteTextFormat3 *This,
+        WINBOOL lastline_wrapping_enabled);
+
+    WINBOOL (STDMETHODCALLTYPE *GetLastLineWrapping)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetOpticalAlignment)(
+        IDWriteTextFormat3 *This,
+        DWRITE_OPTICAL_ALIGNMENT alignment);
+
+    DWRITE_OPTICAL_ALIGNMENT (STDMETHODCALLTYPE *GetOpticalAlignment)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFallback)(
+        IDWriteTextFormat3 *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFallback)(
+        IDWriteTextFormat3 *This,
+        IDWriteFontFallback **fallback);
+
+    /*** IDWriteTextFormat2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextFormat2_SetLineSpacing)(
+        IDWriteTextFormat3 *This,
+        const DWRITE_LINE_SPACING *spacing);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextFormat2_GetLineSpacing)(
+        IDWriteTextFormat3 *This,
+        DWRITE_LINE_SPACING *spacing);
+
+    /*** IDWriteTextFormat3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFontAxisValues)(
+        IDWriteTextFormat3 *This,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontAxisValueCount)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisValues)(
+        IDWriteTextFormat3 *This,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values);
+
+    DWRITE_AUTOMATIC_FONT_AXES (STDMETHODCALLTYPE *GetAutomaticFontAxes)(
+        IDWriteTextFormat3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetAutomaticFontAxes)(
+        IDWriteTextFormat3 *This,
+        DWRITE_AUTOMATIC_FONT_AXES axes);
+
+    END_INTERFACE
+} IDWriteTextFormat3Vtbl;
+
+interface IDWriteTextFormat3 {
+    CONST_VTBL IDWriteTextFormat3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextFormat3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextFormat3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextFormat3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextFormat3_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextFormat3_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextFormat3_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextFormat3_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextFormat3_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextFormat3_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextFormat3_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextFormat3_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextFormat3_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextFormat3_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextFormat3_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextFormat3_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextFormat3_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextFormat3_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+#define IDWriteTextFormat3_GetFontCollection(This,collection) (This)->lpVtbl->GetFontCollection(This,collection)
+#define IDWriteTextFormat3_GetFontFamilyNameLength(This) (This)->lpVtbl->GetFontFamilyNameLength(This)
+#define IDWriteTextFormat3_GetFontFamilyName(This,name,size) (This)->lpVtbl->GetFontFamilyName(This,name,size)
+#define IDWriteTextFormat3_GetFontWeight(This) (This)->lpVtbl->GetFontWeight(This)
+#define IDWriteTextFormat3_GetFontStyle(This) (This)->lpVtbl->GetFontStyle(This)
+#define IDWriteTextFormat3_GetFontStretch(This) (This)->lpVtbl->GetFontStretch(This)
+#define IDWriteTextFormat3_GetFontSize(This) (This)->lpVtbl->GetFontSize(This)
+#define IDWriteTextFormat3_GetLocaleNameLength(This) (This)->lpVtbl->GetLocaleNameLength(This)
+#define IDWriteTextFormat3_GetLocaleName(This,name,size) (This)->lpVtbl->GetLocaleName(This,name,size)
+/*** IDWriteTextFormat1 methods ***/
+#define IDWriteTextFormat3_SetVerticalGlyphOrientation(This,orientation) (This)->lpVtbl->SetVerticalGlyphOrientation(This,orientation)
+#define IDWriteTextFormat3_GetVerticalGlyphOrientation(This) (This)->lpVtbl->GetVerticalGlyphOrientation(This)
+#define IDWriteTextFormat3_SetLastLineWrapping(This,lastline_wrapping_enabled) (This)->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled)
+#define IDWriteTextFormat3_GetLastLineWrapping(This) (This)->lpVtbl->GetLastLineWrapping(This)
+#define IDWriteTextFormat3_SetOpticalAlignment(This,alignment) (This)->lpVtbl->SetOpticalAlignment(This,alignment)
+#define IDWriteTextFormat3_GetOpticalAlignment(This) (This)->lpVtbl->GetOpticalAlignment(This)
+#define IDWriteTextFormat3_SetFontFallback(This,fallback) (This)->lpVtbl->SetFontFallback(This,fallback)
+#define IDWriteTextFormat3_GetFontFallback(This,fallback) (This)->lpVtbl->GetFontFallback(This,fallback)
+/*** IDWriteTextFormat2 methods ***/
+#define IDWriteTextFormat3_SetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextFormat2_SetLineSpacing(This,spacing)
+#define IDWriteTextFormat3_GetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextFormat2_GetLineSpacing(This,spacing)
+/*** IDWriteTextFormat3 methods ***/
+#define IDWriteTextFormat3_SetFontAxisValues(This,axis_values,num_values) (This)->lpVtbl->SetFontAxisValues(This,axis_values,num_values)
+#define IDWriteTextFormat3_GetFontAxisValueCount(This) (This)->lpVtbl->GetFontAxisValueCount(This)
+#define IDWriteTextFormat3_GetFontAxisValues(This,axis_values,num_values) (This)->lpVtbl->GetFontAxisValues(This,axis_values,num_values)
+#define IDWriteTextFormat3_GetAutomaticFontAxes(This) (This)->lpVtbl->GetAutomaticFontAxes(This)
+#define IDWriteTextFormat3_SetAutomaticFontAxes(This,axes) (This)->lpVtbl->SetAutomaticFontAxes(This,axes)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat3_QueryInterface(IDWriteTextFormat3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextFormat3_AddRef(IDWriteTextFormat3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextFormat3_Release(IDWriteTextFormat3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetTextAlignment(IDWriteTextFormat3* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetParagraphAlignment(IDWriteTextFormat3* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetWordWrapping(IDWriteTextFormat3* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetReadingDirection(IDWriteTextFormat3* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetFlowDirection(IDWriteTextFormat3* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetIncrementalTabStop(IDWriteTextFormat3* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetTrimming(IDWriteTextFormat3* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextFormat3_GetTextAlignment(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextFormat3_GetParagraphAlignment(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextFormat3_GetWordWrapping(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextFormat3_GetReadingDirection(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextFormat3_GetFlowDirection(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat3_GetIncrementalTabStop(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetTrimming(IDWriteTextFormat3* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetFontCollection(IDWriteTextFormat3* This,IDWriteFontCollection **collection) {
+    return This->lpVtbl->GetFontCollection(This,collection);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat3_GetFontFamilyNameLength(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFontFamilyNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetFontFamilyName(IDWriteTextFormat3* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetFontFamilyName(This,name,size);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteTextFormat3_GetFontWeight(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFontWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteTextFormat3_GetFontStyle(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFontStyle(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteTextFormat3_GetFontStretch(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFontStretch(This);
+}
+static FORCEINLINE FLOAT IDWriteTextFormat3_GetFontSize(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFontSize(This);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat3_GetLocaleNameLength(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetLocaleNameLength(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetLocaleName(IDWriteTextFormat3* This,WCHAR *name,UINT32 size) {
+    return This->lpVtbl->GetLocaleName(This,name,size);
+}
+/*** IDWriteTextFormat1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetVerticalGlyphOrientation(IDWriteTextFormat3* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
+    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
+}
+static FORCEINLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextFormat3_GetVerticalGlyphOrientation(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetLastLineWrapping(IDWriteTextFormat3* This,WINBOOL lastline_wrapping_enabled) {
+    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
+}
+static FORCEINLINE WINBOOL IDWriteTextFormat3_GetLastLineWrapping(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetLastLineWrapping(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetOpticalAlignment(IDWriteTextFormat3* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
+    return This->lpVtbl->SetOpticalAlignment(This,alignment);
+}
+static FORCEINLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextFormat3_GetOpticalAlignment(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetOpticalAlignment(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetFontFallback(IDWriteTextFormat3* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->SetFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetFontFallback(IDWriteTextFormat3* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetFontFallback(This,fallback);
+}
+/*** IDWriteTextFormat2 methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetLineSpacing(IDWriteTextFormat3* This,const DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextFormat2_SetLineSpacing(This,spacing);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetLineSpacing(IDWriteTextFormat3* This,DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextFormat2_GetLineSpacing(This,spacing);
+}
+/*** IDWriteTextFormat3 methods ***/
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetFontAxisValues(IDWriteTextFormat3* This,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values) {
+    return This->lpVtbl->SetFontAxisValues(This,axis_values,num_values);
+}
+static FORCEINLINE UINT32 IDWriteTextFormat3_GetFontAxisValueCount(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetFontAxisValueCount(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_GetFontAxisValues(IDWriteTextFormat3* This,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values) {
+    return This->lpVtbl->GetFontAxisValues(This,axis_values,num_values);
+}
+static FORCEINLINE DWRITE_AUTOMATIC_FONT_AXES IDWriteTextFormat3_GetAutomaticFontAxes(IDWriteTextFormat3* This) {
+    return This->lpVtbl->GetAutomaticFontAxes(This);
+}
+static FORCEINLINE HRESULT IDWriteTextFormat3_SetAutomaticFontAxes(IDWriteTextFormat3* This,DWRITE_AUTOMATIC_FONT_AXES axes) {
+    return This->lpVtbl->SetAutomaticFontAxes(This,axes);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextFormat3_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextLayout3 interface
+ */
+#ifndef __IDWriteTextLayout3_INTERFACE_DEFINED__
+#define __IDWriteTextLayout3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextLayout3, 0x07ddcd52, 0x020e, 0x4de8, 0xac,0x33, 0x6c,0x95,0x3d,0x83,0xf9,0x2d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("07ddcd52-020e-4de8-ac33-6c953d83f92d")
+IDWriteTextLayout3 : public IDWriteTextLayout2
+{
+    virtual HRESULT STDMETHODCALLTYPE InvalidateLayout(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLineSpacing(
+        const DWRITE_LINE_SPACING *spacing) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLineSpacing(
+        DWRITE_LINE_SPACING *spacing) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLineMetrics(
+        DWRITE_LINE_METRICS1 *metrics,
+        UINT32 max_count,
+        UINT32 *count) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextLayout3, 0x07ddcd52, 0x020e, 0x4de8, 0xac,0x33, 0x6c,0x95,0x3d,0x83,0xf9,0x2d)
+#endif
+#else
+typedef struct IDWriteTextLayout3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextLayout3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextLayout3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextLayout3 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextLayout3 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextLayout3 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextLayout3 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextLayout3 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextLayout3 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextLayout3 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextLayout3 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextLayout3 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextLayout3 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextLayout3 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextLayout3 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextLayout3 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextLayout3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextLayout3 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextLayout3 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextLayout3 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextLayout3 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextLayout3 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextLayout3 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextLayout3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextLayout3 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextLayout3 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextLayout methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetMaxWidth)(
+        IDWriteTextLayout3 *This,
+        FLOAT maxWidth);
+
+    HRESULT (STDMETHODCALLTYPE *SetMaxHeight)(
+        IDWriteTextLayout3 *This,
+        FLOAT maxHeight);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontCollection)(
+        IDWriteTextLayout3 *This,
+        IDWriteFontCollection *collection,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFamilyName)(
+        IDWriteTextLayout3 *This,
+        const WCHAR *name,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontWeight)(
+        IDWriteTextLayout3 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStyle)(
+        IDWriteTextLayout3 *This,
+        DWRITE_FONT_STYLE style,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStretch)(
+        IDWriteTextLayout3 *This,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontSize)(
+        IDWriteTextLayout3 *This,
+        FLOAT size,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetUnderline)(
+        IDWriteTextLayout3 *This,
+        WINBOOL underline,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetStrikethrough)(
+        IDWriteTextLayout3 *This,
+        WINBOOL strikethrough,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetDrawingEffect)(
+        IDWriteTextLayout3 *This,
+        IUnknown *effect,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetInlineObject)(
+        IDWriteTextLayout3 *This,
+        IDWriteInlineObject *object,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetTypography)(
+        IDWriteTextLayout3 *This,
+        IDWriteTypography *typography,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocaleName)(
+        IDWriteTextLayout3 *This,
+        const WCHAR *locale,
+        DWRITE_TEXT_RANGE range);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxWidth)(
+        IDWriteTextLayout3 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxHeight)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontCollection)(
+        IDWriteTextLayout3 *This,
+        UINT32 pos,
+        IDWriteFontCollection **collection,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyNameLength)(
+        IDWriteTextLayout3 *This,
+        UINT32 pos,
+        UINT32 *len,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyName)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontWeight)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStyle)(
+        IDWriteTextLayout3 *This,
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStretch)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontSize)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        FLOAT *size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnderline)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        WINBOOL *has_underline,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetStrikethrough)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        WINBOOL *has_strikethrough,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetDrawingEffect)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        IUnknown **effect,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetInlineObject)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        IDWriteInlineObject **object,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypography)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        IDWriteTypography **typography,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleNameLength)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        UINT32 *length,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleName)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *Draw)(
+        IDWriteTextLayout3 *This,
+        void *context,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineMetrics)(
+        IDWriteTextLayout3 *This,
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteTextLayout3 *This,
+        DWRITE_TEXT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetOverhangMetrics)(
+        IDWriteTextLayout3 *This,
+        DWRITE_OVERHANG_METRICS *overhangs);
+
+    HRESULT (STDMETHODCALLTYPE *GetClusterMetrics)(
+        IDWriteTextLayout3 *This,
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *act_count);
+
+    HRESULT (STDMETHODCALLTYPE *DetermineMinWidth)(
+        IDWriteTextLayout3 *This,
+        FLOAT *min_width);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
+        IDWriteTextLayout3 *This,
+        FLOAT pointX,
+        FLOAT pointY,
+        WINBOOL *is_trailinghit,
+        WINBOOL *is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextPosition)(
+        IDWriteTextLayout3 *This,
+        UINT32 textPosition,
+        WINBOOL is_trailinghit,
+        FLOAT *pointX,
+        FLOAT *pointY,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextRange)(
+        IDWriteTextLayout3 *This,
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32 *actual_metricscount);
+
+    /*** IDWriteTextLayout1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetPairKerning)(
+        IDWriteTextLayout3 *This,
+        WINBOOL is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetPairKerning)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        WINBOOL *is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *SetCharacterSpacing)(
+        IDWriteTextLayout3 *This,
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT minimum_advance_width,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetCharacterSpacing)(
+        IDWriteTextLayout3 *This,
+        UINT32 position,
+        FLOAT *leading_spacing,
+        FLOAT *trailing_spacing,
+        FLOAT *minimum_advance_width,
+        DWRITE_TEXT_RANGE *range);
+
+    /*** IDWriteTextLayout2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout2_GetMetrics)(
+        IDWriteTextLayout3 *This,
+        DWRITE_TEXT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *SetVerticalGlyphOrientation)(
+        IDWriteTextLayout3 *This,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+
+    DWRITE_VERTICAL_GLYPH_ORIENTATION (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetLastLineWrapping)(
+        IDWriteTextLayout3 *This,
+        WINBOOL lastline_wrapping_enabled);
+
+    WINBOOL (STDMETHODCALLTYPE *GetLastLineWrapping)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetOpticalAlignment)(
+        IDWriteTextLayout3 *This,
+        DWRITE_OPTICAL_ALIGNMENT alignment);
+
+    DWRITE_OPTICAL_ALIGNMENT (STDMETHODCALLTYPE *GetOpticalAlignment)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFallback)(
+        IDWriteTextLayout3 *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFallback)(
+        IDWriteTextLayout3 *This,
+        IDWriteFontFallback **fallback);
+
+    /*** IDWriteTextLayout3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *InvalidateLayout)(
+        IDWriteTextLayout3 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout3_SetLineSpacing)(
+        IDWriteTextLayout3 *This,
+        const DWRITE_LINE_SPACING *spacing);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout3_GetLineSpacing)(
+        IDWriteTextLayout3 *This,
+        DWRITE_LINE_SPACING *spacing);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout3_GetLineMetrics)(
+        IDWriteTextLayout3 *This,
+        DWRITE_LINE_METRICS1 *metrics,
+        UINT32 max_count,
+        UINT32 *count);
+
+    END_INTERFACE
+} IDWriteTextLayout3Vtbl;
+
+interface IDWriteTextLayout3 {
+    CONST_VTBL IDWriteTextLayout3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextLayout3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextLayout3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextLayout3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextLayout3_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextLayout3_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextLayout3_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextLayout3_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextLayout3_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextLayout3_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextLayout3_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextLayout3_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextLayout3_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextLayout3_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextLayout3_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextLayout3_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextLayout3_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextLayout3_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+/*** IDWriteTextLayout methods ***/
+#define IDWriteTextLayout3_SetMaxWidth(This,maxWidth) (This)->lpVtbl->SetMaxWidth(This,maxWidth)
+#define IDWriteTextLayout3_SetMaxHeight(This,maxHeight) (This)->lpVtbl->SetMaxHeight(This,maxHeight)
+#define IDWriteTextLayout3_SetFontCollection(This,collection,range) (This)->lpVtbl->SetFontCollection(This,collection,range)
+#define IDWriteTextLayout3_SetFontFamilyName(This,name,range) (This)->lpVtbl->SetFontFamilyName(This,name,range)
+#define IDWriteTextLayout3_SetFontWeight(This,weight,range) (This)->lpVtbl->SetFontWeight(This,weight,range)
+#define IDWriteTextLayout3_SetFontStyle(This,style,range) (This)->lpVtbl->SetFontStyle(This,style,range)
+#define IDWriteTextLayout3_SetFontStretch(This,stretch,range) (This)->lpVtbl->SetFontStretch(This,stretch,range)
+#define IDWriteTextLayout3_SetFontSize(This,size,range) (This)->lpVtbl->SetFontSize(This,size,range)
+#define IDWriteTextLayout3_SetUnderline(This,underline,range) (This)->lpVtbl->SetUnderline(This,underline,range)
+#define IDWriteTextLayout3_SetStrikethrough(This,strikethrough,range) (This)->lpVtbl->SetStrikethrough(This,strikethrough,range)
+#define IDWriteTextLayout3_SetDrawingEffect(This,effect,range) (This)->lpVtbl->SetDrawingEffect(This,effect,range)
+#define IDWriteTextLayout3_SetInlineObject(This,object,range) (This)->lpVtbl->SetInlineObject(This,object,range)
+#define IDWriteTextLayout3_SetTypography(This,typography,range) (This)->lpVtbl->SetTypography(This,typography,range)
+#define IDWriteTextLayout3_SetLocaleName(This,locale,range) (This)->lpVtbl->SetLocaleName(This,locale,range)
+#define IDWriteTextLayout3_GetMaxWidth(This) (This)->lpVtbl->GetMaxWidth(This)
+#define IDWriteTextLayout3_GetMaxHeight(This) (This)->lpVtbl->GetMaxHeight(This)
+#define IDWriteTextLayout3_GetFontCollection(This,pos,collection,range) (This)->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range)
+#define IDWriteTextLayout3_GetFontFamilyNameLength(This,pos,len,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range)
+#define IDWriteTextLayout3_GetFontFamilyName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range)
+#define IDWriteTextLayout3_GetFontWeight(This,position,weight,range) (This)->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range)
+#define IDWriteTextLayout3_GetFontStyle(This,currentPosition,style,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range)
+#define IDWriteTextLayout3_GetFontStretch(This,position,stretch,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range)
+#define IDWriteTextLayout3_GetFontSize(This,position,size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range)
+#define IDWriteTextLayout3_GetUnderline(This,position,has_underline,range) (This)->lpVtbl->GetUnderline(This,position,has_underline,range)
+#define IDWriteTextLayout3_GetStrikethrough(This,position,has_strikethrough,range) (This)->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range)
+#define IDWriteTextLayout3_GetDrawingEffect(This,position,effect,range) (This)->lpVtbl->GetDrawingEffect(This,position,effect,range)
+#define IDWriteTextLayout3_GetInlineObject(This,position,object,range) (This)->lpVtbl->GetInlineObject(This,position,object,range)
+#define IDWriteTextLayout3_GetTypography(This,position,typography,range) (This)->lpVtbl->GetTypography(This,position,typography,range)
+#define IDWriteTextLayout3_GetLocaleNameLength(This,position,length,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range)
+#define IDWriteTextLayout3_GetLocaleName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range)
+#define IDWriteTextLayout3_Draw(This,context,renderer,originX,originY) (This)->lpVtbl->Draw(This,context,renderer,originX,originY)
+#define IDWriteTextLayout3_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
+#define IDWriteTextLayout3_GetClusterMetrics(This,metrics,max_count,act_count) (This)->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count)
+#define IDWriteTextLayout3_DetermineMinWidth(This,min_width) (This)->lpVtbl->DetermineMinWidth(This,min_width)
+#define IDWriteTextLayout3_HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics) (This)->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics)
+#define IDWriteTextLayout3_HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics) (This)->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics)
+#define IDWriteTextLayout3_HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount) (This)->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount)
+/*** IDWriteTextLayout1 methods ***/
+#define IDWriteTextLayout3_SetPairKerning(This,is_pairkerning_enabled,range) (This)->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range)
+#define IDWriteTextLayout3_GetPairKerning(This,position,is_pairkerning_enabled,range) (This)->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range)
+#define IDWriteTextLayout3_SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range)
+#define IDWriteTextLayout3_GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range)
+/*** IDWriteTextLayout2 methods ***/
+#define IDWriteTextLayout3_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics)
+#define IDWriteTextLayout3_SetVerticalGlyphOrientation(This,orientation) (This)->lpVtbl->SetVerticalGlyphOrientation(This,orientation)
+#define IDWriteTextLayout3_GetVerticalGlyphOrientation(This) (This)->lpVtbl->GetVerticalGlyphOrientation(This)
+#define IDWriteTextLayout3_SetLastLineWrapping(This,lastline_wrapping_enabled) (This)->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled)
+#define IDWriteTextLayout3_GetLastLineWrapping(This) (This)->lpVtbl->GetLastLineWrapping(This)
+#define IDWriteTextLayout3_SetOpticalAlignment(This,alignment) (This)->lpVtbl->SetOpticalAlignment(This,alignment)
+#define IDWriteTextLayout3_GetOpticalAlignment(This) (This)->lpVtbl->GetOpticalAlignment(This)
+#define IDWriteTextLayout3_SetFontFallback(This,fallback) (This)->lpVtbl->SetFontFallback(This,fallback)
+#define IDWriteTextLayout3_GetFontFallback(This,fallback) (This)->lpVtbl->GetFontFallback(This,fallback)
+/*** IDWriteTextLayout3 methods ***/
+#define IDWriteTextLayout3_InvalidateLayout(This) (This)->lpVtbl->InvalidateLayout(This)
+#define IDWriteTextLayout3_SetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextLayout3_SetLineSpacing(This,spacing)
+#define IDWriteTextLayout3_GetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextLayout3_GetLineSpacing(This,spacing)
+#define IDWriteTextLayout3_GetLineMetrics(This,metrics,max_count,count) (This)->lpVtbl->IDWriteTextLayout3_GetLineMetrics(This,metrics,max_count,count)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout3_QueryInterface(IDWriteTextLayout3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextLayout3_AddRef(IDWriteTextLayout3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextLayout3_Release(IDWriteTextLayout3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetTextAlignment(IDWriteTextLayout3* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetParagraphAlignment(IDWriteTextLayout3* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetWordWrapping(IDWriteTextLayout3* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetReadingDirection(IDWriteTextLayout3* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFlowDirection(IDWriteTextLayout3* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetIncrementalTabStop(IDWriteTextLayout3* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetTrimming(IDWriteTextLayout3* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout3_GetTextAlignment(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout3_GetParagraphAlignment(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextLayout3_GetWordWrapping(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextLayout3_GetReadingDirection(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout3_GetFlowDirection(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout3_GetIncrementalTabStop(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetTrimming(IDWriteTextLayout3* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+/*** IDWriteTextLayout methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetMaxWidth(IDWriteTextLayout3* This,FLOAT maxWidth) {
+    return This->lpVtbl->SetMaxWidth(This,maxWidth);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetMaxHeight(IDWriteTextLayout3* This,FLOAT maxHeight) {
+    return This->lpVtbl->SetMaxHeight(This,maxHeight);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontCollection(IDWriteTextLayout3* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontCollection(This,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontFamilyName(IDWriteTextLayout3* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontFamilyName(This,name,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontWeight(IDWriteTextLayout3* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontWeight(This,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontStyle(IDWriteTextLayout3* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStyle(This,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontStretch(IDWriteTextLayout3* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStretch(This,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontSize(IDWriteTextLayout3* This,FLOAT size,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontSize(This,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetUnderline(IDWriteTextLayout3* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetUnderline(This,underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetStrikethrough(IDWriteTextLayout3* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetDrawingEffect(IDWriteTextLayout3* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetDrawingEffect(This,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetInlineObject(IDWriteTextLayout3* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetInlineObject(This,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetTypography(IDWriteTextLayout3* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetTypography(This,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetLocaleName(IDWriteTextLayout3* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetLocaleName(This,locale,range);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout3_GetMaxWidth(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetMaxWidth(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout3_GetMaxHeight(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetMaxHeight(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontCollection(IDWriteTextLayout3* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontFamilyNameLength(IDWriteTextLayout3* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontFamilyName(IDWriteTextLayout3* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontWeight(IDWriteTextLayout3* This,UINT32 position,DWRITE_FONT_WEIGHT *weight,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontStyle(IDWriteTextLayout3* This,UINT32 currentPosition,DWRITE_FONT_STYLE *style,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontStretch(IDWriteTextLayout3* This,UINT32 position,DWRITE_FONT_STRETCH *stretch,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontSize(IDWriteTextLayout3* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetUnderline(IDWriteTextLayout3* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetStrikethrough(IDWriteTextLayout3* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetDrawingEffect(IDWriteTextLayout3* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetInlineObject(IDWriteTextLayout3* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetInlineObject(This,position,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetTypography(IDWriteTextLayout3* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetTypography(This,position,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetLocaleNameLength(IDWriteTextLayout3* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetLocaleName(IDWriteTextLayout3* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_Draw(IDWriteTextLayout3* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
+    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetOverhangMetrics(IDWriteTextLayout3* This,DWRITE_OVERHANG_METRICS *overhangs) {
+    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetClusterMetrics(IDWriteTextLayout3* This,DWRITE_CLUSTER_METRICS *metrics,UINT32 max_count,UINT32 *act_count) {
+    return This->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_DetermineMinWidth(IDWriteTextLayout3* This,FLOAT *min_width) {
+    return This->lpVtbl->DetermineMinWidth(This,min_width);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_HitTestPoint(IDWriteTextLayout3* This,FLOAT pointX,FLOAT pointY,WINBOOL *is_trailinghit,WINBOOL *is_inside,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_HitTestTextPosition(IDWriteTextLayout3* This,UINT32 textPosition,WINBOOL is_trailinghit,FLOAT *pointX,FLOAT *pointY,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_HitTestTextRange(IDWriteTextLayout3* This,UINT32 textPosition,UINT32 textLength,FLOAT originX,FLOAT originY,DWRITE_HIT_TEST_METRICS *metrics,UINT32 max_metricscount,UINT32 *actual_metricscount) {
+    return This->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount);
+}
+/*** IDWriteTextLayout1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetPairKerning(IDWriteTextLayout3* This,WINBOOL is_pairkerning_enabled,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetPairKerning(IDWriteTextLayout3* This,UINT32 position,WINBOOL *is_pairkerning_enabled,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetCharacterSpacing(IDWriteTextLayout3* This,FLOAT leading_spacing,FLOAT trailing_spacing,FLOAT minimum_advance_width,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetCharacterSpacing(IDWriteTextLayout3* This,UINT32 position,FLOAT *leading_spacing,FLOAT *trailing_spacing,FLOAT *minimum_advance_width,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+/*** IDWriteTextLayout2 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetMetrics(IDWriteTextLayout3* This,DWRITE_TEXT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetVerticalGlyphOrientation(IDWriteTextLayout3* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
+    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
+}
+static FORCEINLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextLayout3_GetVerticalGlyphOrientation(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetLastLineWrapping(IDWriteTextLayout3* This,WINBOOL lastline_wrapping_enabled) {
+    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
+}
+static FORCEINLINE WINBOOL IDWriteTextLayout3_GetLastLineWrapping(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetLastLineWrapping(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetOpticalAlignment(IDWriteTextLayout3* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
+    return This->lpVtbl->SetOpticalAlignment(This,alignment);
+}
+static FORCEINLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextLayout3_GetOpticalAlignment(IDWriteTextLayout3* This) {
+    return This->lpVtbl->GetOpticalAlignment(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetFontFallback(IDWriteTextLayout3* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->SetFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetFontFallback(IDWriteTextLayout3* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetFontFallback(This,fallback);
+}
+/*** IDWriteTextLayout3 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout3_InvalidateLayout(IDWriteTextLayout3* This) {
+    return This->lpVtbl->InvalidateLayout(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_SetLineSpacing(IDWriteTextLayout3* This,const DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextLayout3_SetLineSpacing(This,spacing);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetLineSpacing(IDWriteTextLayout3* This,DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextLayout3_GetLineSpacing(This,spacing);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout3_GetLineMetrics(IDWriteTextLayout3* This,DWRITE_LINE_METRICS1 *metrics,UINT32 max_count,UINT32 *count) {
+    return This->lpVtbl->IDWriteTextLayout3_GetLineMetrics(This,metrics,max_count,count);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextLayout3_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteTextLayout4 interface
+ */
+#ifndef __IDWriteTextLayout4_INTERFACE_DEFINED__
+#define __IDWriteTextLayout4_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteTextLayout4, 0x05a9bf42, 0x223f, 0x4441, 0xb5,0xfb, 0x82,0x63,0x68,0x5f,0x55,0xe9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("05a9bf42-223f-4441-b5fb-8263685f55e9")
+IDWriteTextLayout4 : public IDWriteTextLayout3
+{
+    virtual HRESULT STDMETHODCALLTYPE SetFontAxisValues(
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        DWRITE_TEXT_RANGE range) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFontAxisValueCount(
+        UINT32 pos) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisValues(
+        UINT32 pos,
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values,
+        DWRITE_TEXT_RANGE *range) = 0;
+
+    virtual DWRITE_AUTOMATIC_FONT_AXES STDMETHODCALLTYPE GetAutomaticFontAxes(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetAutomaticFontAxes(
+        DWRITE_AUTOMATIC_FONT_AXES axes) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteTextLayout4, 0x05a9bf42, 0x223f, 0x4441, 0xb5,0xfb, 0x82,0x63,0x68,0x5f,0x55,0xe9)
+#endif
+#else
+typedef struct IDWriteTextLayout4Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteTextLayout4 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteTextLayout4 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteTextLayout4 *This);
+
+    /*** IDWriteTextFormat methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetTextAlignment)(
+        IDWriteTextLayout4 *This,
+        DWRITE_TEXT_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetParagraphAlignment)(
+        IDWriteTextLayout4 *This,
+        DWRITE_PARAGRAPH_ALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetWordWrapping)(
+        IDWriteTextLayout4 *This,
+        DWRITE_WORD_WRAPPING wrapping);
+
+    HRESULT (STDMETHODCALLTYPE *SetReadingDirection)(
+        IDWriteTextLayout4 *This,
+        DWRITE_READING_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetFlowDirection)(
+        IDWriteTextLayout4 *This,
+        DWRITE_FLOW_DIRECTION direction);
+
+    HRESULT (STDMETHODCALLTYPE *SetIncrementalTabStop)(
+        IDWriteTextLayout4 *This,
+        FLOAT tabstop);
+
+    HRESULT (STDMETHODCALLTYPE *SetTrimming)(
+        IDWriteTextLayout4 *This,
+        const DWRITE_TRIMMING *trimming,
+        IDWriteInlineObject *trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *SetLineSpacing)(
+        IDWriteTextLayout4 *This,
+        DWRITE_LINE_SPACING_METHOD spacing,
+        FLOAT line_spacing,
+        FLOAT baseline);
+
+    DWRITE_TEXT_ALIGNMENT (STDMETHODCALLTYPE *GetTextAlignment)(
+        IDWriteTextLayout4 *This);
+
+    DWRITE_PARAGRAPH_ALIGNMENT (STDMETHODCALLTYPE *GetParagraphAlignment)(
+        IDWriteTextLayout4 *This);
+
+    DWRITE_WORD_WRAPPING (STDMETHODCALLTYPE *GetWordWrapping)(
+        IDWriteTextLayout4 *This);
+
+    DWRITE_READING_DIRECTION (STDMETHODCALLTYPE *GetReadingDirection)(
+        IDWriteTextLayout4 *This);
+
+    DWRITE_FLOW_DIRECTION (STDMETHODCALLTYPE *GetFlowDirection)(
+        IDWriteTextLayout4 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetIncrementalTabStop)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrimming)(
+        IDWriteTextLayout4 *This,
+        DWRITE_TRIMMING *options,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineSpacing)(
+        IDWriteTextLayout4 *This,
+        DWRITE_LINE_SPACING_METHOD *method,
+        FLOAT *spacing,
+        FLOAT *baseline);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontCollection)(
+        IDWriteTextLayout4 *This,
+        IDWriteFontCollection **collection);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontFamilyNameLength)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFamilyName)(
+        IDWriteTextLayout4 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetFontWeight)(
+        IDWriteTextLayout4 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetFontStyle)(
+        IDWriteTextLayout4 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetFontStretch)(
+        IDWriteTextLayout4 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetFontSize)(
+        IDWriteTextLayout4 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetLocaleNameLength)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
+        IDWriteTextLayout4 *This,
+        WCHAR *name,
+        UINT32 size);
+
+    /*** IDWriteTextLayout methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetMaxWidth)(
+        IDWriteTextLayout4 *This,
+        FLOAT maxWidth);
+
+    HRESULT (STDMETHODCALLTYPE *SetMaxHeight)(
+        IDWriteTextLayout4 *This,
+        FLOAT maxHeight);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontCollection)(
+        IDWriteTextLayout4 *This,
+        IDWriteFontCollection *collection,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFamilyName)(
+        IDWriteTextLayout4 *This,
+        const WCHAR *name,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontWeight)(
+        IDWriteTextLayout4 *This,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStyle)(
+        IDWriteTextLayout4 *This,
+        DWRITE_FONT_STYLE style,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontStretch)(
+        IDWriteTextLayout4 *This,
+        DWRITE_FONT_STRETCH stretch,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontSize)(
+        IDWriteTextLayout4 *This,
+        FLOAT size,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetUnderline)(
+        IDWriteTextLayout4 *This,
+        WINBOOL underline,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetStrikethrough)(
+        IDWriteTextLayout4 *This,
+        WINBOOL strikethrough,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetDrawingEffect)(
+        IDWriteTextLayout4 *This,
+        IUnknown *effect,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetInlineObject)(
+        IDWriteTextLayout4 *This,
+        IDWriteInlineObject *object,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetTypography)(
+        IDWriteTextLayout4 *This,
+        IDWriteTypography *typography,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocaleName)(
+        IDWriteTextLayout4 *This,
+        const WCHAR *locale,
+        DWRITE_TEXT_RANGE range);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxWidth)(
+        IDWriteTextLayout4 *This);
+
+    FLOAT (STDMETHODCALLTYPE *GetMaxHeight)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontCollection)(
+        IDWriteTextLayout4 *This,
+        UINT32 pos,
+        IDWriteFontCollection **collection,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyNameLength)(
+        IDWriteTextLayout4 *This,
+        UINT32 pos,
+        UINT32 *len,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontFamilyName)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontWeight)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        DWRITE_FONT_WEIGHT *weight,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStyle)(
+        IDWriteTextLayout4 *This,
+        UINT32 currentPosition,
+        DWRITE_FONT_STYLE *style,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontStretch)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        DWRITE_FONT_STRETCH *stretch,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetFontSize)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        FLOAT *size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnderline)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        WINBOOL *has_underline,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetStrikethrough)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        WINBOOL *has_strikethrough,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetDrawingEffect)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        IUnknown **effect,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetInlineObject)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        IDWriteInlineObject **object,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypography)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        IDWriteTypography **typography,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleNameLength)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        UINT32 *length,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout_GetLocaleName)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        WCHAR *name,
+        UINT32 name_size,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *Draw)(
+        IDWriteTextLayout4 *This,
+        void *context,
+        IDWriteTextRenderer *renderer,
+        FLOAT originX,
+        FLOAT originY);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineMetrics)(
+        IDWriteTextLayout4 *This,
+        DWRITE_LINE_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *actual_count);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteTextLayout4 *This,
+        DWRITE_TEXT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetOverhangMetrics)(
+        IDWriteTextLayout4 *This,
+        DWRITE_OVERHANG_METRICS *overhangs);
+
+    HRESULT (STDMETHODCALLTYPE *GetClusterMetrics)(
+        IDWriteTextLayout4 *This,
+        DWRITE_CLUSTER_METRICS *metrics,
+        UINT32 max_count,
+        UINT32 *act_count);
+
+    HRESULT (STDMETHODCALLTYPE *DetermineMinWidth)(
+        IDWriteTextLayout4 *This,
+        FLOAT *min_width);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
+        IDWriteTextLayout4 *This,
+        FLOAT pointX,
+        FLOAT pointY,
+        WINBOOL *is_trailinghit,
+        WINBOOL *is_inside,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextPosition)(
+        IDWriteTextLayout4 *This,
+        UINT32 textPosition,
+        WINBOOL is_trailinghit,
+        FLOAT *pointX,
+        FLOAT *pointY,
+        DWRITE_HIT_TEST_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *HitTestTextRange)(
+        IDWriteTextLayout4 *This,
+        UINT32 textPosition,
+        UINT32 textLength,
+        FLOAT originX,
+        FLOAT originY,
+        DWRITE_HIT_TEST_METRICS *metrics,
+        UINT32 max_metricscount,
+        UINT32 *actual_metricscount);
+
+    /*** IDWriteTextLayout1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetPairKerning)(
+        IDWriteTextLayout4 *This,
+        WINBOOL is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetPairKerning)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        WINBOOL *is_pairkerning_enabled,
+        DWRITE_TEXT_RANGE *range);
+
+    HRESULT (STDMETHODCALLTYPE *SetCharacterSpacing)(
+        IDWriteTextLayout4 *This,
+        FLOAT leading_spacing,
+        FLOAT trailing_spacing,
+        FLOAT minimum_advance_width,
+        DWRITE_TEXT_RANGE range);
+
+    HRESULT (STDMETHODCALLTYPE *GetCharacterSpacing)(
+        IDWriteTextLayout4 *This,
+        UINT32 position,
+        FLOAT *leading_spacing,
+        FLOAT *trailing_spacing,
+        FLOAT *minimum_advance_width,
+        DWRITE_TEXT_RANGE *range);
+
+    /*** IDWriteTextLayout2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout2_GetMetrics)(
+        IDWriteTextLayout4 *This,
+        DWRITE_TEXT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *SetVerticalGlyphOrientation)(
+        IDWriteTextLayout4 *This,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
+
+    DWRITE_VERTICAL_GLYPH_ORIENTATION (STDMETHODCALLTYPE *GetVerticalGlyphOrientation)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetLastLineWrapping)(
+        IDWriteTextLayout4 *This,
+        WINBOOL lastline_wrapping_enabled);
+
+    WINBOOL (STDMETHODCALLTYPE *GetLastLineWrapping)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetOpticalAlignment)(
+        IDWriteTextLayout4 *This,
+        DWRITE_OPTICAL_ALIGNMENT alignment);
+
+    DWRITE_OPTICAL_ALIGNMENT (STDMETHODCALLTYPE *GetOpticalAlignment)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetFontFallback)(
+        IDWriteTextLayout4 *This,
+        IDWriteFontFallback *fallback);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontFallback)(
+        IDWriteTextLayout4 *This,
+        IDWriteFontFallback **fallback);
+
+    /*** IDWriteTextLayout3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *InvalidateLayout)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout3_SetLineSpacing)(
+        IDWriteTextLayout4 *This,
+        const DWRITE_LINE_SPACING *spacing);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout3_GetLineSpacing)(
+        IDWriteTextLayout4 *This,
+        DWRITE_LINE_SPACING *spacing);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteTextLayout3_GetLineMetrics)(
+        IDWriteTextLayout4 *This,
+        DWRITE_LINE_METRICS1 *metrics,
+        UINT32 max_count,
+        UINT32 *count);
+
+    /*** IDWriteTextLayout4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFontAxisValues)(
+        IDWriteTextLayout4 *This,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        DWRITE_TEXT_RANGE range);
+
+    UINT32 (STDMETHODCALLTYPE *GetFontAxisValueCount)(
+        IDWriteTextLayout4 *This,
+        UINT32 pos);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisValues)(
+        IDWriteTextLayout4 *This,
+        UINT32 pos,
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values,
+        DWRITE_TEXT_RANGE *range);
+
+    DWRITE_AUTOMATIC_FONT_AXES (STDMETHODCALLTYPE *GetAutomaticFontAxes)(
+        IDWriteTextLayout4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetAutomaticFontAxes)(
+        IDWriteTextLayout4 *This,
+        DWRITE_AUTOMATIC_FONT_AXES axes);
+
+    END_INTERFACE
+} IDWriteTextLayout4Vtbl;
+
+interface IDWriteTextLayout4 {
+    CONST_VTBL IDWriteTextLayout4Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteTextLayout4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteTextLayout4_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteTextLayout4_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteTextFormat methods ***/
+#define IDWriteTextLayout4_SetTextAlignment(This,alignment) (This)->lpVtbl->SetTextAlignment(This,alignment)
+#define IDWriteTextLayout4_SetParagraphAlignment(This,alignment) (This)->lpVtbl->SetParagraphAlignment(This,alignment)
+#define IDWriteTextLayout4_SetWordWrapping(This,wrapping) (This)->lpVtbl->SetWordWrapping(This,wrapping)
+#define IDWriteTextLayout4_SetReadingDirection(This,direction) (This)->lpVtbl->SetReadingDirection(This,direction)
+#define IDWriteTextLayout4_SetFlowDirection(This,direction) (This)->lpVtbl->SetFlowDirection(This,direction)
+#define IDWriteTextLayout4_SetIncrementalTabStop(This,tabstop) (This)->lpVtbl->SetIncrementalTabStop(This,tabstop)
+#define IDWriteTextLayout4_SetTrimming(This,trimming,trimming_sign) (This)->lpVtbl->SetTrimming(This,trimming,trimming_sign)
+#define IDWriteTextLayout4_GetTextAlignment(This) (This)->lpVtbl->GetTextAlignment(This)
+#define IDWriteTextLayout4_GetParagraphAlignment(This) (This)->lpVtbl->GetParagraphAlignment(This)
+#define IDWriteTextLayout4_GetWordWrapping(This) (This)->lpVtbl->GetWordWrapping(This)
+#define IDWriteTextLayout4_GetReadingDirection(This) (This)->lpVtbl->GetReadingDirection(This)
+#define IDWriteTextLayout4_GetFlowDirection(This) (This)->lpVtbl->GetFlowDirection(This)
+#define IDWriteTextLayout4_GetIncrementalTabStop(This) (This)->lpVtbl->GetIncrementalTabStop(This)
+#define IDWriteTextLayout4_GetTrimming(This,options,trimming_sign) (This)->lpVtbl->GetTrimming(This,options,trimming_sign)
+/*** IDWriteTextLayout methods ***/
+#define IDWriteTextLayout4_SetMaxWidth(This,maxWidth) (This)->lpVtbl->SetMaxWidth(This,maxWidth)
+#define IDWriteTextLayout4_SetMaxHeight(This,maxHeight) (This)->lpVtbl->SetMaxHeight(This,maxHeight)
+#define IDWriteTextLayout4_SetFontCollection(This,collection,range) (This)->lpVtbl->SetFontCollection(This,collection,range)
+#define IDWriteTextLayout4_SetFontFamilyName(This,name,range) (This)->lpVtbl->SetFontFamilyName(This,name,range)
+#define IDWriteTextLayout4_SetFontWeight(This,weight,range) (This)->lpVtbl->SetFontWeight(This,weight,range)
+#define IDWriteTextLayout4_SetFontStyle(This,style,range) (This)->lpVtbl->SetFontStyle(This,style,range)
+#define IDWriteTextLayout4_SetFontStretch(This,stretch,range) (This)->lpVtbl->SetFontStretch(This,stretch,range)
+#define IDWriteTextLayout4_SetFontSize(This,size,range) (This)->lpVtbl->SetFontSize(This,size,range)
+#define IDWriteTextLayout4_SetUnderline(This,underline,range) (This)->lpVtbl->SetUnderline(This,underline,range)
+#define IDWriteTextLayout4_SetStrikethrough(This,strikethrough,range) (This)->lpVtbl->SetStrikethrough(This,strikethrough,range)
+#define IDWriteTextLayout4_SetDrawingEffect(This,effect,range) (This)->lpVtbl->SetDrawingEffect(This,effect,range)
+#define IDWriteTextLayout4_SetInlineObject(This,object,range) (This)->lpVtbl->SetInlineObject(This,object,range)
+#define IDWriteTextLayout4_SetTypography(This,typography,range) (This)->lpVtbl->SetTypography(This,typography,range)
+#define IDWriteTextLayout4_SetLocaleName(This,locale,range) (This)->lpVtbl->SetLocaleName(This,locale,range)
+#define IDWriteTextLayout4_GetMaxWidth(This) (This)->lpVtbl->GetMaxWidth(This)
+#define IDWriteTextLayout4_GetMaxHeight(This) (This)->lpVtbl->GetMaxHeight(This)
+#define IDWriteTextLayout4_GetFontCollection(This,pos,collection,range) (This)->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range)
+#define IDWriteTextLayout4_GetFontFamilyNameLength(This,pos,len,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range)
+#define IDWriteTextLayout4_GetFontFamilyName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range)
+#define IDWriteTextLayout4_GetFontWeight(This,position,weight,range) (This)->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range)
+#define IDWriteTextLayout4_GetFontStyle(This,currentPosition,style,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range)
+#define IDWriteTextLayout4_GetFontStretch(This,position,stretch,range) (This)->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range)
+#define IDWriteTextLayout4_GetFontSize(This,position,size,range) (This)->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range)
+#define IDWriteTextLayout4_GetUnderline(This,position,has_underline,range) (This)->lpVtbl->GetUnderline(This,position,has_underline,range)
+#define IDWriteTextLayout4_GetStrikethrough(This,position,has_strikethrough,range) (This)->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range)
+#define IDWriteTextLayout4_GetDrawingEffect(This,position,effect,range) (This)->lpVtbl->GetDrawingEffect(This,position,effect,range)
+#define IDWriteTextLayout4_GetInlineObject(This,position,object,range) (This)->lpVtbl->GetInlineObject(This,position,object,range)
+#define IDWriteTextLayout4_GetTypography(This,position,typography,range) (This)->lpVtbl->GetTypography(This,position,typography,range)
+#define IDWriteTextLayout4_GetLocaleNameLength(This,position,length,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range)
+#define IDWriteTextLayout4_GetLocaleName(This,position,name,name_size,range) (This)->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range)
+#define IDWriteTextLayout4_Draw(This,context,renderer,originX,originY) (This)->lpVtbl->Draw(This,context,renderer,originX,originY)
+#define IDWriteTextLayout4_GetOverhangMetrics(This,overhangs) (This)->lpVtbl->GetOverhangMetrics(This,overhangs)
+#define IDWriteTextLayout4_GetClusterMetrics(This,metrics,max_count,act_count) (This)->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count)
+#define IDWriteTextLayout4_DetermineMinWidth(This,min_width) (This)->lpVtbl->DetermineMinWidth(This,min_width)
+#define IDWriteTextLayout4_HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics) (This)->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics)
+#define IDWriteTextLayout4_HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics) (This)->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics)
+#define IDWriteTextLayout4_HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount) (This)->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount)
+/*** IDWriteTextLayout1 methods ***/
+#define IDWriteTextLayout4_SetPairKerning(This,is_pairkerning_enabled,range) (This)->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range)
+#define IDWriteTextLayout4_GetPairKerning(This,position,is_pairkerning_enabled,range) (This)->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range)
+#define IDWriteTextLayout4_SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range)
+#define IDWriteTextLayout4_GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range) (This)->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range)
+/*** IDWriteTextLayout2 methods ***/
+#define IDWriteTextLayout4_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics)
+#define IDWriteTextLayout4_SetVerticalGlyphOrientation(This,orientation) (This)->lpVtbl->SetVerticalGlyphOrientation(This,orientation)
+#define IDWriteTextLayout4_GetVerticalGlyphOrientation(This) (This)->lpVtbl->GetVerticalGlyphOrientation(This)
+#define IDWriteTextLayout4_SetLastLineWrapping(This,lastline_wrapping_enabled) (This)->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled)
+#define IDWriteTextLayout4_GetLastLineWrapping(This) (This)->lpVtbl->GetLastLineWrapping(This)
+#define IDWriteTextLayout4_SetOpticalAlignment(This,alignment) (This)->lpVtbl->SetOpticalAlignment(This,alignment)
+#define IDWriteTextLayout4_GetOpticalAlignment(This) (This)->lpVtbl->GetOpticalAlignment(This)
+#define IDWriteTextLayout4_SetFontFallback(This,fallback) (This)->lpVtbl->SetFontFallback(This,fallback)
+#define IDWriteTextLayout4_GetFontFallback(This,fallback) (This)->lpVtbl->GetFontFallback(This,fallback)
+/*** IDWriteTextLayout3 methods ***/
+#define IDWriteTextLayout4_InvalidateLayout(This) (This)->lpVtbl->InvalidateLayout(This)
+#define IDWriteTextLayout4_SetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextLayout3_SetLineSpacing(This,spacing)
+#define IDWriteTextLayout4_GetLineSpacing(This,spacing) (This)->lpVtbl->IDWriteTextLayout3_GetLineSpacing(This,spacing)
+#define IDWriteTextLayout4_GetLineMetrics(This,metrics,max_count,count) (This)->lpVtbl->IDWriteTextLayout3_GetLineMetrics(This,metrics,max_count,count)
+/*** IDWriteTextLayout4 methods ***/
+#define IDWriteTextLayout4_SetFontAxisValues(This,axis_values,num_values,range) (This)->lpVtbl->SetFontAxisValues(This,axis_values,num_values,range)
+#define IDWriteTextLayout4_GetFontAxisValueCount(This,pos) (This)->lpVtbl->GetFontAxisValueCount(This,pos)
+#define IDWriteTextLayout4_GetFontAxisValues(This,pos,values,num_values,range) (This)->lpVtbl->GetFontAxisValues(This,pos,values,num_values,range)
+#define IDWriteTextLayout4_GetAutomaticFontAxes(This) (This)->lpVtbl->GetAutomaticFontAxes(This)
+#define IDWriteTextLayout4_SetAutomaticFontAxes(This,axes) (This)->lpVtbl->SetAutomaticFontAxes(This,axes)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_QueryInterface(IDWriteTextLayout4* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteTextLayout4_AddRef(IDWriteTextLayout4* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteTextLayout4_Release(IDWriteTextLayout4* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteTextFormat methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetTextAlignment(IDWriteTextLayout4* This,DWRITE_TEXT_ALIGNMENT alignment) {
+    return This->lpVtbl->SetTextAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetParagraphAlignment(IDWriteTextLayout4* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
+    return This->lpVtbl->SetParagraphAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetWordWrapping(IDWriteTextLayout4* This,DWRITE_WORD_WRAPPING wrapping) {
+    return This->lpVtbl->SetWordWrapping(This,wrapping);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetReadingDirection(IDWriteTextLayout4* This,DWRITE_READING_DIRECTION direction) {
+    return This->lpVtbl->SetReadingDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFlowDirection(IDWriteTextLayout4* This,DWRITE_FLOW_DIRECTION direction) {
+    return This->lpVtbl->SetFlowDirection(This,direction);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetIncrementalTabStop(IDWriteTextLayout4* This,FLOAT tabstop) {
+    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetTrimming(IDWriteTextLayout4* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
+    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
+}
+static FORCEINLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout4_GetTextAlignment(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetTextAlignment(This);
+}
+static FORCEINLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout4_GetParagraphAlignment(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetParagraphAlignment(This);
+}
+static FORCEINLINE DWRITE_WORD_WRAPPING IDWriteTextLayout4_GetWordWrapping(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetWordWrapping(This);
+}
+static FORCEINLINE DWRITE_READING_DIRECTION IDWriteTextLayout4_GetReadingDirection(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetReadingDirection(This);
+}
+static FORCEINLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout4_GetFlowDirection(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetFlowDirection(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout4_GetIncrementalTabStop(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetIncrementalTabStop(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetTrimming(IDWriteTextLayout4* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
+}
+/*** IDWriteTextLayout methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetMaxWidth(IDWriteTextLayout4* This,FLOAT maxWidth) {
+    return This->lpVtbl->SetMaxWidth(This,maxWidth);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetMaxHeight(IDWriteTextLayout4* This,FLOAT maxHeight) {
+    return This->lpVtbl->SetMaxHeight(This,maxHeight);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontCollection(IDWriteTextLayout4* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontCollection(This,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontFamilyName(IDWriteTextLayout4* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontFamilyName(This,name,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontWeight(IDWriteTextLayout4* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontWeight(This,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontStyle(IDWriteTextLayout4* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStyle(This,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontStretch(IDWriteTextLayout4* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontStretch(This,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontSize(IDWriteTextLayout4* This,FLOAT size,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontSize(This,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetUnderline(IDWriteTextLayout4* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetUnderline(This,underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetStrikethrough(IDWriteTextLayout4* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetDrawingEffect(IDWriteTextLayout4* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetDrawingEffect(This,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetInlineObject(IDWriteTextLayout4* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetInlineObject(This,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetTypography(IDWriteTextLayout4* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetTypography(This,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetLocaleName(IDWriteTextLayout4* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetLocaleName(This,locale,range);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout4_GetMaxWidth(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetMaxWidth(This);
+}
+static FORCEINLINE FLOAT IDWriteTextLayout4_GetMaxHeight(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetMaxHeight(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontCollection(IDWriteTextLayout4* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontFamilyNameLength(IDWriteTextLayout4* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontFamilyName(IDWriteTextLayout4* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontWeight(IDWriteTextLayout4* This,UINT32 position,DWRITE_FONT_WEIGHT *weight,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontWeight(This,position,weight,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontStyle(IDWriteTextLayout4* This,UINT32 currentPosition,DWRITE_FONT_STYLE *style,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStyle(This,currentPosition,style,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontStretch(IDWriteTextLayout4* This,UINT32 position,DWRITE_FONT_STRETCH *stretch,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontStretch(This,position,stretch,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontSize(IDWriteTextLayout4* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetUnderline(IDWriteTextLayout4* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetStrikethrough(IDWriteTextLayout4* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetDrawingEffect(IDWriteTextLayout4* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetInlineObject(IDWriteTextLayout4* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetInlineObject(This,position,object,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetTypography(IDWriteTextLayout4* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetTypography(This,position,typography,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetLocaleNameLength(IDWriteTextLayout4* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetLocaleName(IDWriteTextLayout4* This,UINT32 position,WCHAR *name,UINT32 name_size,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->IDWriteTextLayout_GetLocaleName(This,position,name,name_size,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_Draw(IDWriteTextLayout4* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
+    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetOverhangMetrics(IDWriteTextLayout4* This,DWRITE_OVERHANG_METRICS *overhangs) {
+    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetClusterMetrics(IDWriteTextLayout4* This,DWRITE_CLUSTER_METRICS *metrics,UINT32 max_count,UINT32 *act_count) {
+    return This->lpVtbl->GetClusterMetrics(This,metrics,max_count,act_count);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_DetermineMinWidth(IDWriteTextLayout4* This,FLOAT *min_width) {
+    return This->lpVtbl->DetermineMinWidth(This,min_width);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_HitTestPoint(IDWriteTextLayout4* This,FLOAT pointX,FLOAT pointY,WINBOOL *is_trailinghit,WINBOOL *is_inside,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestPoint(This,pointX,pointY,is_trailinghit,is_inside,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_HitTestTextPosition(IDWriteTextLayout4* This,UINT32 textPosition,WINBOOL is_trailinghit,FLOAT *pointX,FLOAT *pointY,DWRITE_HIT_TEST_METRICS *metrics) {
+    return This->lpVtbl->HitTestTextPosition(This,textPosition,is_trailinghit,pointX,pointY,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_HitTestTextRange(IDWriteTextLayout4* This,UINT32 textPosition,UINT32 textLength,FLOAT originX,FLOAT originY,DWRITE_HIT_TEST_METRICS *metrics,UINT32 max_metricscount,UINT32 *actual_metricscount) {
+    return This->lpVtbl->HitTestTextRange(This,textPosition,textLength,originX,originY,metrics,max_metricscount,actual_metricscount);
+}
+/*** IDWriteTextLayout1 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetPairKerning(IDWriteTextLayout4* This,WINBOOL is_pairkerning_enabled,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetPairKerning(IDWriteTextLayout4* This,UINT32 position,WINBOOL *is_pairkerning_enabled,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetPairKerning(This,position,is_pairkerning_enabled,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetCharacterSpacing(IDWriteTextLayout4* This,FLOAT leading_spacing,FLOAT trailing_spacing,FLOAT minimum_advance_width,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetCharacterSpacing(This,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetCharacterSpacing(IDWriteTextLayout4* This,UINT32 position,FLOAT *leading_spacing,FLOAT *trailing_spacing,FLOAT *minimum_advance_width,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetCharacterSpacing(This,position,leading_spacing,trailing_spacing,minimum_advance_width,range);
+}
+/*** IDWriteTextLayout2 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetMetrics(IDWriteTextLayout4* This,DWRITE_TEXT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetVerticalGlyphOrientation(IDWriteTextLayout4* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
+    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
+}
+static FORCEINLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextLayout4_GetVerticalGlyphOrientation(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetVerticalGlyphOrientation(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetLastLineWrapping(IDWriteTextLayout4* This,WINBOOL lastline_wrapping_enabled) {
+    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
+}
+static FORCEINLINE WINBOOL IDWriteTextLayout4_GetLastLineWrapping(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetLastLineWrapping(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetOpticalAlignment(IDWriteTextLayout4* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
+    return This->lpVtbl->SetOpticalAlignment(This,alignment);
+}
+static FORCEINLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextLayout4_GetOpticalAlignment(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetOpticalAlignment(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontFallback(IDWriteTextLayout4* This,IDWriteFontFallback *fallback) {
+    return This->lpVtbl->SetFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontFallback(IDWriteTextLayout4* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetFontFallback(This,fallback);
+}
+/*** IDWriteTextLayout3 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_InvalidateLayout(IDWriteTextLayout4* This) {
+    return This->lpVtbl->InvalidateLayout(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetLineSpacing(IDWriteTextLayout4* This,const DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextLayout3_SetLineSpacing(This,spacing);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetLineSpacing(IDWriteTextLayout4* This,DWRITE_LINE_SPACING *spacing) {
+    return This->lpVtbl->IDWriteTextLayout3_GetLineSpacing(This,spacing);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetLineMetrics(IDWriteTextLayout4* This,DWRITE_LINE_METRICS1 *metrics,UINT32 max_count,UINT32 *count) {
+    return This->lpVtbl->IDWriteTextLayout3_GetLineMetrics(This,metrics,max_count,count);
+}
+/*** IDWriteTextLayout4 methods ***/
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetFontAxisValues(IDWriteTextLayout4* This,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,DWRITE_TEXT_RANGE range) {
+    return This->lpVtbl->SetFontAxisValues(This,axis_values,num_values,range);
+}
+static FORCEINLINE UINT32 IDWriteTextLayout4_GetFontAxisValueCount(IDWriteTextLayout4* This,UINT32 pos) {
+    return This->lpVtbl->GetFontAxisValueCount(This,pos);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_GetFontAxisValues(IDWriteTextLayout4* This,UINT32 pos,DWRITE_FONT_AXIS_VALUE *values,UINT32 num_values,DWRITE_TEXT_RANGE *range) {
+    return This->lpVtbl->GetFontAxisValues(This,pos,values,num_values,range);
+}
+static FORCEINLINE DWRITE_AUTOMATIC_FONT_AXES IDWriteTextLayout4_GetAutomaticFontAxes(IDWriteTextLayout4* This) {
+    return This->lpVtbl->GetAutomaticFontAxes(This);
+}
+static FORCEINLINE HRESULT IDWriteTextLayout4_SetAutomaticFontAxes(IDWriteTextLayout4* This,DWRITE_AUTOMATIC_FONT_AXES axes) {
+    return This->lpVtbl->SetAutomaticFontAxes(This,axes);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteTextLayout4_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFallback1 interface
+ */
+#ifndef __IDWriteFontFallback1_INTERFACE_DEFINED__
+#define __IDWriteFontFallback1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFallback1, 0x2397599d, 0xdd0d, 0x4681, 0xbd,0x6a, 0xf4,0xf3,0x1e,0xaa,0xde,0x77);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2397599d-dd0d-4681-bd6a-f4f31eaade77")
+IDWriteFontFallback1 : public IDWriteFontFallback
+{
+    virtual HRESULT STDMETHODCALLTYPE MapCharacters(
+        IDWriteTextAnalysisSource *source,
+        UINT32 pos,
+        UINT32 length,
+        IDWriteFontCollection *base_collection,
+        const WCHAR *familyname,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        UINT32 *mapped_length,
+        FLOAT *scale,
+        IDWriteFontFace5 **fontface) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFallback1, 0x2397599d, 0xdd0d, 0x4681, 0xbd,0x6a, 0xf4,0xf3,0x1e,0xaa,0xde,0x77)
+#endif
+#else
+typedef struct IDWriteFontFallback1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFallback1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFallback1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFallback1 *This);
+
+    /*** IDWriteFontFallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *MapCharacters)(
+        IDWriteFontFallback1 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 position,
+        UINT32 length,
+        IDWriteFontCollection *basecollection,
+        const WCHAR *baseFamilyName,
+        DWRITE_FONT_WEIGHT baseWeight,
+        DWRITE_FONT_STYLE baseStyle,
+        DWRITE_FONT_STRETCH baseStretch,
+        UINT32 *mappedLength,
+        IDWriteFont **mappedFont,
+        FLOAT *scale);
+
+    /*** IDWriteFontFallback1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFallback1_MapCharacters)(
+        IDWriteFontFallback1 *This,
+        IDWriteTextAnalysisSource *source,
+        UINT32 pos,
+        UINT32 length,
+        IDWriteFontCollection *base_collection,
+        const WCHAR *familyname,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        UINT32 *mapped_length,
+        FLOAT *scale,
+        IDWriteFontFace5 **fontface);
+
+    END_INTERFACE
+} IDWriteFontFallback1Vtbl;
+
+interface IDWriteFontFallback1 {
+    CONST_VTBL IDWriteFontFallback1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFallback1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFallback1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFallback1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFallback methods ***/
+/*** IDWriteFontFallback1 methods ***/
+#define IDWriteFontFallback1_MapCharacters(This,source,pos,length,base_collection,familyname,axis_values,num_values,mapped_length,scale,fontface) (This)->lpVtbl->IDWriteFontFallback1_MapCharacters(This,source,pos,length,base_collection,familyname,axis_values,num_values,mapped_length,scale,fontface)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFallback1_QueryInterface(IDWriteFontFallback1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFallback1_AddRef(IDWriteFontFallback1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFallback1_Release(IDWriteFontFallback1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFallback methods ***/
+/*** IDWriteFontFallback1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFallback1_MapCharacters(IDWriteFontFallback1* This,IDWriteTextAnalysisSource *source,UINT32 pos,UINT32 length,IDWriteFontCollection *base_collection,const WCHAR *familyname,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,UINT32 *mapped_length,FLOAT *scale,IDWriteFontFace5 **fontface) {
+    return This->lpVtbl->IDWriteFontFallback1_MapCharacters(This,source,pos,length,base_collection,familyname,axis_values,num_values,mapped_length,scale,fontface);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFallback1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteGdiInterop1 interface
+ */
+#ifndef __IDWriteGdiInterop1_INTERFACE_DEFINED__
+#define __IDWriteGdiInterop1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteGdiInterop1, 0x4556be70, 0x3abd, 0x4f70, 0x90,0xbe, 0x42,0x17,0x80,0xa6,0xf5,0x15);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("4556be70-3abd-4f70-90be-421780a6f515")
+IDWriteGdiInterop1 : public IDWriteGdiInterop
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFromLOGFONT(
+        const LOGFONTW *logfont,
+        IDWriteFontCollection *collection,
+        IDWriteFont **font) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontSignature_(
+        IDWriteFontFace *fontface,
+        FONTSIGNATURE *fontsig) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontSignature(
+        IDWriteFont *font,
+        FONTSIGNATURE *fontsig) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMatchingFontsByLOGFONT(
+        const LOGFONTW *logfont,
+        IDWriteFontSet *fontset,
+        IDWriteFontSet **subset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteGdiInterop1, 0x4556be70, 0x3abd, 0x4f70, 0x90,0xbe, 0x42,0x17,0x80,0xa6,0xf5,0x15)
+#endif
+#else
+typedef struct IDWriteGdiInterop1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteGdiInterop1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteGdiInterop1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteGdiInterop1 *This);
+
+    /*** IDWriteGdiInterop methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateFontFromLOGFONT)(
+        IDWriteGdiInterop1 *This,
+        const LOGFONTW *logfont,
+        IDWriteFont **font);
+
+    HRESULT (STDMETHODCALLTYPE *ConvertFontToLOGFONT)(
+        IDWriteGdiInterop1 *This,
+        IDWriteFont *font,
+        LOGFONTW *logfont,
+        WINBOOL *is_systemfont);
+
+    HRESULT (STDMETHODCALLTYPE *ConvertFontFaceToLOGFONT)(
+        IDWriteGdiInterop1 *This,
+        IDWriteFontFace *font,
+        LOGFONTW *logfont);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceFromHdc)(
+        IDWriteGdiInterop1 *This,
+        HDC hdc,
+        IDWriteFontFace **fontface);
+
+    HRESULT (STDMETHODCALLTYPE *CreateBitmapRenderTarget)(
+        IDWriteGdiInterop1 *This,
+        HDC hdc,
+        UINT32 width,
+        UINT32 height,
+        IDWriteBitmapRenderTarget **target);
+
+    /*** IDWriteGdiInterop1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteGdiInterop1_CreateFontFromLOGFONT)(
+        IDWriteGdiInterop1 *This,
+        const LOGFONTW *logfont,
+        IDWriteFontCollection *collection,
+        IDWriteFont **font);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontSignature_)(
+        IDWriteGdiInterop1 *This,
+        IDWriteFontFace *fontface,
+        FONTSIGNATURE *fontsig);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontSignature)(
+        IDWriteGdiInterop1 *This,
+        IDWriteFont *font,
+        FONTSIGNATURE *fontsig);
+
+    HRESULT (STDMETHODCALLTYPE *GetMatchingFontsByLOGFONT)(
+        IDWriteGdiInterop1 *This,
+        const LOGFONTW *logfont,
+        IDWriteFontSet *fontset,
+        IDWriteFontSet **subset);
+
+    END_INTERFACE
+} IDWriteGdiInterop1Vtbl;
+
+interface IDWriteGdiInterop1 {
+    CONST_VTBL IDWriteGdiInterop1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteGdiInterop1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteGdiInterop1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteGdiInterop1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteGdiInterop methods ***/
+#define IDWriteGdiInterop1_ConvertFontToLOGFONT(This,font,logfont,is_systemfont) (This)->lpVtbl->ConvertFontToLOGFONT(This,font,logfont,is_systemfont)
+#define IDWriteGdiInterop1_ConvertFontFaceToLOGFONT(This,font,logfont) (This)->lpVtbl->ConvertFontFaceToLOGFONT(This,font,logfont)
+#define IDWriteGdiInterop1_CreateFontFaceFromHdc(This,hdc,fontface) (This)->lpVtbl->CreateFontFaceFromHdc(This,hdc,fontface)
+#define IDWriteGdiInterop1_CreateBitmapRenderTarget(This,hdc,width,height,target) (This)->lpVtbl->CreateBitmapRenderTarget(This,hdc,width,height,target)
+/*** IDWriteGdiInterop1 methods ***/
+#define IDWriteGdiInterop1_CreateFontFromLOGFONT(This,logfont,collection,font) (This)->lpVtbl->IDWriteGdiInterop1_CreateFontFromLOGFONT(This,logfont,collection,font)
+#define IDWriteGdiInterop1_GetFontSignature_(This,fontface,fontsig) (This)->lpVtbl->GetFontSignature_(This,fontface,fontsig)
+#define IDWriteGdiInterop1_GetFontSignature(This,font,fontsig) (This)->lpVtbl->GetFontSignature(This,font,fontsig)
+#define IDWriteGdiInterop1_GetMatchingFontsByLOGFONT(This,logfont,fontset,subset) (This)->lpVtbl->GetMatchingFontsByLOGFONT(This,logfont,fontset,subset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteGdiInterop1_QueryInterface(IDWriteGdiInterop1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteGdiInterop1_AddRef(IDWriteGdiInterop1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteGdiInterop1_Release(IDWriteGdiInterop1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteGdiInterop methods ***/
+static FORCEINLINE HRESULT IDWriteGdiInterop1_ConvertFontToLOGFONT(IDWriteGdiInterop1* This,IDWriteFont *font,LOGFONTW *logfont,WINBOOL *is_systemfont) {
+    return This->lpVtbl->ConvertFontToLOGFONT(This,font,logfont,is_systemfont);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop1_ConvertFontFaceToLOGFONT(IDWriteGdiInterop1* This,IDWriteFontFace *font,LOGFONTW *logfont) {
+    return This->lpVtbl->ConvertFontFaceToLOGFONT(This,font,logfont);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop1_CreateFontFaceFromHdc(IDWriteGdiInterop1* This,HDC hdc,IDWriteFontFace **fontface) {
+    return This->lpVtbl->CreateFontFaceFromHdc(This,hdc,fontface);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop1_CreateBitmapRenderTarget(IDWriteGdiInterop1* This,HDC hdc,UINT32 width,UINT32 height,IDWriteBitmapRenderTarget **target) {
+    return This->lpVtbl->CreateBitmapRenderTarget(This,hdc,width,height,target);
+}
+/*** IDWriteGdiInterop1 methods ***/
+static FORCEINLINE HRESULT IDWriteGdiInterop1_CreateFontFromLOGFONT(IDWriteGdiInterop1* This,const LOGFONTW *logfont,IDWriteFontCollection *collection,IDWriteFont **font) {
+    return This->lpVtbl->IDWriteGdiInterop1_CreateFontFromLOGFONT(This,logfont,collection,font);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop1_GetFontSignature_(IDWriteGdiInterop1* This,IDWriteFontFace *fontface,FONTSIGNATURE *fontsig) {
+    return This->lpVtbl->GetFontSignature_(This,fontface,fontsig);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop1_GetFontSignature(IDWriteGdiInterop1* This,IDWriteFont *font,FONTSIGNATURE *fontsig) {
+    return This->lpVtbl->GetFontSignature(This,font,fontsig);
+}
+static FORCEINLINE HRESULT IDWriteGdiInterop1_GetMatchingFontsByLOGFONT(IDWriteGdiInterop1* This,const LOGFONTW *logfont,IDWriteFontSet *fontset,IDWriteFontSet **subset) {
+    return This->lpVtbl->GetMatchingFontsByLOGFONT(This,logfont,fontset,subset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteGdiInterop1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSetBuilder interface
+ */
+#ifndef __IDWriteFontSetBuilder_INTERFACE_DEFINED__
+#define __IDWriteFontSetBuilder_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSetBuilder, 0x2f642afe, 0x9c68, 0x4f40, 0xb8,0xbe, 0x45,0x74,0x01,0xaf,0xcb,0x3d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2f642afe-9c68-4f40-b8be-457401afcb3d")
+IDWriteFontSetBuilder : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddFontFaceReference_(
+        IDWriteFontFaceReference *ref,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 prop_count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddFontFaceReference(
+        IDWriteFontFaceReference *ref) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddFontSet(
+        IDWriteFontSet *fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontSet(
+        IDWriteFontSet **fontset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSetBuilder, 0x2f642afe, 0x9c68, 0x4f40, 0xb8,0xbe, 0x45,0x74,0x01,0xaf,0xcb,0x3d)
+#endif
+#else
+typedef struct IDWriteFontSetBuilderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSetBuilder *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSetBuilder *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSetBuilder *This);
+
+    /*** IDWriteFontSetBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFontFaceReference_)(
+        IDWriteFontSetBuilder *This,
+        IDWriteFontFaceReference *ref,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 prop_count);
+
+    HRESULT (STDMETHODCALLTYPE *AddFontFaceReference)(
+        IDWriteFontSetBuilder *This,
+        IDWriteFontFaceReference *ref);
+
+    HRESULT (STDMETHODCALLTYPE *AddFontSet)(
+        IDWriteFontSetBuilder *This,
+        IDWriteFontSet *fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSet)(
+        IDWriteFontSetBuilder *This,
+        IDWriteFontSet **fontset);
+
+    END_INTERFACE
+} IDWriteFontSetBuilderVtbl;
+
+interface IDWriteFontSetBuilder {
+    CONST_VTBL IDWriteFontSetBuilderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSetBuilder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSetBuilder_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSetBuilder_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSetBuilder methods ***/
+#define IDWriteFontSetBuilder_AddFontFaceReference_(This,ref,props,prop_count) (This)->lpVtbl->AddFontFaceReference_(This,ref,props,prop_count)
+#define IDWriteFontSetBuilder_AddFontFaceReference(This,ref) (This)->lpVtbl->AddFontFaceReference(This,ref)
+#define IDWriteFontSetBuilder_AddFontSet(This,fontset) (This)->lpVtbl->AddFontSet(This,fontset)
+#define IDWriteFontSetBuilder_CreateFontSet(This,fontset) (This)->lpVtbl->CreateFontSet(This,fontset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder_QueryInterface(IDWriteFontSetBuilder* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSetBuilder_AddRef(IDWriteFontSetBuilder* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSetBuilder_Release(IDWriteFontSetBuilder* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSetBuilder methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder_AddFontFaceReference_(IDWriteFontSetBuilder* This,IDWriteFontFaceReference *ref,const DWRITE_FONT_PROPERTY *props,UINT32 prop_count) {
+    return This->lpVtbl->AddFontFaceReference_(This,ref,props,prop_count);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder_AddFontFaceReference(IDWriteFontSetBuilder* This,IDWriteFontFaceReference *ref) {
+    return This->lpVtbl->AddFontFaceReference(This,ref);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder_AddFontSet(IDWriteFontSetBuilder* This,IDWriteFontSet *fontset) {
+    return This->lpVtbl->AddFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder_CreateFontSet(IDWriteFontSetBuilder* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->CreateFontSet(This,fontset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSetBuilder_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSetBuilder1 interface
+ */
+#ifndef __IDWriteFontSetBuilder1_INTERFACE_DEFINED__
+#define __IDWriteFontSetBuilder1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSetBuilder1, 0x3ff7715f, 0x3cdc, 0x4dc6, 0x9b,0x72, 0xec,0x56,0x21,0xdc,0xca,0xfd);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("3ff7715f-3cdc-4dc6-9b72-ec5621dccafd")
+IDWriteFontSetBuilder1 : public IDWriteFontSetBuilder
+{
+    virtual HRESULT STDMETHODCALLTYPE AddFontFile(
+        IDWriteFontFile *file) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSetBuilder1, 0x3ff7715f, 0x3cdc, 0x4dc6, 0x9b,0x72, 0xec,0x56,0x21,0xdc,0xca,0xfd)
+#endif
+#else
+typedef struct IDWriteFontSetBuilder1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSetBuilder1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSetBuilder1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSetBuilder1 *This);
+
+    /*** IDWriteFontSetBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFontFaceReference_)(
+        IDWriteFontSetBuilder1 *This,
+        IDWriteFontFaceReference *ref,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 prop_count);
+
+    HRESULT (STDMETHODCALLTYPE *AddFontFaceReference)(
+        IDWriteFontSetBuilder1 *This,
+        IDWriteFontFaceReference *ref);
+
+    HRESULT (STDMETHODCALLTYPE *AddFontSet)(
+        IDWriteFontSetBuilder1 *This,
+        IDWriteFontSet *fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSet)(
+        IDWriteFontSetBuilder1 *This,
+        IDWriteFontSet **fontset);
+
+    /*** IDWriteFontSetBuilder1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFontFile)(
+        IDWriteFontSetBuilder1 *This,
+        IDWriteFontFile *file);
+
+    END_INTERFACE
+} IDWriteFontSetBuilder1Vtbl;
+
+interface IDWriteFontSetBuilder1 {
+    CONST_VTBL IDWriteFontSetBuilder1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSetBuilder1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSetBuilder1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSetBuilder1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSetBuilder methods ***/
+#define IDWriteFontSetBuilder1_AddFontFaceReference_(This,ref,props,prop_count) (This)->lpVtbl->AddFontFaceReference_(This,ref,props,prop_count)
+#define IDWriteFontSetBuilder1_AddFontFaceReference(This,ref) (This)->lpVtbl->AddFontFaceReference(This,ref)
+#define IDWriteFontSetBuilder1_AddFontSet(This,fontset) (This)->lpVtbl->AddFontSet(This,fontset)
+#define IDWriteFontSetBuilder1_CreateFontSet(This,fontset) (This)->lpVtbl->CreateFontSet(This,fontset)
+/*** IDWriteFontSetBuilder1 methods ***/
+#define IDWriteFontSetBuilder1_AddFontFile(This,file) (This)->lpVtbl->AddFontFile(This,file)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder1_QueryInterface(IDWriteFontSetBuilder1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSetBuilder1_AddRef(IDWriteFontSetBuilder1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSetBuilder1_Release(IDWriteFontSetBuilder1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSetBuilder methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder1_AddFontFaceReference_(IDWriteFontSetBuilder1* This,IDWriteFontFaceReference *ref,const DWRITE_FONT_PROPERTY *props,UINT32 prop_count) {
+    return This->lpVtbl->AddFontFaceReference_(This,ref,props,prop_count);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder1_AddFontFaceReference(IDWriteFontSetBuilder1* This,IDWriteFontFaceReference *ref) {
+    return This->lpVtbl->AddFontFaceReference(This,ref);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder1_AddFontSet(IDWriteFontSetBuilder1* This,IDWriteFontSet *fontset) {
+    return This->lpVtbl->AddFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder1_CreateFontSet(IDWriteFontSetBuilder1* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->CreateFontSet(This,fontset);
+}
+/*** IDWriteFontSetBuilder1 methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder1_AddFontFile(IDWriteFontSetBuilder1* This,IDWriteFontFile *file) {
+    return This->lpVtbl->AddFontFile(This,file);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSetBuilder1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontSetBuilder2 interface
+ */
+#ifndef __IDWriteFontSetBuilder2_INTERFACE_DEFINED__
+#define __IDWriteFontSetBuilder2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontSetBuilder2, 0xee5ba612, 0xb131, 0x463c, 0x8f,0x4f, 0x31,0x89,0xb9,0x40,0x1e,0x45);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ee5ba612-b131-463c-8f4f-3189b9401e45")
+IDWriteFontSetBuilder2 : public IDWriteFontSetBuilder1
+{
+    virtual HRESULT STDMETHODCALLTYPE AddFont(
+        IDWriteFontFile *fontfile,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddFontFile(
+        const WCHAR *filepath) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontSetBuilder2, 0xee5ba612, 0xb131, 0x463c, 0x8f,0x4f, 0x31,0x89,0xb9,0x40,0x1e,0x45)
+#endif
+#else
+typedef struct IDWriteFontSetBuilder2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontSetBuilder2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontSetBuilder2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontSetBuilder2 *This);
+
+    /*** IDWriteFontSetBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFontFaceReference_)(
+        IDWriteFontSetBuilder2 *This,
+        IDWriteFontFaceReference *ref,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 prop_count);
+
+    HRESULT (STDMETHODCALLTYPE *AddFontFaceReference)(
+        IDWriteFontSetBuilder2 *This,
+        IDWriteFontFaceReference *ref);
+
+    HRESULT (STDMETHODCALLTYPE *AddFontSet)(
+        IDWriteFontSetBuilder2 *This,
+        IDWriteFontSet *fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSet)(
+        IDWriteFontSetBuilder2 *This,
+        IDWriteFontSet **fontset);
+
+    /*** IDWriteFontSetBuilder1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFontFile)(
+        IDWriteFontSetBuilder2 *This,
+        IDWriteFontFile *file);
+
+    /*** IDWriteFontSetBuilder2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFont)(
+        IDWriteFontSetBuilder2 *This,
+        IDWriteFontFile *fontfile,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_values,
+        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        const DWRITE_FONT_PROPERTY *props,
+        UINT32 num_properties);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontSetBuilder2_AddFontFile)(
+        IDWriteFontSetBuilder2 *This,
+        const WCHAR *filepath);
+
+    END_INTERFACE
+} IDWriteFontSetBuilder2Vtbl;
+
+interface IDWriteFontSetBuilder2 {
+    CONST_VTBL IDWriteFontSetBuilder2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontSetBuilder2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontSetBuilder2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontSetBuilder2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontSetBuilder methods ***/
+#define IDWriteFontSetBuilder2_AddFontFaceReference_(This,ref,props,prop_count) (This)->lpVtbl->AddFontFaceReference_(This,ref,props,prop_count)
+#define IDWriteFontSetBuilder2_AddFontFaceReference(This,ref) (This)->lpVtbl->AddFontFaceReference(This,ref)
+#define IDWriteFontSetBuilder2_AddFontSet(This,fontset) (This)->lpVtbl->AddFontSet(This,fontset)
+#define IDWriteFontSetBuilder2_CreateFontSet(This,fontset) (This)->lpVtbl->CreateFontSet(This,fontset)
+/*** IDWriteFontSetBuilder1 methods ***/
+/*** IDWriteFontSetBuilder2 methods ***/
+#define IDWriteFontSetBuilder2_AddFont(This,fontfile,face_index,simulations,axis_values,num_values,axis_ranges,num_ranges,props,num_properties) (This)->lpVtbl->AddFont(This,fontfile,face_index,simulations,axis_values,num_values,axis_ranges,num_ranges,props,num_properties)
+#define IDWriteFontSetBuilder2_AddFontFile(This,filepath) (This)->lpVtbl->IDWriteFontSetBuilder2_AddFontFile(This,filepath)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_QueryInterface(IDWriteFontSetBuilder2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontSetBuilder2_AddRef(IDWriteFontSetBuilder2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontSetBuilder2_Release(IDWriteFontSetBuilder2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontSetBuilder methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_AddFontFaceReference_(IDWriteFontSetBuilder2* This,IDWriteFontFaceReference *ref,const DWRITE_FONT_PROPERTY *props,UINT32 prop_count) {
+    return This->lpVtbl->AddFontFaceReference_(This,ref,props,prop_count);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_AddFontFaceReference(IDWriteFontSetBuilder2* This,IDWriteFontFaceReference *ref) {
+    return This->lpVtbl->AddFontFaceReference(This,ref);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_AddFontSet(IDWriteFontSetBuilder2* This,IDWriteFontSet *fontset) {
+    return This->lpVtbl->AddFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_CreateFontSet(IDWriteFontSetBuilder2* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->CreateFontSet(This,fontset);
+}
+/*** IDWriteFontSetBuilder1 methods ***/
+/*** IDWriteFontSetBuilder2 methods ***/
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_AddFont(IDWriteFontSetBuilder2* This,IDWriteFontFile *fontfile,UINT32 face_index,DWRITE_FONT_SIMULATIONS simulations,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values,const DWRITE_FONT_AXIS_RANGE *axis_ranges,UINT32 num_ranges,const DWRITE_FONT_PROPERTY *props,UINT32 num_properties) {
+    return This->lpVtbl->AddFont(This,fontfile,face_index,simulations,axis_values,num_values,axis_ranges,num_ranges,props,num_properties);
+}
+static FORCEINLINE HRESULT IDWriteFontSetBuilder2_AddFontFile(IDWriteFontSetBuilder2* This,const WCHAR *filepath) {
+    return This->lpVtbl->IDWriteFontSetBuilder2_AddFontFile(This,filepath);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontSetBuilder2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory3 interface
+ */
+#ifndef __IDWriteFactory3_INTERFACE_DEFINED__
+#define __IDWriteFactory3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory3, 0x9a1b41c3, 0xd3bb, 0x466a, 0x87,0xfc, 0xfe,0x67,0x55,0x6a,0x3b,0x65);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("9a1b41c3-d3bb-466a-87fc-fe67556a3b65")
+IDWriteFactory3 : public IDWriteFactory2
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateGlyphRunAnalysis(
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomRenderingParams(
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFaceReference_(
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFaceReference(
+        const WCHAR *path,
+        const FILETIME *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontSet(
+        IDWriteFontSet **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontSetBuilder(
+        IDWriteFontSetBuilder **builder) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontCollectionFromFontSet(
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontCollection(
+        WINBOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        WINBOOL check_for_updates) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontDownloadQueue(
+        IDWriteFontDownloadQueue **queue) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory3, 0x9a1b41c3, 0xd3bb, 0x466a, 0x87,0xfc, 0xfe,0x67,0x55,0x6a,0x3b,0x65)
+#endif
+#else
+typedef struct IDWriteFactory3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory3 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory3 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory3 *This);
+
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory3 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory3 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory3 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory3 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory3 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory3 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory3 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory3 *This,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory3 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory3 *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory3 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory3 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory3 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory3 *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory3 *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory3 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory3 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory3 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory3 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory3 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory3 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory3 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory3 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
+
+    /*** IDWriteFactory2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontFallback)(
+        IDWriteFactory3 *This,
+        IDWriteFontFallback **fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallbackBuilder)(
+        IDWriteFactory3 *This,
+        IDWriteFontFallbackBuilder **fallbackbuilder);
+
+    HRESULT (STDMETHODCALLTYPE *TranslateColorGlyphRun)(
+        IDWriteFactory3 *This,
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateCustomRenderingParams)(
+        IDWriteFactory3 *This,
+        FLOAT gamma,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        IDWriteRenderingParams2 **params);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateGlyphRunAnalysis)(
+        IDWriteFactory3 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_MEASURING_MODE measuringMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateGlyphRunAnalysis)(
+        IDWriteFactory3 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateCustomRenderingParams)(
+        IDWriteFactory3 *This,
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference_)(
+        IDWriteFactory3 *This,
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference)(
+        IDWriteFactory3 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontSet)(
+        IDWriteFactory3 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSetBuilder)(
+        IDWriteFactory3 *This,
+        IDWriteFontSetBuilder **builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontCollectionFromFontSet)(
+        IDWriteFactory3 *This,
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_GetSystemFontCollection)(
+        IDWriteFactory3 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontDownloadQueue)(
+        IDWriteFactory3 *This,
+        IDWriteFontDownloadQueue **queue);
+
+    END_INTERFACE
+} IDWriteFactory3Vtbl;
+
+interface IDWriteFactory3 {
+    CONST_VTBL IDWriteFactory3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory3_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory3_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory3_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory3_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory3_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory3_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory3_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory3_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory3_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory3_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory3_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory3_CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format) (This)->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format)
+#define IDWriteFactory3_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory3_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory3_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory3_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory3_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory3_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory3_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory3_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+/*** IDWriteFactory2 methods ***/
+#define IDWriteFactory3_GetSystemFontFallback(This,fallback) (This)->lpVtbl->GetSystemFontFallback(This,fallback)
+#define IDWriteFactory3_CreateFontFallbackBuilder(This,fallbackbuilder) (This)->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder)
+#define IDWriteFactory3_TranslateColorGlyphRun(This,originX,originY,run,rundescr,mode,transform,palette_index,colorlayers) (This)->lpVtbl->TranslateColorGlyphRun(This,originX,originY,run,rundescr,mode,transform,palette_index,colorlayers)
+/*** IDWriteFactory3 methods ***/
+#define IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis) (This)->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis)
+#define IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params) (This)->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params)
+#define IDWriteFactory3_CreateFontFaceReference_(This,file,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference)
+#define IDWriteFactory3_CreateFontFaceReference(This,path,writetime,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference(This,path,writetime,index,simulations,reference)
+#define IDWriteFactory3_GetSystemFontSet(This,fontset) (This)->lpVtbl->GetSystemFontSet(This,fontset)
+#define IDWriteFactory3_CreateFontSetBuilder(This,builder) (This)->lpVtbl->CreateFontSetBuilder(This,builder)
+#define IDWriteFactory3_CreateFontCollectionFromFontSet(This,fontset,collection) (This)->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection)
+#define IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates) (This)->lpVtbl->IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates)
+#define IDWriteFactory3_GetFontDownloadQueue(This,queue) (This)->lpVtbl->GetFontDownloadQueue(This,queue)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory3_QueryInterface(IDWriteFactory3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory3_AddRef(IDWriteFactory3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory3_Release(IDWriteFactory3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory3_CreateCustomFontCollection(IDWriteFactory3* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_RegisterFontCollectionLoader(IDWriteFactory3* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_UnregisterFontCollectionLoader(IDWriteFactory3* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontFileReference(IDWriteFactory3* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateCustomFontFileReference(IDWriteFactory3* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontFace(IDWriteFactory3* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateRenderingParams(IDWriteFactory3* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateMonitorRenderingParams(IDWriteFactory3* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_RegisterFontFileLoader(IDWriteFactory3* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_UnregisterFontFileLoader(IDWriteFactory3* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateTextFormat(IDWriteFactory3* This,const WCHAR *family_name,IDWriteFontCollection *collection,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STYLE style,DWRITE_FONT_STRETCH stretch,FLOAT size,const WCHAR *locale,IDWriteTextFormat **format) {
+    return This->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateTypography(IDWriteFactory3* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_GetGdiInterop(IDWriteFactory3* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateTextLayout(IDWriteFactory3* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateGdiCompatibleTextLayout(IDWriteFactory3* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateEllipsisTrimmingSign(IDWriteFactory3* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateTextAnalyzer(IDWriteFactory3* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateNumberSubstitution(IDWriteFactory3* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory3_GetEudcFontCollection(IDWriteFactory3* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+/*** IDWriteFactory2 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory3_GetSystemFontFallback(IDWriteFactory3* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetSystemFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontFallbackBuilder(IDWriteFactory3* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
+    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_TranslateColorGlyphRun(IDWriteFactory3* This,FLOAT originX,FLOAT originY,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,DWRITE_MEASURING_MODE mode,const DWRITE_MATRIX *transform,UINT32 palette_index,IDWriteColorGlyphRunEnumerator **colorlayers) {
+    return This->lpVtbl->TranslateColorGlyphRun(This,originX,originY,run,rundescr,mode,transform,palette_index,colorlayers);
+}
+/*** IDWriteFactory3 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory3_CreateGlyphRunAnalysis(IDWriteFactory3* This,const DWRITE_GLYPH_RUN *run,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_MEASURING_MODE measuring_mode,DWRITE_GRID_FIT_MODE gridfit_mode,DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,FLOAT origin_x,FLOAT origin_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateCustomRenderingParams(IDWriteFactory3* This,FLOAT gamma,FLOAT enhanced_contrast,FLOAT grayscale_enhanced_contrast,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY pixel_geometry,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_GRID_FIT_MODE gridfit_mode,IDWriteRenderingParams3 **params) {
+    return This->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontFaceReference_(IDWriteFactory3* This,IDWriteFontFile *file,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontFaceReference(IDWriteFactory3* This,const WCHAR *path,const FILETIME *writetime,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference(This,path,writetime,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_GetSystemFontSet(IDWriteFactory3* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetSystemFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontSetBuilder(IDWriteFactory3* This,IDWriteFontSetBuilder **builder) {
+    return This->lpVtbl->CreateFontSetBuilder(This,builder);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_CreateFontCollectionFromFontSet(IDWriteFactory3* This,IDWriteFontSet *fontset,IDWriteFontCollection1 **collection) {
+    return This->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_GetSystemFontCollection(IDWriteFactory3* This,WINBOOL include_downloadable,IDWriteFontCollection1 **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory3_GetFontDownloadQueue(IDWriteFactory3* This,IDWriteFontDownloadQueue **queue) {
+    return This->lpVtbl->GetFontDownloadQueue(This,queue);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFactory3_INTERFACE_DEFINED__ */
+
+typedef struct DWRITE_GLYPH_IMAGE_DATA {
+    const void *imageData;
     UINT32 imageDataSize;
     UINT32 uniqueDataId;
     UINT32 pixelsPerEm;
@@ -47,541 +8156,4051 @@
     D2D1_POINT_2L horizontalRightOrigin;
     D2D1_POINT_2L verticalTopOrigin;
     D2D1_POINT_2L verticalBottomOrigin;
-};
+} DWRITE_GLYPH_IMAGE_DATA;
+/*****************************************************************************
+ * IDWriteFontFace4 interface
+ */
+#ifndef __IDWriteFontFace4_INTERFACE_DEFINED__
+#define __IDWriteFontFace4_INTERFACE_DEFINED__
 
-struct DWRITE_FONT_AXIS_VALUE {
-    DWRITE_FONT_AXIS_TAG axisTag;
-    FLOAT value;
-};
-
-struct DWRITE_FONT_AXIS_RANGE {
-    DWRITE_FONT_AXIS_TAG axisTag;
-    FLOAT minValue;
-    FLOAT maxValue;
-};
-
-interface IDWriteFontResource;
-interface IDWriteFontFaceReference1;
-interface IDWriteFontFaceReference;
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFace3
-DECLARE_INTERFACE_(IDWriteFontFace3,IDWriteFontFace2)
+DEFINE_GUID(IID_IDWriteFontFace4, 0x27f2a904, 0x4eb8, 0x441d, 0x96,0x78, 0x05,0x63,0xf5,0x3e,0x3e,0x2f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("27f2a904-4eb8-441d-9678-0563f53e3e2f")
+IDWriteFontFace4 : public IDWriteFontFace3
 {
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphImageFormats_(
+        UINT16 glyph,
+        UINT32 ppem_first,
+        UINT32 ppem_last,
+        DWRITE_GLYPH_IMAGE_FORMATS *formats) = 0;
+
+    virtual DWRITE_GLYPH_IMAGE_FORMATS STDMETHODCALLTYPE GetGlyphImageFormats(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGlyphImageData(
+        UINT16 glyph,
+        UINT32 ppem,
+        DWRITE_GLYPH_IMAGE_FORMATS format,
+        DWRITE_GLYPH_IMAGE_DATA *data,
+        void **context) = 0;
+
+    virtual void STDMETHODCALLTYPE ReleaseGlyphImageData(
+        void *context) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFace4, 0x27f2a904, 0x4eb8, 0x441d, 0x96,0x78, 0x05,0x63,0xf5,0x3e,0x3e,0x2f)
+#endif
+#else
+typedef struct IDWriteFontFace4Vtbl {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFace4 *This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDWriteFontFace methods */
-    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD(GetFiles)(THIS_
-        UINT32 *numberOfFiles,
-        IDWriteFontFile **fontFiles) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD_(UINT32, GetIndex)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)(THIS) PURE;
-    STDMETHOD_(WINBOOL, IsSymbolFont)(THIS) PURE;
+    /*** IDWriteFontFace methods ***/
+    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
+    HRESULT (STDMETHODCALLTYPE *GetFiles)(
+        IDWriteFontFace4 *This,
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles);
 
-    STDMETHOD_(UINT16, GetGlyphCount)(THIS) PURE;
+    UINT32 (STDMETHODCALLTYPE *GetIndex)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD(GetDesignGlyphMetrics)(THIS_
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD(GetGlyphIndices)(THIS_
-        UINT32 const *codePoints,
-        UINT32 codePointCount,
-        UINT16 *glyphIndices) PURE;
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD(TryGetFontTable)(THIS_
-        UINT32 openTypeTableTag,
-        const void **tableData,
-        UINT32 *tableSize,
-        void **tableContext,
-        WINBOOL *exists) PURE;
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFontFace4 *This,
+        DWRITE_FONT_METRICS *metrics);
 
-    STDMETHOD_(void, ReleaseFontTable)(THIS_
-        void *tableContext) PURE;
+    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
+        IDWriteFontFace4 *This);
 
-    STDMETHOD(GetGlyphRunOutline)(THIS_
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
+        IDWriteFontFace4 *This,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
+        IDWriteFontFace4 *This,
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
+        IDWriteFontFace4 *This,
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists);
+
+    void (STDMETHODCALLTYPE *ReleaseFontTable)(
+        IDWriteFontFace4 *This,
+        void *table_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
+        IDWriteFontFace4 *This,
         FLOAT emSize,
-        UINT16 const *glyphIndices,
-        FLOAT const *glyphAdvances,
-        DWRITE_GLYPH_OFFSET const *glyphOffsets,
-        UINT32 glyphCount,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        IDWriteGeometrySink *geometrySink) PURE;
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
 
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
+    HRESULT (STDMETHODCALLTYPE *GetRecommendedRenderingMode)(
+        IDWriteFontFace4 *This,
         FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE *renderingMode) PURE;
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode);
 
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
+        IDWriteFontFace4 *This,
         FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics);
 
-    STDMETHOD(GetGdiCompatibleGlyphMetrics)(THIS_
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
+        IDWriteFontFace4 *This,
         FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
 
-    /* IDWriteFontFace1 methods */
-    STDMETHOD_(void, GetMetrics)(THIS_ DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD_(void, GetCaretMetrics)(THIS_ DWRITE_CARET_METRICS*) PURE;
-    STDMETHOD(GetUnicodeRanges)(THIS_ UINT32, DWRITE_UNICODE_RANGE*,UINT32*) PURE;
-    STDMETHOD_(BOOL, IsMonospacedFont)(THIS) PURE;
-    STDMETHOD(GetDesignGlyphAdvances)(THIS_ UINT32,UINT16 const*,INT32*,BOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-    STDMETHOD(GetGdiCompatibleGlyphAdvances)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,BOOL,UINT32,
-            UINT16 const*,INT32*) PURE;
-    STDMETHOD(GetKerningPairAdjustments)(THIS_ UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(THIS);
-    STDMETHOD(GetRecommendedRenderingMode)(FLOAT,FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,
-            DWRITE_OUTLINE_THRESHOLD,DWRITE_MEASURING_MODE,DWRITE_RENDERING_MODE*) PURE;
-    STDMETHOD(GetVerticalGlyphVariants)(THIS_ UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(THIS);
+    /*** IDWriteFontFace1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFontFace1_GetMetrics)(
+        IDWriteFontFace4 *This,
+        DWRITE_FONT_METRICS1 *metrics);
 
-    /* IDWriteFontFace2 methods */
-    STDMETHOD_(BOOL, IsColorFont)(THIS) PURE;
-    STDMETHOD_(UINT32, GetColorPaletteCount)(THIS) PURE;
-    STDMETHOD_(UINT32, GetPaletteEntryCount)(THIS) PURE;
-        STDMETHOD(GetPaletteEntries)(THIS_
-        UINT32 colorPaletteIndex,
-        UINT32 firstEntryIndex,
-        UINT32 entryCount,
-        DWRITE_COLOR_F* paletteEntries
-        ) PURE;
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
+        IDWriteFontFace4 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS1 *metrics);
 
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
+    void (STDMETHODCALLTYPE *GetCaretMetrics)(
+        IDWriteFontFace4 *This,
+        DWRITE_CARET_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFontFace4 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFontFace4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
+        IDWriteFontFace4 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
+        IDWriteFontFace4 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances);
+
+    HRESULT (STDMETHODCALLTYPE *GetKerningPairAdjustments)(
+        IDWriteFontFace4 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *adjustments);
+
+    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
+        IDWriteFontFace4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
+        IDWriteFontFace4 *This,
+        FLOAT font_emsize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetVerticalGlyphVariants)(
+        IDWriteFontFace4 *This,
+        UINT32 glyph_count,
+        const UINT16 *nominal_indices,
+        UINT16 *vertical_indices);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
+        IDWriteFontFace4 *This);
+
+    /*** IDWriteFontFace2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
+        IDWriteFontFace4 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetColorPaletteCount)(
+        IDWriteFontFace4 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetPaletteEntryCount)(
+        IDWriteFontFace4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetPaletteEntries)(
+        IDWriteFontFace4 *This,
+        UINT32 palette_index,
+        UINT32 first_entry_index,
+        UINT32 entry_count,
+        DWRITE_COLOR_F *entries);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace2_GetRecommendedRenderingMode)(
+        IDWriteFontFace4 *This,
         FLOAT fontEmSize,
         FLOAT dpiX,
         FLOAT dpiY,
-        DWRITE_MATRIX const* transform,
-        BOOL isSideways,
-        DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams* renderingParams,
-        DWRITE_RENDERING_MODE* renderingMode,
-        DWRITE_GRID_FIT_MODE* gridFitMode
-        ) PURE;
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuringmode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *renderingmode,
+        DWRITE_GRID_FIT_MODE *gridfitmode);
+
+    /*** IDWriteFontFace3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontFace4 *This,
+        IDWriteFontFaceReference **reference);
+
+    void (STDMETHODCALLTYPE *GetPanose)(
+        IDWriteFontFace4 *This,
+        DWRITE_PANOSE *panose);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFontFace4 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFontFace4 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFontFace4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
+        IDWriteFontFace4 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFontFace4 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFontFace4 *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    WINBOOL (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFontFace4 *This,
+        UINT32 character);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace3_GetRecommendedRenderingMode)(
+        IDWriteFontFace4 *This,
+        FLOAT emsize,
+        FLOAT dpi_x,
+        FLOAT dpi_y,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE1 *rendering_mode,
+        DWRITE_GRID_FIT_MODE *gridfit_mode);
+
+    WINBOOL (STDMETHODCALLTYPE *IsCharacterLocal)(
+        IDWriteFontFace4 *This,
+        UINT32 character);
+
+    WINBOOL (STDMETHODCALLTYPE *IsGlyphLocal)(
+        IDWriteFontFace4 *This,
+        UINT16 glyph);
+
+    HRESULT (STDMETHODCALLTYPE *AreCharactersLocal)(
+        IDWriteFontFace4 *This,
+        const WCHAR *characters,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local);
+
+    HRESULT (STDMETHODCALLTYPE *AreGlyphsLocal)(
+        IDWriteFontFace4 *This,
+        const UINT16 *glyphs,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local);
+
+    /*** IDWriteFontFace4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)(
+        IDWriteFontFace4 *This,
+        UINT16 glyph,
+        UINT32 ppem_first,
+        UINT32 ppem_last,
+        DWRITE_GLYPH_IMAGE_FORMATS *formats);
+
+    DWRITE_GLYPH_IMAGE_FORMATS (STDMETHODCALLTYPE *GetGlyphImageFormats)(
+        IDWriteFontFace4 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphImageData)(
+        IDWriteFontFace4 *This,
+        UINT16 glyph,
+        UINT32 ppem,
+        DWRITE_GLYPH_IMAGE_FORMATS format,
+        DWRITE_GLYPH_IMAGE_DATA *data,
+        void **context);
+
+    void (STDMETHODCALLTYPE *ReleaseGlyphImageData)(
+        IDWriteFontFace4 *This,
+        void *context);
+
+    END_INTERFACE
+} IDWriteFontFace4Vtbl;
+
+interface IDWriteFontFace4 {
+    CONST_VTBL IDWriteFontFace4Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFace4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFace4_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFace4_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFace methods ***/
+#define IDWriteFontFace4_GetType(This) (This)->lpVtbl->GetType(This)
+#define IDWriteFontFace4_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
+#define IDWriteFontFace4_GetIndex(This) (This)->lpVtbl->GetIndex(This)
+#define IDWriteFontFace4_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFace4_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFontFace4_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
+#define IDWriteFontFace4_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
+#define IDWriteFontFace4_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
+#define IDWriteFontFace4_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
+#define IDWriteFontFace4_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
+#define IDWriteFontFace4_GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink)
+#define IDWriteFontFace4_GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways)
+/*** IDWriteFontFace1 methods ***/
+#define IDWriteFontFace4_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
+#define IDWriteFontFace4_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
+#define IDWriteFontFace4_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
+#define IDWriteFontFace4_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFontFace4_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+#define IDWriteFontFace4_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
+#define IDWriteFontFace4_GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances) (This)->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances)
+#define IDWriteFontFace4_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
+#define IDWriteFontFace4_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
+#define IDWriteFontFace4_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
+#define IDWriteFontFace4_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
+/*** IDWriteFontFace2 methods ***/
+#define IDWriteFontFace4_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
+#define IDWriteFontFace4_GetColorPaletteCount(This) (This)->lpVtbl->GetColorPaletteCount(This)
+#define IDWriteFontFace4_GetPaletteEntryCount(This) (This)->lpVtbl->GetPaletteEntryCount(This)
+#define IDWriteFontFace4_GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries) (This)->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries)
+/*** IDWriteFontFace3 methods ***/
+#define IDWriteFontFace4_GetFontFaceReference(This,reference) (This)->lpVtbl->GetFontFaceReference(This,reference)
+#define IDWriteFontFace4_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
+#define IDWriteFontFace4_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFontFace4_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFontFace4_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFontFace4_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
+#define IDWriteFontFace4_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFontFace4_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFontFace4_HasCharacter(This,character) (This)->lpVtbl->HasCharacter(This,character)
+#define IDWriteFontFace4_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode) (This)->lpVtbl->IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode)
+#define IDWriteFontFace4_IsCharacterLocal(This,character) (This)->lpVtbl->IsCharacterLocal(This,character)
+#define IDWriteFontFace4_IsGlyphLocal(This,glyph) (This)->lpVtbl->IsGlyphLocal(This,glyph)
+#define IDWriteFontFace4_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
+#define IDWriteFontFace4_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
+/*** IDWriteFontFace4 methods ***/
+#define IDWriteFontFace4_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats)
+#define IDWriteFontFace4_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This)
+#define IDWriteFontFace4_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context)
+#define IDWriteFontFace4_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace4_QueryInterface(IDWriteFontFace4* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFace4_AddRef(IDWriteFontFace4* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFace4_Release(IDWriteFontFace4* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFace methods ***/
+static FORCEINLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace4_GetType(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetType(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetFiles(IDWriteFontFace4* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
+    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
+}
+static FORCEINLINE UINT32 IDWriteFontFace4_GetIndex(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace4_GetSimulations(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_IsSymbolFont(IDWriteFontFace4* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE UINT16 IDWriteFontFace4_GetGlyphCount(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetGlyphCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetDesignGlyphMetrics(IDWriteFontFace4* This,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphIndices(IDWriteFontFace4* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
+    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_TryGetFontTable(IDWriteFontFace4* This,UINT32 table_tag,const void **table_data,UINT32 *table_size,void **context,WINBOOL *exists) {
+    return This->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists);
+}
+static FORCEINLINE void IDWriteFontFace4_ReleaseFontTable(IDWriteFontFace4* This,void *table_context) {
+    This->lpVtbl->ReleaseFontTable(This,table_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphRunOutline(IDWriteFontFace4* This,FLOAT emSize,const UINT16 *glyph_indices,const FLOAT *glyph_advances,const DWRITE_GLYPH_OFFSET *glyph_offsets,UINT32 glyph_count,WINBOOL is_sideways,WINBOOL is_rtl,IDWriteGeometrySink *geometrysink) {
+    return This->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGdiCompatibleGlyphMetrics(IDWriteFontFace4* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways);
+}
+/*** IDWriteFontFace1 methods ***/
+static FORCEINLINE void IDWriteFontFace4_GetMetrics(IDWriteFontFace4* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGdiCompatibleMetrics(IDWriteFontFace4* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_FONT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics);
+}
+static FORCEINLINE void IDWriteFontFace4_GetCaretMetrics(IDWriteFontFace4* This,DWRITE_CARET_METRICS *metrics) {
+    This->lpVtbl->GetCaretMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetUnicodeRanges(IDWriteFontFace4* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_IsMonospacedFont(IDWriteFontFace4* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetDesignGlyphAdvances(IDWriteFontFace4* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGdiCompatibleGlyphAdvances(IDWriteFontFace4* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,UINT32 glyph_count,const UINT16 *indices,INT32 *advances) {
+    return This->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetKerningPairAdjustments(IDWriteFontFace4* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
+    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_HasKerningPairs(IDWriteFontFace4* This) {
+    return This->lpVtbl->HasKerningPairs(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetVerticalGlyphVariants(IDWriteFontFace4* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
+    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_HasVerticalGlyphVariants(IDWriteFontFace4* This) {
+    return This->lpVtbl->HasVerticalGlyphVariants(This);
+}
+/*** IDWriteFontFace2 methods ***/
+static FORCEINLINE WINBOOL IDWriteFontFace4_IsColorFont(IDWriteFontFace4* This) {
+    return This->lpVtbl->IsColorFont(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace4_GetColorPaletteCount(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetColorPaletteCount(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace4_GetPaletteEntryCount(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetPaletteEntryCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetPaletteEntries(IDWriteFontFace4* This,UINT32 palette_index,UINT32 first_entry_index,UINT32 entry_count,DWRITE_COLOR_F *entries) {
+    return This->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries);
+}
+/*** IDWriteFontFace3 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace4_GetFontFaceReference(IDWriteFontFace4* This,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,reference);
+}
+static FORCEINLINE void IDWriteFontFace4_GetPanose(IDWriteFontFace4* This,DWRITE_PANOSE *panose) {
+    This->lpVtbl->GetPanose(This,panose);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFontFace4_GetWeight(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFontFace4_GetStretch(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFontFace4_GetStyle(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetFamilyNames(IDWriteFontFace4* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFamilyNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetFaceNames(IDWriteFontFace4* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetInformationalStrings(IDWriteFontFace4* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_HasCharacter(IDWriteFontFace4* This,UINT32 character) {
+    return This->lpVtbl->HasCharacter(This,character);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetRecommendedRenderingMode(IDWriteFontFace4* This,FLOAT emsize,FLOAT dpi_x,FLOAT dpi_y,const DWRITE_MATRIX *transform,WINBOOL is_sideways,DWRITE_OUTLINE_THRESHOLD threshold,DWRITE_MEASURING_MODE measuring_mode,IDWriteRenderingParams *params,DWRITE_RENDERING_MODE1 *rendering_mode,DWRITE_GRID_FIT_MODE *gridfit_mode) {
+    return This->lpVtbl->IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_IsCharacterLocal(IDWriteFontFace4* This,UINT32 character) {
+    return This->lpVtbl->IsCharacterLocal(This,character);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace4_IsGlyphLocal(IDWriteFontFace4* This,UINT16 glyph) {
+    return This->lpVtbl->IsGlyphLocal(This,glyph);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_AreCharactersLocal(IDWriteFontFace4* This,const WCHAR *characters,UINT32 count,WINBOOL enqueue_if_not,WINBOOL *are_local) {
+    return This->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_AreGlyphsLocal(IDWriteFontFace4* This,const UINT16 *glyphs,UINT32 count,WINBOOL enqueue_if_not,WINBOOL *are_local) {
+    return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local);
+}
+/*** IDWriteFontFace4 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphImageFormats_(IDWriteFontFace4* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) {
+    return This->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats);
+}
+static FORCEINLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace4_GetGlyphImageFormats(IDWriteFontFace4* This) {
+    return This->lpVtbl->GetGlyphImageFormats(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphImageData(IDWriteFontFace4* This,UINT16 glyph,UINT32 ppem,DWRITE_GLYPH_IMAGE_FORMATS format,DWRITE_GLYPH_IMAGE_DATA *data,void **context) {
+    return This->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context);
+}
+static FORCEINLINE void IDWriteFontFace4_ReleaseGlyphImageData(IDWriteFontFace4* This,void *context) {
+    This->lpVtbl->ReleaseGlyphImageData(This,context);
+}
+#endif
 #endif
 
-    /* IDWriteFontFace3 methods */
-    STDMETHOD(GetFontFaceReference)(THIS_ IDWriteFontFaceReference **fontFaceReference) PURE;
-    STDMETHOD_(void, GetPanose)(THIS_ DWRITE_PANOSE *panose) PURE;
-    STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)(THIS) PURE;
-    STDMETHOD(GetFamilyNames)(THIS_ IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD(GetFaceNames)(THIS_ IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD(GetInformationalStrings)(THIS_ DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
-        IDWriteLocalizedStrings **informationalStrings, BOOL *exists) PURE;
-    STDMETHOD_(BOOL, HasCharacter)(THIS_ UINT32 unicodeValue) PURE;
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_ FLOAT fontEmSize, FLOAT dpiX, FLOAT dpiY,
-        DWRITE_MATRIX const *transform, BOOL isSideways, DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode, IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE1 *renderingMode, DWRITE_GRID_FIT_MODE *gridFitMode) PURE;
+#endif
+
+
+#endif  /* __IDWriteFontFace4_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFontFace5 interface
+ */
+#ifndef __IDWriteFontFace5_INTERFACE_DEFINED__
+#define __IDWriteFontFace5_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFontFace5, 0x98eff3a5, 0xb667, 0x479a, 0xb1,0x45, 0xe2,0xfa,0x5b,0x9f,0xdc,0x29);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("98eff3a5-b667-479a-b145-e2fa5b9fdc29")
+IDWriteFontFace5 : public IDWriteFontFace4
+{
+    virtual UINT32 STDMETHODCALLTYPE GetFontAxisValueCount(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 value_count) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE HasVariations(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFontResource(
+        IDWriteFontResource **resource) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE Equals(
+        IDWriteFontFace *fontface) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFontFace5, 0x98eff3a5, 0xb667, 0x479a, 0xb1,0x45, 0xe2,0xfa,0x5b,0x9f,0xdc,0x29)
+#endif
+#else
+typedef struct IDWriteFontFace5Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFontFace5 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFontFace5 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFontFace5 *This);
+
+    /*** IDWriteFontFace methods ***/
+    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiles)(
+        IDWriteFontFace5 *This,
+        UINT32 *number_of_files,
+        IDWriteFontFile **fontfiles);
+
+    UINT32 (STDMETHODCALLTYPE *GetIndex)(
+        IDWriteFontFace5 *This);
+
+    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
+        IDWriteFontFace5 *This);
+
+    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
+        IDWriteFontFace5 *This);
+
+    void (STDMETHODCALLTYPE *GetMetrics)(
+        IDWriteFontFace5 *This,
+        DWRITE_FONT_METRICS *metrics);
+
+    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
+        IDWriteFontFace5 *This,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
+        IDWriteFontFace5 *This,
+        const UINT32 *codepoints,
+        UINT32 count,
+        UINT16 *glyph_indices);
+
+    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
+        IDWriteFontFace5 *This,
+        UINT32 table_tag,
+        const void **table_data,
+        UINT32 *table_size,
+        void **context,
+        WINBOOL *exists);
+
+    void (STDMETHODCALLTYPE *ReleaseFontTable)(
+        IDWriteFontFace5 *This,
+        void *table_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
+        IDWriteFontFace5 *This,
+        FLOAT emSize,
+        const UINT16 *glyph_indices,
+        const FLOAT *glyph_advances,
+        const DWRITE_GLYPH_OFFSET *glyph_offsets,
+        UINT32 glyph_count,
+        WINBOOL is_sideways,
+        WINBOOL is_rtl,
+        IDWriteGeometrySink *geometrysink);
+
+    HRESULT (STDMETHODCALLTYPE *GetRecommendedRenderingMode)(
+        IDWriteFontFace5 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        DWRITE_MEASURING_MODE mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
+        IDWriteFontFace5 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
+        IDWriteFontFace5 *This,
+        FLOAT emSize,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        const UINT16 *glyph_indices,
+        UINT32 glyph_count,
+        DWRITE_GLYPH_METRICS *metrics,
+        WINBOOL is_sideways);
+
+    /*** IDWriteFontFace1 methods ***/
+    void (STDMETHODCALLTYPE *IDWriteFontFace1_GetMetrics)(
+        IDWriteFontFace5 *This,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
+        IDWriteFontFace5 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_FONT_METRICS1 *metrics);
+
+    void (STDMETHODCALLTYPE *GetCaretMetrics)(
+        IDWriteFontFace5 *This,
+        DWRITE_CARET_METRICS *metrics);
+
+    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
+        IDWriteFontFace5 *This,
+        UINT32 max_count,
+        DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *count);
+
+    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
+        IDWriteFontFace5 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances,
+        WINBOOL is_sideways);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
+        IDWriteFontFace5 *This,
+        FLOAT em_size,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        WINBOOL is_sideways,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *advances);
+
+    HRESULT (STDMETHODCALLTYPE *GetKerningPairAdjustments)(
+        IDWriteFontFace5 *This,
+        UINT32 glyph_count,
+        const UINT16 *indices,
+        INT32 *adjustments);
+
+    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
+        IDWriteFontFace5 *This,
+        FLOAT font_emsize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_RENDERING_MODE *rendering_mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetVerticalGlyphVariants)(
+        IDWriteFontFace5 *This,
+        UINT32 glyph_count,
+        const UINT16 *nominal_indices,
+        UINT16 *vertical_indices);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
+        IDWriteFontFace5 *This);
+
+    /*** IDWriteFontFace2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
+        IDWriteFontFace5 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetColorPaletteCount)(
+        IDWriteFontFace5 *This);
+
+    UINT32 (STDMETHODCALLTYPE *GetPaletteEntryCount)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetPaletteEntries)(
+        IDWriteFontFace5 *This,
+        UINT32 palette_index,
+        UINT32 first_entry_index,
+        UINT32 entry_count,
+        DWRITE_COLOR_F *entries);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace2_GetRecommendedRenderingMode)(
+        IDWriteFontFace5 *This,
+        FLOAT fontEmSize,
+        FLOAT dpiX,
+        FLOAT dpiY,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuringmode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE *renderingmode,
+        DWRITE_GRID_FIT_MODE *gridfitmode);
+
+    /*** IDWriteFontFace3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
+        IDWriteFontFace5 *This,
+        IDWriteFontFaceReference **reference);
+
+    void (STDMETHODCALLTYPE *GetPanose)(
+        IDWriteFontFace5 *This,
+        DWRITE_PANOSE *panose);
+
+    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
+        IDWriteFontFace5 *This);
+
+    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
+        IDWriteFontFace5 *This);
+
+    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
+        IDWriteFontFace5 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
+        IDWriteFontFace5 *This,
+        IDWriteLocalizedStrings **names);
+
+    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
+        IDWriteFontFace5 *This,
+        DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        WINBOOL *exists);
+
+    WINBOOL (STDMETHODCALLTYPE *HasCharacter)(
+        IDWriteFontFace5 *This,
+        UINT32 character);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace3_GetRecommendedRenderingMode)(
+        IDWriteFontFace5 *This,
+        FLOAT emsize,
+        FLOAT dpi_x,
+        FLOAT dpi_y,
+        const DWRITE_MATRIX *transform,
+        WINBOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE1 *rendering_mode,
+        DWRITE_GRID_FIT_MODE *gridfit_mode);
+
+    WINBOOL (STDMETHODCALLTYPE *IsCharacterLocal)(
+        IDWriteFontFace5 *This,
+        UINT32 character);
+
+    WINBOOL (STDMETHODCALLTYPE *IsGlyphLocal)(
+        IDWriteFontFace5 *This,
+        UINT16 glyph);
+
+    HRESULT (STDMETHODCALLTYPE *AreCharactersLocal)(
+        IDWriteFontFace5 *This,
+        const WCHAR *characters,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local);
+
+    HRESULT (STDMETHODCALLTYPE *AreGlyphsLocal)(
+        IDWriteFontFace5 *This,
+        const UINT16 *glyphs,
+        UINT32 count,
+        WINBOOL enqueue_if_not,
+        WINBOOL *are_local);
+
+    /*** IDWriteFontFace4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)(
+        IDWriteFontFace5 *This,
+        UINT16 glyph,
+        UINT32 ppem_first,
+        UINT32 ppem_last,
+        DWRITE_GLYPH_IMAGE_FORMATS *formats);
+
+    DWRITE_GLYPH_IMAGE_FORMATS (STDMETHODCALLTYPE *GetGlyphImageFormats)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetGlyphImageData)(
+        IDWriteFontFace5 *This,
+        UINT16 glyph,
+        UINT32 ppem,
+        DWRITE_GLYPH_IMAGE_FORMATS format,
+        DWRITE_GLYPH_IMAGE_DATA *data,
+        void **context);
+
+    void (STDMETHODCALLTYPE *ReleaseGlyphImageData)(
+        IDWriteFontFace5 *This,
+        void *context);
+
+    /*** IDWriteFontFace5 methods ***/
+    UINT32 (STDMETHODCALLTYPE *GetFontAxisValueCount)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontAxisValues)(
+        IDWriteFontFace5 *This,
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 value_count);
+
+    WINBOOL (STDMETHODCALLTYPE *HasVariations)(
+        IDWriteFontFace5 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontResource)(
+        IDWriteFontFace5 *This,
+        IDWriteFontResource **resource);
+
+    WINBOOL (STDMETHODCALLTYPE *Equals)(
+        IDWriteFontFace5 *This,
+        IDWriteFontFace *fontface);
+
+    END_INTERFACE
+} IDWriteFontFace5Vtbl;
+
+interface IDWriteFontFace5 {
+    CONST_VTBL IDWriteFontFace5Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFontFace5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFontFace5_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFontFace5_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFace methods ***/
+#define IDWriteFontFace5_GetType(This) (This)->lpVtbl->GetType(This)
+#define IDWriteFontFace5_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
+#define IDWriteFontFace5_GetIndex(This) (This)->lpVtbl->GetIndex(This)
+#define IDWriteFontFace5_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
+#define IDWriteFontFace5_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
+#define IDWriteFontFace5_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
+#define IDWriteFontFace5_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
+#define IDWriteFontFace5_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
+#define IDWriteFontFace5_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
+#define IDWriteFontFace5_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
+#define IDWriteFontFace5_GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink) (This)->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink)
+#define IDWriteFontFace5_GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways)
+/*** IDWriteFontFace1 methods ***/
+#define IDWriteFontFace5_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
+#define IDWriteFontFace5_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
+#define IDWriteFontFace5_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
+#define IDWriteFontFace5_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
+#define IDWriteFontFace5_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
+#define IDWriteFontFace5_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
+#define IDWriteFontFace5_GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances) (This)->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances)
+#define IDWriteFontFace5_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
+#define IDWriteFontFace5_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
+#define IDWriteFontFace5_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
+#define IDWriteFontFace5_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
+/*** IDWriteFontFace2 methods ***/
+#define IDWriteFontFace5_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
+#define IDWriteFontFace5_GetColorPaletteCount(This) (This)->lpVtbl->GetColorPaletteCount(This)
+#define IDWriteFontFace5_GetPaletteEntryCount(This) (This)->lpVtbl->GetPaletteEntryCount(This)
+#define IDWriteFontFace5_GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries) (This)->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries)
+/*** IDWriteFontFace3 methods ***/
+#define IDWriteFontFace5_GetFontFaceReference(This,reference) (This)->lpVtbl->GetFontFaceReference(This,reference)
+#define IDWriteFontFace5_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
+#define IDWriteFontFace5_GetWeight(This) (This)->lpVtbl->GetWeight(This)
+#define IDWriteFontFace5_GetStretch(This) (This)->lpVtbl->GetStretch(This)
+#define IDWriteFontFace5_GetStyle(This) (This)->lpVtbl->GetStyle(This)
+#define IDWriteFontFace5_GetFamilyNames(This,names) (This)->lpVtbl->GetFamilyNames(This,names)
+#define IDWriteFontFace5_GetFaceNames(This,names) (This)->lpVtbl->GetFaceNames(This,names)
+#define IDWriteFontFace5_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
+#define IDWriteFontFace5_HasCharacter(This,character) (This)->lpVtbl->HasCharacter(This,character)
+#define IDWriteFontFace5_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode) (This)->lpVtbl->IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode)
+#define IDWriteFontFace5_IsCharacterLocal(This,character) (This)->lpVtbl->IsCharacterLocal(This,character)
+#define IDWriteFontFace5_IsGlyphLocal(This,glyph) (This)->lpVtbl->IsGlyphLocal(This,glyph)
+#define IDWriteFontFace5_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
+#define IDWriteFontFace5_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
+/*** IDWriteFontFace4 methods ***/
+#define IDWriteFontFace5_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats)
+#define IDWriteFontFace5_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This)
+#define IDWriteFontFace5_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context)
+#define IDWriteFontFace5_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context)
+/*** IDWriteFontFace5 methods ***/
+#define IDWriteFontFace5_GetFontAxisValueCount(This) (This)->lpVtbl->GetFontAxisValueCount(This)
+#define IDWriteFontFace5_GetFontAxisValues(This,values,value_count) (This)->lpVtbl->GetFontAxisValues(This,values,value_count)
+#define IDWriteFontFace5_HasVariations(This) (This)->lpVtbl->HasVariations(This)
+#define IDWriteFontFace5_GetFontResource(This,resource) (This)->lpVtbl->GetFontResource(This,resource)
+#define IDWriteFontFace5_Equals(This,fontface) (This)->lpVtbl->Equals(This,fontface)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace5_QueryInterface(IDWriteFontFace5* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFontFace5_AddRef(IDWriteFontFace5* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFontFace5_Release(IDWriteFontFace5* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFace methods ***/
+static FORCEINLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace5_GetType(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetType(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetFiles(IDWriteFontFace5* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
+    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
+}
+static FORCEINLINE UINT32 IDWriteFontFace5_GetIndex(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetIndex(This);
+}
+static FORCEINLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace5_GetSimulations(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetSimulations(This);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_IsSymbolFont(IDWriteFontFace5* This) {
+    return This->lpVtbl->IsSymbolFont(This);
+}
+static FORCEINLINE UINT16 IDWriteFontFace5_GetGlyphCount(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetGlyphCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetDesignGlyphMetrics(IDWriteFontFace5* This,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphIndices(IDWriteFontFace5* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
+    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_TryGetFontTable(IDWriteFontFace5* This,UINT32 table_tag,const void **table_data,UINT32 *table_size,void **context,WINBOOL *exists) {
+    return This->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists);
+}
+static FORCEINLINE void IDWriteFontFace5_ReleaseFontTable(IDWriteFontFace5* This,void *table_context) {
+    This->lpVtbl->ReleaseFontTable(This,table_context);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphRunOutline(IDWriteFontFace5* This,FLOAT emSize,const UINT16 *glyph_indices,const FLOAT *glyph_advances,const DWRITE_GLYPH_OFFSET *glyph_offsets,UINT32 glyph_count,WINBOOL is_sideways,WINBOOL is_rtl,IDWriteGeometrySink *geometrysink) {
+    return This->lpVtbl->GetGlyphRunOutline(This,emSize,glyph_indices,glyph_advances,glyph_offsets,glyph_count,is_sideways,is_rtl,geometrysink);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGdiCompatibleGlyphMetrics(IDWriteFontFace5* This,FLOAT emSize,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,const UINT16 *glyph_indices,UINT32 glyph_count,DWRITE_GLYPH_METRICS *metrics,WINBOOL is_sideways) {
+    return This->lpVtbl->GetGdiCompatibleGlyphMetrics(This,emSize,pixels_per_dip,transform,use_gdi_natural,glyph_indices,glyph_count,metrics,is_sideways);
+}
+/*** IDWriteFontFace1 methods ***/
+static FORCEINLINE void IDWriteFontFace5_GetMetrics(IDWriteFontFace5* This,DWRITE_FONT_METRICS1 *metrics) {
+    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGdiCompatibleMetrics(IDWriteFontFace5* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,DWRITE_FONT_METRICS1 *metrics) {
+    return This->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics);
+}
+static FORCEINLINE void IDWriteFontFace5_GetCaretMetrics(IDWriteFontFace5* This,DWRITE_CARET_METRICS *metrics) {
+    This->lpVtbl->GetCaretMetrics(This,metrics);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetUnicodeRanges(IDWriteFontFace5* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
+    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_IsMonospacedFont(IDWriteFontFace5* This) {
+    return This->lpVtbl->IsMonospacedFont(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetDesignGlyphAdvances(IDWriteFontFace5* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
+    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGdiCompatibleGlyphAdvances(IDWriteFontFace5* This,FLOAT em_size,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,WINBOOL is_sideways,UINT32 glyph_count,const UINT16 *indices,INT32 *advances) {
+    return This->lpVtbl->GetGdiCompatibleGlyphAdvances(This,em_size,pixels_per_dip,transform,use_gdi_natural,is_sideways,glyph_count,indices,advances);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetKerningPairAdjustments(IDWriteFontFace5* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
+    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_HasKerningPairs(IDWriteFontFace5* This) {
+    return This->lpVtbl->HasKerningPairs(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetVerticalGlyphVariants(IDWriteFontFace5* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
+    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_HasVerticalGlyphVariants(IDWriteFontFace5* This) {
+    return This->lpVtbl->HasVerticalGlyphVariants(This);
+}
+/*** IDWriteFontFace2 methods ***/
+static FORCEINLINE WINBOOL IDWriteFontFace5_IsColorFont(IDWriteFontFace5* This) {
+    return This->lpVtbl->IsColorFont(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace5_GetColorPaletteCount(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetColorPaletteCount(This);
+}
+static FORCEINLINE UINT32 IDWriteFontFace5_GetPaletteEntryCount(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetPaletteEntryCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetPaletteEntries(IDWriteFontFace5* This,UINT32 palette_index,UINT32 first_entry_index,UINT32 entry_count,DWRITE_COLOR_F *entries) {
+    return This->lpVtbl->GetPaletteEntries(This,palette_index,first_entry_index,entry_count,entries);
+}
+/*** IDWriteFontFace3 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace5_GetFontFaceReference(IDWriteFontFace5* This,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->GetFontFaceReference(This,reference);
+}
+static FORCEINLINE void IDWriteFontFace5_GetPanose(IDWriteFontFace5* This,DWRITE_PANOSE *panose) {
+    This->lpVtbl->GetPanose(This,panose);
+}
+static FORCEINLINE DWRITE_FONT_WEIGHT IDWriteFontFace5_GetWeight(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetWeight(This);
+}
+static FORCEINLINE DWRITE_FONT_STRETCH IDWriteFontFace5_GetStretch(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetStretch(This);
+}
+static FORCEINLINE DWRITE_FONT_STYLE IDWriteFontFace5_GetStyle(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetStyle(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetFamilyNames(IDWriteFontFace5* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFamilyNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetFaceNames(IDWriteFontFace5* This,IDWriteLocalizedStrings **names) {
+    return This->lpVtbl->GetFaceNames(This,names);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetInformationalStrings(IDWriteFontFace5* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
+    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_HasCharacter(IDWriteFontFace5* This,UINT32 character) {
+    return This->lpVtbl->HasCharacter(This,character);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetRecommendedRenderingMode(IDWriteFontFace5* This,FLOAT emsize,FLOAT dpi_x,FLOAT dpi_y,const DWRITE_MATRIX *transform,WINBOOL is_sideways,DWRITE_OUTLINE_THRESHOLD threshold,DWRITE_MEASURING_MODE measuring_mode,IDWriteRenderingParams *params,DWRITE_RENDERING_MODE1 *rendering_mode,DWRITE_GRID_FIT_MODE *gridfit_mode) {
+    return This->lpVtbl->IDWriteFontFace3_GetRecommendedRenderingMode(This,emsize,dpi_x,dpi_y,transform,is_sideways,threshold,measuring_mode,params,rendering_mode,gridfit_mode);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_IsCharacterLocal(IDWriteFontFace5* This,UINT32 character) {
+    return This->lpVtbl->IsCharacterLocal(This,character);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_IsGlyphLocal(IDWriteFontFace5* This,UINT16 glyph) {
+    return This->lpVtbl->IsGlyphLocal(This,glyph);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_AreCharactersLocal(IDWriteFontFace5* This,const WCHAR *characters,UINT32 count,WINBOOL enqueue_if_not,WINBOOL *are_local) {
+    return This->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_AreGlyphsLocal(IDWriteFontFace5* This,const UINT16 *glyphs,UINT32 count,WINBOOL enqueue_if_not,WINBOOL *are_local) {
+    return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local);
+}
+/*** IDWriteFontFace4 methods ***/
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphImageFormats_(IDWriteFontFace5* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) {
+    return This->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats);
+}
+static FORCEINLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace5_GetGlyphImageFormats(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetGlyphImageFormats(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphImageData(IDWriteFontFace5* This,UINT16 glyph,UINT32 ppem,DWRITE_GLYPH_IMAGE_FORMATS format,DWRITE_GLYPH_IMAGE_DATA *data,void **context) {
+    return This->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context);
+}
+static FORCEINLINE void IDWriteFontFace5_ReleaseGlyphImageData(IDWriteFontFace5* This,void *context) {
+    This->lpVtbl->ReleaseGlyphImageData(This,context);
+}
+/*** IDWriteFontFace5 methods ***/
+static FORCEINLINE UINT32 IDWriteFontFace5_GetFontAxisValueCount(IDWriteFontFace5* This) {
+    return This->lpVtbl->GetFontAxisValueCount(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetFontAxisValues(IDWriteFontFace5* This,DWRITE_FONT_AXIS_VALUE *values,UINT32 value_count) {
+    return This->lpVtbl->GetFontAxisValues(This,values,value_count);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_HasVariations(IDWriteFontFace5* This) {
+    return This->lpVtbl->HasVariations(This);
+}
+static FORCEINLINE HRESULT IDWriteFontFace5_GetFontResource(IDWriteFontFace5* This,IDWriteFontResource **resource) {
+    return This->lpVtbl->GetFontResource(This,resource);
+}
+static FORCEINLINE WINBOOL IDWriteFontFace5_Equals(IDWriteFontFace5* This,IDWriteFontFace *fontface) {
+    return This->lpVtbl->Equals(This,fontface);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFontFace5_INTERFACE_DEFINED__ */
+
+typedef struct DWRITE_COLOR_GLYPH_RUN1 {
+    DWRITE_GLYPH_RUN glyphRun;
+    DWRITE_GLYPH_RUN_DESCRIPTION *glyphRunDescription;
+    FLOAT baselineOriginX;
+    FLOAT baselineOriginY;
+    DWRITE_COLOR_F runColor;
+    UINT16 paletteIndex;
+    DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat;
+    DWRITE_MEASURING_MODE measuringMode;
+} DWRITE_COLOR_GLYPH_RUN1;
+/*****************************************************************************
+ * IDWriteColorGlyphRunEnumerator1 interface
+ */
+#ifndef __IDWriteColorGlyphRunEnumerator1_INTERFACE_DEFINED__
+#define __IDWriteColorGlyphRunEnumerator1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteColorGlyphRunEnumerator1, 0x7c5f86da, 0xc7a1, 0x4f05, 0xb8,0xe1, 0x55,0xa1,0x79,0xfe,0x5a,0x35);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("7c5f86da-c7a1-4f05-b8e1-55a179fe5a35")
+IDWriteColorGlyphRunEnumerator1 : public IDWriteColorGlyphRunEnumerator
+{
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentRun(
+        const DWRITE_COLOR_GLYPH_RUN1 **run) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteColorGlyphRunEnumerator1, 0x7c5f86da, 0xc7a1, 0x4f05, 0xb8,0xe1, 0x55,0xa1,0x79,0xfe,0x5a,0x35)
+#endif
+#else
+typedef struct IDWriteColorGlyphRunEnumerator1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteColorGlyphRunEnumerator1 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteColorGlyphRunEnumerator1 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteColorGlyphRunEnumerator1 *This);
+
+    /*** IDWriteColorGlyphRunEnumerator methods ***/
+    HRESULT (STDMETHODCALLTYPE *MoveNext)(
+        IDWriteColorGlyphRunEnumerator1 *This,
+        WINBOOL *hasRun);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentRun)(
+        IDWriteColorGlyphRunEnumerator1 *This,
+        const DWRITE_COLOR_GLYPH_RUN **run);
+
+    /*** IDWriteColorGlyphRunEnumerator1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteColorGlyphRunEnumerator1_GetCurrentRun)(
+        IDWriteColorGlyphRunEnumerator1 *This,
+        const DWRITE_COLOR_GLYPH_RUN1 **run);
+
+    END_INTERFACE
+} IDWriteColorGlyphRunEnumerator1Vtbl;
+
+interface IDWriteColorGlyphRunEnumerator1 {
+    CONST_VTBL IDWriteColorGlyphRunEnumerator1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteColorGlyphRunEnumerator1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteColorGlyphRunEnumerator1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteColorGlyphRunEnumerator1_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteColorGlyphRunEnumerator methods ***/
+#define IDWriteColorGlyphRunEnumerator1_MoveNext(This,hasRun) (This)->lpVtbl->MoveNext(This,hasRun)
+/*** IDWriteColorGlyphRunEnumerator1 methods ***/
+#define IDWriteColorGlyphRunEnumerator1_GetCurrentRun(This,run) (This)->lpVtbl->IDWriteColorGlyphRunEnumerator1_GetCurrentRun(This,run)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteColorGlyphRunEnumerator1_QueryInterface(IDWriteColorGlyphRunEnumerator1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteColorGlyphRunEnumerator1_AddRef(IDWriteColorGlyphRunEnumerator1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteColorGlyphRunEnumerator1_Release(IDWriteColorGlyphRunEnumerator1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteColorGlyphRunEnumerator methods ***/
+static FORCEINLINE HRESULT IDWriteColorGlyphRunEnumerator1_MoveNext(IDWriteColorGlyphRunEnumerator1* This,WINBOOL *hasRun) {
+    return This->lpVtbl->MoveNext(This,hasRun);
+}
+/*** IDWriteColorGlyphRunEnumerator1 methods ***/
+static FORCEINLINE HRESULT IDWriteColorGlyphRunEnumerator1_GetCurrentRun(IDWriteColorGlyphRunEnumerator1* This,const DWRITE_COLOR_GLYPH_RUN1 **run) {
+    return This->lpVtbl->IDWriteColorGlyphRunEnumerator1_GetCurrentRun(This,run);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteColorGlyphRunEnumerator1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory4 interface
+ */
+#ifndef __IDWriteFactory4_INTERFACE_DEFINED__
+#define __IDWriteFactory4_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory4, 0x4b0b5bd3, 0x0797, 0x4549, 0x8a,0xc5, 0xfe,0x91,0x5c,0xc5,0x38,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("4b0b5bd3-0797-4549-8ac5-fe915cc53856")
+IDWriteFactory4 : public IDWriteFactory3
+{
+    virtual HRESULT STDMETHODCALLTYPE TranslateColorGlyphRun(
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,
+        DWRITE_GLYPH_IMAGE_FORMATS desired_formats,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette,
+        IDWriteColorGlyphRunEnumerator1 **layers) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ComputeGlyphOrigins_(
+        const DWRITE_GLYPH_RUN *run,
+        D2D1_POINT_2F baseline_origin,
+        D2D1_POINT_2F *origins) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ComputeGlyphOrigins(
+        const DWRITE_GLYPH_RUN *run,
+        DWRITE_MEASURING_MODE measuring_mode,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_MATRIX *transform,
+        D2D1_POINT_2F *origins) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory4, 0x4b0b5bd3, 0x0797, 0x4549, 0x8a,0xc5, 0xfe,0x91,0x5c,0xc5,0x38,0x56)
+#endif
+#else
+typedef struct IDWriteFactory4Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory4 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory4 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory4 *This);
+
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory4 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory4 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory4 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory4 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory4 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory4 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory4 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory4 *This,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory4 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory4 *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory4 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory4 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory4 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory4 *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory4 *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory4 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory4 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory4 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory4 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory4 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory4 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory4 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory4 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
+
+    /*** IDWriteFactory2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontFallback)(
+        IDWriteFactory4 *This,
+        IDWriteFontFallback **fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallbackBuilder)(
+        IDWriteFactory4 *This,
+        IDWriteFontFallbackBuilder **fallbackbuilder);
+
+    HRESULT (STDMETHODCALLTYPE *TranslateColorGlyphRun)(
+        IDWriteFactory4 *This,
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateCustomRenderingParams)(
+        IDWriteFactory4 *This,
+        FLOAT gamma,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        IDWriteRenderingParams2 **params);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateGlyphRunAnalysis)(
+        IDWriteFactory4 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_MEASURING_MODE measuringMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateGlyphRunAnalysis)(
+        IDWriteFactory4 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateCustomRenderingParams)(
+        IDWriteFactory4 *This,
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference_)(
+        IDWriteFactory4 *This,
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference)(
+        IDWriteFactory4 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontSet)(
+        IDWriteFactory4 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSetBuilder)(
+        IDWriteFactory4 *This,
+        IDWriteFontSetBuilder **builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontCollectionFromFontSet)(
+        IDWriteFactory4 *This,
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_GetSystemFontCollection)(
+        IDWriteFactory4 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontDownloadQueue)(
+        IDWriteFactory4 *This,
+        IDWriteFontDownloadQueue **queue);
+
+    /*** IDWriteFactory4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory4_TranslateColorGlyphRun)(
+        IDWriteFactory4 *This,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,
+        DWRITE_GLYPH_IMAGE_FORMATS desired_formats,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette,
+        IDWriteColorGlyphRunEnumerator1 **layers);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins_)(
+        IDWriteFactory4 *This,
+        const DWRITE_GLYPH_RUN *run,
+        D2D1_POINT_2F baseline_origin,
+        D2D1_POINT_2F *origins);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins)(
+        IDWriteFactory4 *This,
+        const DWRITE_GLYPH_RUN *run,
+        DWRITE_MEASURING_MODE measuring_mode,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_MATRIX *transform,
+        D2D1_POINT_2F *origins);
+
+    END_INTERFACE
+} IDWriteFactory4Vtbl;
+
+interface IDWriteFactory4 {
+    CONST_VTBL IDWriteFactory4Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory4_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory4_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory4_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory4_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory4_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory4_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory4_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory4_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory4_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory4_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory4_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory4_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory4_CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format) (This)->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format)
+#define IDWriteFactory4_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory4_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory4_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory4_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory4_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory4_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory4_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory4_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+/*** IDWriteFactory2 methods ***/
+#define IDWriteFactory4_GetSystemFontFallback(This,fallback) (This)->lpVtbl->GetSystemFontFallback(This,fallback)
+#define IDWriteFactory4_CreateFontFallbackBuilder(This,fallbackbuilder) (This)->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder)
+/*** IDWriteFactory3 methods ***/
+#define IDWriteFactory4_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis) (This)->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis)
+#define IDWriteFactory4_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params) (This)->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params)
+#define IDWriteFactory4_CreateFontFaceReference_(This,file,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference)
+#define IDWriteFactory4_CreateFontFaceReference(This,path,writetime,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference(This,path,writetime,index,simulations,reference)
+#define IDWriteFactory4_GetSystemFontSet(This,fontset) (This)->lpVtbl->GetSystemFontSet(This,fontset)
+#define IDWriteFactory4_CreateFontSetBuilder(This,builder) (This)->lpVtbl->CreateFontSetBuilder(This,builder)
+#define IDWriteFactory4_CreateFontCollectionFromFontSet(This,fontset,collection) (This)->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection)
+#define IDWriteFactory4_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates) (This)->lpVtbl->IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates)
+#define IDWriteFactory4_GetFontDownloadQueue(This,queue) (This)->lpVtbl->GetFontDownloadQueue(This,queue)
+/*** IDWriteFactory4 methods ***/
+#define IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers) (This)->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers)
+#define IDWriteFactory4_ComputeGlyphOrigins_(This,run,baseline_origin,origins) (This)->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins)
+#define IDWriteFactory4_ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins) (This)->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory4_QueryInterface(IDWriteFactory4* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory4_AddRef(IDWriteFactory4* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory4_Release(IDWriteFactory4* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory4_CreateCustomFontCollection(IDWriteFactory4* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_RegisterFontCollectionLoader(IDWriteFactory4* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_UnregisterFontCollectionLoader(IDWriteFactory4* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontFileReference(IDWriteFactory4* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateCustomFontFileReference(IDWriteFactory4* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontFace(IDWriteFactory4* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateRenderingParams(IDWriteFactory4* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateMonitorRenderingParams(IDWriteFactory4* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_RegisterFontFileLoader(IDWriteFactory4* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_UnregisterFontFileLoader(IDWriteFactory4* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateTextFormat(IDWriteFactory4* This,const WCHAR *family_name,IDWriteFontCollection *collection,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STYLE style,DWRITE_FONT_STRETCH stretch,FLOAT size,const WCHAR *locale,IDWriteTextFormat **format) {
+    return This->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateTypography(IDWriteFactory4* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_GetGdiInterop(IDWriteFactory4* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateTextLayout(IDWriteFactory4* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateGdiCompatibleTextLayout(IDWriteFactory4* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateEllipsisTrimmingSign(IDWriteFactory4* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateTextAnalyzer(IDWriteFactory4* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateNumberSubstitution(IDWriteFactory4* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory4_GetEudcFontCollection(IDWriteFactory4* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+/*** IDWriteFactory2 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory4_GetSystemFontFallback(IDWriteFactory4* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetSystemFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontFallbackBuilder(IDWriteFactory4* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
+    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
+}
+/*** IDWriteFactory3 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory4_CreateGlyphRunAnalysis(IDWriteFactory4* This,const DWRITE_GLYPH_RUN *run,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_MEASURING_MODE measuring_mode,DWRITE_GRID_FIT_MODE gridfit_mode,DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,FLOAT origin_x,FLOAT origin_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateCustomRenderingParams(IDWriteFactory4* This,FLOAT gamma,FLOAT enhanced_contrast,FLOAT grayscale_enhanced_contrast,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY pixel_geometry,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_GRID_FIT_MODE gridfit_mode,IDWriteRenderingParams3 **params) {
+    return This->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontFaceReference_(IDWriteFactory4* This,IDWriteFontFile *file,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontFaceReference(IDWriteFactory4* This,const WCHAR *path,const FILETIME *writetime,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference(This,path,writetime,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_GetSystemFontSet(IDWriteFactory4* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetSystemFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontSetBuilder(IDWriteFactory4* This,IDWriteFontSetBuilder **builder) {
+    return This->lpVtbl->CreateFontSetBuilder(This,builder);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_CreateFontCollectionFromFontSet(IDWriteFactory4* This,IDWriteFontSet *fontset,IDWriteFontCollection1 **collection) {
+    return This->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_GetSystemFontCollection(IDWriteFactory4* This,WINBOOL include_downloadable,IDWriteFontCollection1 **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_GetFontDownloadQueue(IDWriteFactory4* This,IDWriteFontDownloadQueue **queue) {
+    return This->lpVtbl->GetFontDownloadQueue(This,queue);
+}
+/*** IDWriteFactory4 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory4_TranslateColorGlyphRun(IDWriteFactory4* This,D2D1_POINT_2F baseline_origin,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,DWRITE_GLYPH_IMAGE_FORMATS desired_formats,DWRITE_MEASURING_MODE measuring_mode,const DWRITE_MATRIX *transform,UINT32 palette,IDWriteColorGlyphRunEnumerator1 **layers) {
+    return This->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_ComputeGlyphOrigins_(IDWriteFactory4* This,const DWRITE_GLYPH_RUN *run,D2D1_POINT_2F baseline_origin,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins);
+}
+static FORCEINLINE HRESULT IDWriteFactory4_ComputeGlyphOrigins(IDWriteFactory4* This,const DWRITE_GLYPH_RUN *run,DWRITE_MEASURING_MODE measuring_mode,D2D1_POINT_2F baseline_origin,const DWRITE_MATRIX *transform,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFactory4_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteAsyncResult interface
+ */
+#ifndef __IDWriteAsyncResult_INTERFACE_DEFINED__
+#define __IDWriteAsyncResult_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteAsyncResult, 0xce25f8fd, 0x863b, 0x4d13, 0x96,0x51, 0xc1,0xf8,0x8d,0xc7,0x3f,0xe2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ce25f8fd-863b-4d13-9651-c1f88dc73fe2")
+IDWriteAsyncResult : public IUnknown
+{
+    virtual HANDLE STDMETHODCALLTYPE GetWaitHandle(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetResult(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteAsyncResult, 0xce25f8fd, 0x863b, 0x4d13, 0x96,0x51, 0xc1,0xf8,0x8d,0xc7,0x3f,0xe2)
+#endif
+#else
+typedef struct IDWriteAsyncResultVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteAsyncResult *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteAsyncResult *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteAsyncResult *This);
+
+    /*** IDWriteAsyncResult methods ***/
+    HANDLE (STDMETHODCALLTYPE *GetWaitHandle)(
+        IDWriteAsyncResult *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetResult)(
+        IDWriteAsyncResult *This);
+
+    END_INTERFACE
+} IDWriteAsyncResultVtbl;
+
+interface IDWriteAsyncResult {
+    CONST_VTBL IDWriteAsyncResultVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteAsyncResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteAsyncResult_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteAsyncResult_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteAsyncResult methods ***/
+#define IDWriteAsyncResult_GetWaitHandle(This) (This)->lpVtbl->GetWaitHandle(This)
+#define IDWriteAsyncResult_GetResult(This) (This)->lpVtbl->GetResult(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteAsyncResult_QueryInterface(IDWriteAsyncResult* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteAsyncResult_AddRef(IDWriteAsyncResult* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteAsyncResult_Release(IDWriteAsyncResult* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteAsyncResult methods ***/
+static FORCEINLINE HANDLE IDWriteAsyncResult_GetWaitHandle(IDWriteAsyncResult* This) {
+    return This->lpVtbl->GetWaitHandle(This);
+}
+static FORCEINLINE HRESULT IDWriteAsyncResult_GetResult(IDWriteAsyncResult* This) {
+    return This->lpVtbl->GetResult(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteAsyncResult_INTERFACE_DEFINED__ */
+
+typedef struct DWRITE_FILE_FRAGMENT {
+    UINT64 fileOffset;
+    UINT64 fragmentSize;
+} DWRITE_FILE_FRAGMENT;
+/*****************************************************************************
+ * IDWriteRemoteFontFileStream interface
+ */
+#ifndef __IDWriteRemoteFontFileStream_INTERFACE_DEFINED__
+#define __IDWriteRemoteFontFileStream_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteRemoteFontFileStream, 0x4db3757a, 0x2c72, 0x4ed9, 0xb2,0xb6, 0x1a,0xba,0xbe,0x1a,0xff,0x9c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("4db3757a-2c72-4ed9-b2b6-1ababe1aff9c")
+IDWriteRemoteFontFileStream : public IDWriteFontFileStream
+{
+    virtual HRESULT STDMETHODCALLTYPE GetLocalFileSize(
+        UINT64 *size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileFragmentLocality(
+        UINT64 offset,
+        UINT64 size,
+        WINBOOL *is_local,
+        UINT64 *partial_size) = 0;
+
+    virtual DWRITE_LOCALITY STDMETHODCALLTYPE GetLocality(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginDownload(
+        const GUID *operation_id,
+        const DWRITE_FILE_FRAGMENT *fragments,
+        UINT32 fragment_count,
+        IDWriteAsyncResult **async_result) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteRemoteFontFileStream, 0x4db3757a, 0x2c72, 0x4ed9, 0xb2,0xb6, 0x1a,0xba,0xbe,0x1a,0xff,0x9c)
+#endif
+#else
+typedef struct IDWriteRemoteFontFileStreamVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteRemoteFontFileStream *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteRemoteFontFileStream *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteRemoteFontFileStream *This);
+
+    /*** IDWriteFontFileStream methods ***/
+    HRESULT (STDMETHODCALLTYPE *ReadFileFragment)(
+        IDWriteRemoteFontFileStream *This,
+        const void **fragment_start,
+        UINT64 offset,
+        UINT64 fragment_size,
+        void **fragment_context);
+
+    void (STDMETHODCALLTYPE *ReleaseFileFragment)(
+        IDWriteRemoteFontFileStream *This,
+        void *fragment_context);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileSize)(
+        IDWriteRemoteFontFileStream *This,
+        UINT64 *size);
+
+    HRESULT (STDMETHODCALLTYPE *GetLastWriteTime)(
+        IDWriteRemoteFontFileStream *This,
+        UINT64 *last_writetime);
+
+    /*** IDWriteRemoteFontFileStream methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLocalFileSize)(
+        IDWriteRemoteFontFileStream *This,
+        UINT64 *size);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileFragmentLocality)(
+        IDWriteRemoteFontFileStream *This,
+        UINT64 offset,
+        UINT64 size,
+        WINBOOL *is_local,
+        UINT64 *partial_size);
+
+    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetLocality)(
+        IDWriteRemoteFontFileStream *This);
+
+    HRESULT (STDMETHODCALLTYPE *BeginDownload)(
+        IDWriteRemoteFontFileStream *This,
+        const GUID *operation_id,
+        const DWRITE_FILE_FRAGMENT *fragments,
+        UINT32 fragment_count,
+        IDWriteAsyncResult **async_result);
+
+    END_INTERFACE
+} IDWriteRemoteFontFileStreamVtbl;
+
+interface IDWriteRemoteFontFileStream {
+    CONST_VTBL IDWriteRemoteFontFileStreamVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteRemoteFontFileStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteRemoteFontFileStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteRemoteFontFileStream_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileStream methods ***/
+#define IDWriteRemoteFontFileStream_ReadFileFragment(This,fragment_start,offset,fragment_size,fragment_context) (This)->lpVtbl->ReadFileFragment(This,fragment_start,offset,fragment_size,fragment_context)
+#define IDWriteRemoteFontFileStream_ReleaseFileFragment(This,fragment_context) (This)->lpVtbl->ReleaseFileFragment(This,fragment_context)
+#define IDWriteRemoteFontFileStream_GetFileSize(This,size) (This)->lpVtbl->GetFileSize(This,size)
+#define IDWriteRemoteFontFileStream_GetLastWriteTime(This,last_writetime) (This)->lpVtbl->GetLastWriteTime(This,last_writetime)
+/*** IDWriteRemoteFontFileStream methods ***/
+#define IDWriteRemoteFontFileStream_GetLocalFileSize(This,size) (This)->lpVtbl->GetLocalFileSize(This,size)
+#define IDWriteRemoteFontFileStream_GetFileFragmentLocality(This,offset,size,is_local,partial_size) (This)->lpVtbl->GetFileFragmentLocality(This,offset,size,is_local,partial_size)
+#define IDWriteRemoteFontFileStream_GetLocality(This) (This)->lpVtbl->GetLocality(This)
+#define IDWriteRemoteFontFileStream_BeginDownload(This,operation_id,fragments,fragment_count,async_result) (This)->lpVtbl->BeginDownload(This,operation_id,fragments,fragment_count,async_result)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_QueryInterface(IDWriteRemoteFontFileStream* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteRemoteFontFileStream_AddRef(IDWriteRemoteFontFileStream* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteRemoteFontFileStream_Release(IDWriteRemoteFontFileStream* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileStream methods ***/
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_ReadFileFragment(IDWriteRemoteFontFileStream* This,const void **fragment_start,UINT64 offset,UINT64 fragment_size,void **fragment_context) {
+    return This->lpVtbl->ReadFileFragment(This,fragment_start,offset,fragment_size,fragment_context);
+}
+static FORCEINLINE void IDWriteRemoteFontFileStream_ReleaseFileFragment(IDWriteRemoteFontFileStream* This,void *fragment_context) {
+    This->lpVtbl->ReleaseFileFragment(This,fragment_context);
+}
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_GetFileSize(IDWriteRemoteFontFileStream* This,UINT64 *size) {
+    return This->lpVtbl->GetFileSize(This,size);
+}
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_GetLastWriteTime(IDWriteRemoteFontFileStream* This,UINT64 *last_writetime) {
+    return This->lpVtbl->GetLastWriteTime(This,last_writetime);
+}
+/*** IDWriteRemoteFontFileStream methods ***/
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_GetLocalFileSize(IDWriteRemoteFontFileStream* This,UINT64 *size) {
+    return This->lpVtbl->GetLocalFileSize(This,size);
+}
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_GetFileFragmentLocality(IDWriteRemoteFontFileStream* This,UINT64 offset,UINT64 size,WINBOOL *is_local,UINT64 *partial_size) {
+    return This->lpVtbl->GetFileFragmentLocality(This,offset,size,is_local,partial_size);
+}
+static FORCEINLINE DWRITE_LOCALITY IDWriteRemoteFontFileStream_GetLocality(IDWriteRemoteFontFileStream* This) {
+    return This->lpVtbl->GetLocality(This);
+}
+static FORCEINLINE HRESULT IDWriteRemoteFontFileStream_BeginDownload(IDWriteRemoteFontFileStream* This,const GUID *operation_id,const DWRITE_FILE_FRAGMENT *fragments,UINT32 fragment_count,IDWriteAsyncResult **async_result) {
+    return This->lpVtbl->BeginDownload(This,operation_id,fragments,fragment_count,async_result);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteRemoteFontFileStream_INTERFACE_DEFINED__ */
+
+typedef enum DWRITE_CONTAINER_TYPE {
+    DWRITE_CONTAINER_TYPE_UNKNOWN = 0,
+    DWRITE_CONTAINER_TYPE_WOFF = 1,
+    DWRITE_CONTAINER_TYPE_WOFF2 = 2
+} DWRITE_CONTAINER_TYPE;
+/*****************************************************************************
+ * IDWriteRemoteFontFileLoader interface
+ */
+#ifndef __IDWriteRemoteFontFileLoader_INTERFACE_DEFINED__
+#define __IDWriteRemoteFontFileLoader_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteRemoteFontFileLoader, 0x68648c83, 0x6ede, 0x46c0, 0xab,0x46, 0x20,0x08,0x3a,0x88,0x7f,0xde);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("68648c83-6ede-46c0-ab46-20083a887fde")
+IDWriteRemoteFontFileLoader : public IDWriteFontFileLoader
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateRemoteStreamFromKey(
+        const void *key,
+        UINT32 key_size,
+        IDWriteRemoteFontFileStream **stream) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocalityFromKey(
+        const void *key,
+        UINT32 key_size,
+        DWRITE_LOCALITY *locality) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFileReferenceFromUrl(
+        IDWriteFactory *factory,
+        const WCHAR *base_url,
+        const WCHAR *file_url,
+        IDWriteFontFile **fontfile) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteRemoteFontFileLoader, 0x68648c83, 0x6ede, 0x46c0, 0xab,0x46, 0x20,0x08,0x3a,0x88,0x7f,0xde)
+#endif
+#else
+typedef struct IDWriteRemoteFontFileLoaderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteRemoteFontFileLoader *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteRemoteFontFileLoader *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteRemoteFontFileLoader *This);
+
+    /*** IDWriteFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateStreamFromKey)(
+        IDWriteRemoteFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileStream **stream);
+
+    /*** IDWriteRemoteFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateRemoteStreamFromKey)(
+        IDWriteRemoteFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        IDWriteRemoteFontFileStream **stream);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocalityFromKey)(
+        IDWriteRemoteFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        DWRITE_LOCALITY *locality);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReferenceFromUrl)(
+        IDWriteRemoteFontFileLoader *This,
+        IDWriteFactory *factory,
+        const WCHAR *base_url,
+        const WCHAR *file_url,
+        IDWriteFontFile **fontfile);
+
+    END_INTERFACE
+} IDWriteRemoteFontFileLoaderVtbl;
+
+interface IDWriteRemoteFontFileLoader {
+    CONST_VTBL IDWriteRemoteFontFileLoaderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteRemoteFontFileLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteRemoteFontFileLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteRemoteFontFileLoader_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileLoader methods ***/
+#define IDWriteRemoteFontFileLoader_CreateStreamFromKey(This,key,key_size,stream) (This)->lpVtbl->CreateStreamFromKey(This,key,key_size,stream)
+/*** IDWriteRemoteFontFileLoader methods ***/
+#define IDWriteRemoteFontFileLoader_CreateRemoteStreamFromKey(This,key,key_size,stream) (This)->lpVtbl->CreateRemoteStreamFromKey(This,key,key_size,stream)
+#define IDWriteRemoteFontFileLoader_GetLocalityFromKey(This,key,key_size,locality) (This)->lpVtbl->GetLocalityFromKey(This,key,key_size,locality)
+#define IDWriteRemoteFontFileLoader_CreateFontFileReferenceFromUrl(This,factory,base_url,file_url,fontfile) (This)->lpVtbl->CreateFontFileReferenceFromUrl(This,factory,base_url,file_url,fontfile)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteRemoteFontFileLoader_QueryInterface(IDWriteRemoteFontFileLoader* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteRemoteFontFileLoader_AddRef(IDWriteRemoteFontFileLoader* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteRemoteFontFileLoader_Release(IDWriteRemoteFontFileLoader* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteRemoteFontFileLoader_CreateStreamFromKey(IDWriteRemoteFontFileLoader* This,const void *key,UINT32 key_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->CreateStreamFromKey(This,key,key_size,stream);
+}
+/*** IDWriteRemoteFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteRemoteFontFileLoader_CreateRemoteStreamFromKey(IDWriteRemoteFontFileLoader* This,const void *key,UINT32 key_size,IDWriteRemoteFontFileStream **stream) {
+    return This->lpVtbl->CreateRemoteStreamFromKey(This,key,key_size,stream);
+}
+static FORCEINLINE HRESULT IDWriteRemoteFontFileLoader_GetLocalityFromKey(IDWriteRemoteFontFileLoader* This,const void *key,UINT32 key_size,DWRITE_LOCALITY *locality) {
+    return This->lpVtbl->GetLocalityFromKey(This,key,key_size,locality);
+}
+static FORCEINLINE HRESULT IDWriteRemoteFontFileLoader_CreateFontFileReferenceFromUrl(IDWriteRemoteFontFileLoader* This,IDWriteFactory *factory,const WCHAR *base_url,const WCHAR *file_url,IDWriteFontFile **fontfile) {
+    return This->lpVtbl->CreateFontFileReferenceFromUrl(This,factory,base_url,file_url,fontfile);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteRemoteFontFileLoader_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteInMemoryFontFileLoader interface
+ */
+#ifndef __IDWriteInMemoryFontFileLoader_INTERFACE_DEFINED__
+#define __IDWriteInMemoryFontFileLoader_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteInMemoryFontFileLoader, 0xdc102f47, 0xa12d, 0x4b1c, 0x82,0x2d, 0x9e,0x11,0x7e,0x33,0x04,0x3f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("dc102f47-a12d-4b1c-822d-9e117e33043f")
+IDWriteInMemoryFontFileLoader : public IDWriteFontFileLoader
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateInMemoryFontFileReference(
+        IDWriteFactory *factory,
+        const void *data,
+        UINT32 data_size,
+        IUnknown *owner,
+        IDWriteFontFile **fontfile) = 0;
+
+    virtual UINT32 STDMETHODCALLTYPE GetFileCount(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteInMemoryFontFileLoader, 0xdc102f47, 0xa12d, 0x4b1c, 0x82,0x2d, 0x9e,0x11,0x7e,0x33,0x04,0x3f)
+#endif
+#else
+typedef struct IDWriteInMemoryFontFileLoaderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteInMemoryFontFileLoader *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteInMemoryFontFileLoader *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteInMemoryFontFileLoader *This);
+
+    /*** IDWriteFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateStreamFromKey)(
+        IDWriteInMemoryFontFileLoader *This,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontFileStream **stream);
+
+    /*** IDWriteInMemoryFontFileLoader methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateInMemoryFontFileReference)(
+        IDWriteInMemoryFontFileLoader *This,
+        IDWriteFactory *factory,
+        const void *data,
+        UINT32 data_size,
+        IUnknown *owner,
+        IDWriteFontFile **fontfile);
+
+    UINT32 (STDMETHODCALLTYPE *GetFileCount)(
+        IDWriteInMemoryFontFileLoader *This);
+
+    END_INTERFACE
+} IDWriteInMemoryFontFileLoaderVtbl;
+
+interface IDWriteInMemoryFontFileLoader {
+    CONST_VTBL IDWriteInMemoryFontFileLoaderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteInMemoryFontFileLoader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteInMemoryFontFileLoader_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteInMemoryFontFileLoader_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFontFileLoader methods ***/
+#define IDWriteInMemoryFontFileLoader_CreateStreamFromKey(This,key,key_size,stream) (This)->lpVtbl->CreateStreamFromKey(This,key,key_size,stream)
+/*** IDWriteInMemoryFontFileLoader methods ***/
+#define IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(This,factory,data,data_size,owner,fontfile) (This)->lpVtbl->CreateInMemoryFontFileReference(This,factory,data,data_size,owner,fontfile)
+#define IDWriteInMemoryFontFileLoader_GetFileCount(This) (This)->lpVtbl->GetFileCount(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteInMemoryFontFileLoader_QueryInterface(IDWriteInMemoryFontFileLoader* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteInMemoryFontFileLoader_AddRef(IDWriteInMemoryFontFileLoader* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteInMemoryFontFileLoader_Release(IDWriteInMemoryFontFileLoader* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteInMemoryFontFileLoader_CreateStreamFromKey(IDWriteInMemoryFontFileLoader* This,const void *key,UINT32 key_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->CreateStreamFromKey(This,key,key_size,stream);
+}
+/*** IDWriteInMemoryFontFileLoader methods ***/
+static FORCEINLINE HRESULT IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(IDWriteInMemoryFontFileLoader* This,IDWriteFactory *factory,const void *data,UINT32 data_size,IUnknown *owner,IDWriteFontFile **fontfile) {
+    return This->lpVtbl->CreateInMemoryFontFileReference(This,factory,data,data_size,owner,fontfile);
+}
+static FORCEINLINE UINT32 IDWriteInMemoryFontFileLoader_GetFileCount(IDWriteInMemoryFontFileLoader* This) {
+    return This->lpVtbl->GetFileCount(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteInMemoryFontFileLoader_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory5 interface
+ */
+#ifndef __IDWriteFactory5_INTERFACE_DEFINED__
+#define __IDWriteFactory5_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory5, 0x958db99a, 0xbe2a, 0x4f09, 0xaf,0x7d, 0x65,0x18,0x98,0x03,0xd1,0xd3);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("958db99a-be2a-4f09-af7d-65189803d1d3")
+IDWriteFactory5 : public IDWriteFactory4
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontSetBuilder(
+        IDWriteFontSetBuilder1 **fontset_builder) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateInMemoryFontFileLoader(
+        IDWriteInMemoryFontFileLoader **loader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateHttpFontFileLoader(
+        const WCHAR *referrer_url,
+        const WCHAR *extra_headers,
+        IDWriteRemoteFontFileLoader **loader) = 0;
+
+    virtual DWRITE_CONTAINER_TYPE STDMETHODCALLTYPE AnalyzeContainerType(
+        const void *data,
+        UINT32 data_size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnpackFontFile(
+        DWRITE_CONTAINER_TYPE container_type,
+        const void *data,
+        UINT32 data_size,
+        IDWriteFontFileStream **stream) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory5, 0x958db99a, 0xbe2a, 0x4f09, 0xaf,0x7d, 0x65,0x18,0x98,0x03,0xd1,0xd3)
+#endif
+#else
+typedef struct IDWriteFactory5Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory5 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory5 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory5 *This);
+
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory5 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory5 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory5 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory5 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory5 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory5 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory5 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory5 *This,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory5 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory5 *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory5 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory5 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory5 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory5 *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory5 *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory5 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory5 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory5 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory5 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory5 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory5 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory5 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory5 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
+
+    /*** IDWriteFactory2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontFallback)(
+        IDWriteFactory5 *This,
+        IDWriteFontFallback **fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallbackBuilder)(
+        IDWriteFactory5 *This,
+        IDWriteFontFallbackBuilder **fallbackbuilder);
+
+    HRESULT (STDMETHODCALLTYPE *TranslateColorGlyphRun)(
+        IDWriteFactory5 *This,
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateCustomRenderingParams)(
+        IDWriteFactory5 *This,
+        FLOAT gamma,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        IDWriteRenderingParams2 **params);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateGlyphRunAnalysis)(
+        IDWriteFactory5 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_MEASURING_MODE measuringMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateGlyphRunAnalysis)(
+        IDWriteFactory5 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateCustomRenderingParams)(
+        IDWriteFactory5 *This,
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference_)(
+        IDWriteFactory5 *This,
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference)(
+        IDWriteFactory5 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontSet)(
+        IDWriteFactory5 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSetBuilder)(
+        IDWriteFactory5 *This,
+        IDWriteFontSetBuilder **builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontCollectionFromFontSet)(
+        IDWriteFactory5 *This,
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_GetSystemFontCollection)(
+        IDWriteFactory5 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontDownloadQueue)(
+        IDWriteFactory5 *This,
+        IDWriteFontDownloadQueue **queue);
+
+    /*** IDWriteFactory4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory4_TranslateColorGlyphRun)(
+        IDWriteFactory5 *This,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,
+        DWRITE_GLYPH_IMAGE_FORMATS desired_formats,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette,
+        IDWriteColorGlyphRunEnumerator1 **layers);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins_)(
+        IDWriteFactory5 *This,
+        const DWRITE_GLYPH_RUN *run,
+        D2D1_POINT_2F baseline_origin,
+        D2D1_POINT_2F *origins);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins)(
+        IDWriteFactory5 *This,
+        const DWRITE_GLYPH_RUN *run,
+        DWRITE_MEASURING_MODE measuring_mode,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_MATRIX *transform,
+        D2D1_POINT_2F *origins);
+
+    /*** IDWriteFactory5 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory5_CreateFontSetBuilder)(
+        IDWriteFactory5 *This,
+        IDWriteFontSetBuilder1 **fontset_builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInMemoryFontFileLoader)(
+        IDWriteFactory5 *This,
+        IDWriteInMemoryFontFileLoader **loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateHttpFontFileLoader)(
+        IDWriteFactory5 *This,
+        const WCHAR *referrer_url,
+        const WCHAR *extra_headers,
+        IDWriteRemoteFontFileLoader **loader);
+
+    DWRITE_CONTAINER_TYPE (STDMETHODCALLTYPE *AnalyzeContainerType)(
+        IDWriteFactory5 *This,
+        const void *data,
+        UINT32 data_size);
+
+    HRESULT (STDMETHODCALLTYPE *UnpackFontFile)(
+        IDWriteFactory5 *This,
+        DWRITE_CONTAINER_TYPE container_type,
+        const void *data,
+        UINT32 data_size,
+        IDWriteFontFileStream **stream);
+
+    END_INTERFACE
+} IDWriteFactory5Vtbl;
+
+interface IDWriteFactory5 {
+    CONST_VTBL IDWriteFactory5Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory5_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory5_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory5_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory5_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory5_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory5_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory5_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory5_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory5_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory5_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory5_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory5_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory5_CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format) (This)->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format)
+#define IDWriteFactory5_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory5_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory5_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory5_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory5_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory5_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory5_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory5_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+/*** IDWriteFactory2 methods ***/
+#define IDWriteFactory5_GetSystemFontFallback(This,fallback) (This)->lpVtbl->GetSystemFontFallback(This,fallback)
+#define IDWriteFactory5_CreateFontFallbackBuilder(This,fallbackbuilder) (This)->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder)
+/*** IDWriteFactory3 methods ***/
+#define IDWriteFactory5_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis) (This)->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis)
+#define IDWriteFactory5_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params) (This)->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params)
+#define IDWriteFactory5_CreateFontFaceReference_(This,file,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference)
+#define IDWriteFactory5_CreateFontFaceReference(This,path,writetime,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference(This,path,writetime,index,simulations,reference)
+#define IDWriteFactory5_GetSystemFontSet(This,fontset) (This)->lpVtbl->GetSystemFontSet(This,fontset)
+#define IDWriteFactory5_CreateFontCollectionFromFontSet(This,fontset,collection) (This)->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection)
+#define IDWriteFactory5_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates) (This)->lpVtbl->IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates)
+#define IDWriteFactory5_GetFontDownloadQueue(This,queue) (This)->lpVtbl->GetFontDownloadQueue(This,queue)
+/*** IDWriteFactory4 methods ***/
+#define IDWriteFactory5_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers) (This)->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers)
+#define IDWriteFactory5_ComputeGlyphOrigins_(This,run,baseline_origin,origins) (This)->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins)
+#define IDWriteFactory5_ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins) (This)->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins)
+/*** IDWriteFactory5 methods ***/
+#define IDWriteFactory5_CreateFontSetBuilder(This,fontset_builder) (This)->lpVtbl->IDWriteFactory5_CreateFontSetBuilder(This,fontset_builder)
+#define IDWriteFactory5_CreateInMemoryFontFileLoader(This,loader) (This)->lpVtbl->CreateInMemoryFontFileLoader(This,loader)
+#define IDWriteFactory5_CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader) (This)->lpVtbl->CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader)
+#define IDWriteFactory5_AnalyzeContainerType(This,data,data_size) (This)->lpVtbl->AnalyzeContainerType(This,data,data_size)
+#define IDWriteFactory5_UnpackFontFile(This,container_type,data,data_size,stream) (This)->lpVtbl->UnpackFontFile(This,container_type,data,data_size,stream)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_QueryInterface(IDWriteFactory5* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory5_AddRef(IDWriteFactory5* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory5_Release(IDWriteFactory5* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_CreateCustomFontCollection(IDWriteFactory5* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_RegisterFontCollectionLoader(IDWriteFactory5* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_UnregisterFontCollectionLoader(IDWriteFactory5* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontFileReference(IDWriteFactory5* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateCustomFontFileReference(IDWriteFactory5* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontFace(IDWriteFactory5* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateRenderingParams(IDWriteFactory5* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateMonitorRenderingParams(IDWriteFactory5* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_RegisterFontFileLoader(IDWriteFactory5* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_UnregisterFontFileLoader(IDWriteFactory5* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateTextFormat(IDWriteFactory5* This,const WCHAR *family_name,IDWriteFontCollection *collection,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STYLE style,DWRITE_FONT_STRETCH stretch,FLOAT size,const WCHAR *locale,IDWriteTextFormat **format) {
+    return This->lpVtbl->CreateTextFormat(This,family_name,collection,weight,style,stretch,size,locale,format);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateTypography(IDWriteFactory5* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_GetGdiInterop(IDWriteFactory5* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateTextLayout(IDWriteFactory5* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateGdiCompatibleTextLayout(IDWriteFactory5* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateEllipsisTrimmingSign(IDWriteFactory5* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateTextAnalyzer(IDWriteFactory5* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateNumberSubstitution(IDWriteFactory5* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_GetEudcFontCollection(IDWriteFactory5* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+/*** IDWriteFactory2 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_GetSystemFontFallback(IDWriteFactory5* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetSystemFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontFallbackBuilder(IDWriteFactory5* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
+    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
+}
+/*** IDWriteFactory3 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_CreateGlyphRunAnalysis(IDWriteFactory5* This,const DWRITE_GLYPH_RUN *run,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_MEASURING_MODE measuring_mode,DWRITE_GRID_FIT_MODE gridfit_mode,DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,FLOAT origin_x,FLOAT origin_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateCustomRenderingParams(IDWriteFactory5* This,FLOAT gamma,FLOAT enhanced_contrast,FLOAT grayscale_enhanced_contrast,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY pixel_geometry,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_GRID_FIT_MODE gridfit_mode,IDWriteRenderingParams3 **params) {
+    return This->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontFaceReference_(IDWriteFactory5* This,IDWriteFontFile *file,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontFaceReference(IDWriteFactory5* This,const WCHAR *path,const FILETIME *writetime,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference(This,path,writetime,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_GetSystemFontSet(IDWriteFactory5* This,IDWriteFontSet **fontset) {
+    return This->lpVtbl->GetSystemFontSet(This,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontCollectionFromFontSet(IDWriteFactory5* This,IDWriteFontSet *fontset,IDWriteFontCollection1 **collection) {
+    return This->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_GetSystemFontCollection(IDWriteFactory5* This,WINBOOL include_downloadable,IDWriteFontCollection1 **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->IDWriteFactory3_GetSystemFontCollection(This,include_downloadable,collection,check_for_updates);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_GetFontDownloadQueue(IDWriteFactory5* This,IDWriteFontDownloadQueue **queue) {
+    return This->lpVtbl->GetFontDownloadQueue(This,queue);
+}
+/*** IDWriteFactory4 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_TranslateColorGlyphRun(IDWriteFactory5* This,D2D1_POINT_2F baseline_origin,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,DWRITE_GLYPH_IMAGE_FORMATS desired_formats,DWRITE_MEASURING_MODE measuring_mode,const DWRITE_MATRIX *transform,UINT32 palette,IDWriteColorGlyphRunEnumerator1 **layers) {
+    return This->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_ComputeGlyphOrigins_(IDWriteFactory5* This,const DWRITE_GLYPH_RUN *run,D2D1_POINT_2F baseline_origin,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_ComputeGlyphOrigins(IDWriteFactory5* This,const DWRITE_GLYPH_RUN *run,DWRITE_MEASURING_MODE measuring_mode,D2D1_POINT_2F baseline_origin,const DWRITE_MATRIX *transform,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins);
+}
+/*** IDWriteFactory5 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory5_CreateFontSetBuilder(IDWriteFactory5* This,IDWriteFontSetBuilder1 **fontset_builder) {
+    return This->lpVtbl->IDWriteFactory5_CreateFontSetBuilder(This,fontset_builder);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateInMemoryFontFileLoader(IDWriteFactory5* This,IDWriteInMemoryFontFileLoader **loader) {
+    return This->lpVtbl->CreateInMemoryFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_CreateHttpFontFileLoader(IDWriteFactory5* This,const WCHAR *referrer_url,const WCHAR *extra_headers,IDWriteRemoteFontFileLoader **loader) {
+    return This->lpVtbl->CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader);
+}
+static FORCEINLINE DWRITE_CONTAINER_TYPE IDWriteFactory5_AnalyzeContainerType(IDWriteFactory5* This,const void *data,UINT32 data_size) {
+    return This->lpVtbl->AnalyzeContainerType(This,data,data_size);
+}
+static FORCEINLINE HRESULT IDWriteFactory5_UnpackFontFile(IDWriteFactory5* This,DWRITE_CONTAINER_TYPE container_type,const void *data,UINT32 data_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->UnpackFontFile(This,container_type,data,data_size,stream);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFactory5_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory6 interface
+ */
+#ifndef __IDWriteFactory6_INTERFACE_DEFINED__
+#define __IDWriteFactory6_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory6, 0xf3744d80, 0x21f7, 0x42eb, 0xb3,0x5d, 0x99,0x5b,0xc7,0x2f,0xc2,0x23);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f3744d80-21f7-42eb-b35d-995bc72fc223")
+IDWriteFactory6 : public IDWriteFactory5
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateFontFaceReference(
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_axis,
+        IDWriteFontFaceReference1 **face_ref) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontResource(
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        IDWriteFontResource **resource) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontSet(
+        WINBOOL include_downloadable,
+        IDWriteFontSet1 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontCollection(
+        WINBOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontCollectionFromFontSet(
+        IDWriteFontSet *fontset,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFontSetBuilder(
+        IDWriteFontSetBuilder2 **builder) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateTextFormat(
+        const WCHAR *familyname,
+        IDWriteFontCollection *collection,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_axis,
+        FLOAT fontsize,
+        const WCHAR *localename,
+        IDWriteTextFormat3 **format) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory6, 0xf3744d80, 0x21f7, 0x42eb, 0xb3,0x5d, 0x99,0x5b,0xc7,0x2f,0xc2,0x23)
+#endif
+#else
+typedef struct IDWriteFactory6Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory6 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory6 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory6 *This);
+
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory6 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory6 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory6 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory6 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory6 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory6 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory6 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory6 *This,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory6 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory6 *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory6 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory6 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory6 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory6 *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory6 *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory6 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory6 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory6 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory6 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory6 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory6 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory6 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory6 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
+
+    /*** IDWriteFactory2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontFallback)(
+        IDWriteFactory6 *This,
+        IDWriteFontFallback **fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallbackBuilder)(
+        IDWriteFactory6 *This,
+        IDWriteFontFallbackBuilder **fallbackbuilder);
+
+    HRESULT (STDMETHODCALLTYPE *TranslateColorGlyphRun)(
+        IDWriteFactory6 *This,
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateCustomRenderingParams)(
+        IDWriteFactory6 *This,
+        FLOAT gamma,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        IDWriteRenderingParams2 **params);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateGlyphRunAnalysis)(
+        IDWriteFactory6 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_MEASURING_MODE measuringMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateGlyphRunAnalysis)(
+        IDWriteFactory6 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateCustomRenderingParams)(
+        IDWriteFactory6 *This,
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference_)(
+        IDWriteFactory6 *This,
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference)(
+        IDWriteFactory6 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontSet)(
+        IDWriteFactory6 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSetBuilder)(
+        IDWriteFactory6 *This,
+        IDWriteFontSetBuilder **builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontCollectionFromFontSet)(
+        IDWriteFactory6 *This,
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_GetSystemFontCollection)(
+        IDWriteFactory6 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontDownloadQueue)(
+        IDWriteFactory6 *This,
+        IDWriteFontDownloadQueue **queue);
+
+    /*** IDWriteFactory4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory4_TranslateColorGlyphRun)(
+        IDWriteFactory6 *This,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,
+        DWRITE_GLYPH_IMAGE_FORMATS desired_formats,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette,
+        IDWriteColorGlyphRunEnumerator1 **layers);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins_)(
+        IDWriteFactory6 *This,
+        const DWRITE_GLYPH_RUN *run,
+        D2D1_POINT_2F baseline_origin,
+        D2D1_POINT_2F *origins);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins)(
+        IDWriteFactory6 *This,
+        const DWRITE_GLYPH_RUN *run,
+        DWRITE_MEASURING_MODE measuring_mode,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_MATRIX *transform,
+        D2D1_POINT_2F *origins);
+
+    /*** IDWriteFactory5 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory5_CreateFontSetBuilder)(
+        IDWriteFactory6 *This,
+        IDWriteFontSetBuilder1 **fontset_builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInMemoryFontFileLoader)(
+        IDWriteFactory6 *This,
+        IDWriteInMemoryFontFileLoader **loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateHttpFontFileLoader)(
+        IDWriteFactory6 *This,
+        const WCHAR *referrer_url,
+        const WCHAR *extra_headers,
+        IDWriteRemoteFontFileLoader **loader);
+
+    DWRITE_CONTAINER_TYPE (STDMETHODCALLTYPE *AnalyzeContainerType)(
+        IDWriteFactory6 *This,
+        const void *data,
+        UINT32 data_size);
+
+    HRESULT (STDMETHODCALLTYPE *UnpackFontFile)(
+        IDWriteFactory6 *This,
+        DWRITE_CONTAINER_TYPE container_type,
+        const void *data,
+        UINT32 data_size,
+        IDWriteFontFileStream **stream);
+
+    /*** IDWriteFactory6 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateFontFaceReference)(
+        IDWriteFactory6 *This,
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_axis,
+        IDWriteFontFaceReference1 **face_ref);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
+        IDWriteFactory6 *This,
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        IDWriteFontResource **resource);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_GetSystemFontSet)(
+        IDWriteFactory6 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_GetSystemFontCollection)(
+        IDWriteFactory6 *This,
+        WINBOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateFontCollectionFromFontSet)(
+        IDWriteFactory6 *This,
+        IDWriteFontSet *fontset,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateFontSetBuilder)(
+        IDWriteFactory6 *This,
+        IDWriteFontSetBuilder2 **builder);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateTextFormat)(
+        IDWriteFactory6 *This,
+        const WCHAR *familyname,
+        IDWriteFontCollection *collection,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_axis,
+        FLOAT fontsize,
+        const WCHAR *localename,
+        IDWriteTextFormat3 **format);
+
+    END_INTERFACE
+} IDWriteFactory6Vtbl;
+
+interface IDWriteFactory6 {
+    CONST_VTBL IDWriteFactory6Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory6_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory6_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory6_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory6_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory6_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory6_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory6_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory6_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory6_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory6_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory6_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory6_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory6_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory6_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory6_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory6_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory6_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory6_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory6_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory6_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+/*** IDWriteFactory2 methods ***/
+#define IDWriteFactory6_GetSystemFontFallback(This,fallback) (This)->lpVtbl->GetSystemFontFallback(This,fallback)
+#define IDWriteFactory6_CreateFontFallbackBuilder(This,fallbackbuilder) (This)->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder)
+/*** IDWriteFactory3 methods ***/
+#define IDWriteFactory6_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis) (This)->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis)
+#define IDWriteFactory6_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params) (This)->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params)
+#define IDWriteFactory6_CreateFontFaceReference_(This,file,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference)
+#define IDWriteFactory6_GetFontDownloadQueue(This,queue) (This)->lpVtbl->GetFontDownloadQueue(This,queue)
+/*** IDWriteFactory4 methods ***/
+#define IDWriteFactory6_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers) (This)->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers)
+#define IDWriteFactory6_ComputeGlyphOrigins_(This,run,baseline_origin,origins) (This)->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins)
+#define IDWriteFactory6_ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins) (This)->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins)
+/*** IDWriteFactory5 methods ***/
+#define IDWriteFactory6_CreateInMemoryFontFileLoader(This,loader) (This)->lpVtbl->CreateInMemoryFontFileLoader(This,loader)
+#define IDWriteFactory6_CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader) (This)->lpVtbl->CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader)
+#define IDWriteFactory6_AnalyzeContainerType(This,data,data_size) (This)->lpVtbl->AnalyzeContainerType(This,data,data_size)
+#define IDWriteFactory6_UnpackFontFile(This,container_type,data,data_size,stream) (This)->lpVtbl->UnpackFontFile(This,container_type,data,data_size,stream)
+/*** IDWriteFactory6 methods ***/
+#define IDWriteFactory6_CreateFontFaceReference(This,file,face_index,simulations,axis_values,num_axis,face_ref) (This)->lpVtbl->IDWriteFactory6_CreateFontFaceReference(This,file,face_index,simulations,axis_values,num_axis,face_ref)
+#define IDWriteFactory6_CreateFontResource(This,file,face_index,resource) (This)->lpVtbl->CreateFontResource(This,file,face_index,resource)
+#define IDWriteFactory6_GetSystemFontSet(This,include_downloadable,fontset) (This)->lpVtbl->IDWriteFactory6_GetSystemFontSet(This,include_downloadable,fontset)
+#define IDWriteFactory6_GetSystemFontCollection(This,include_downloadable,family_model,collection) (This)->lpVtbl->IDWriteFactory6_GetSystemFontCollection(This,include_downloadable,family_model,collection)
+#define IDWriteFactory6_CreateFontCollectionFromFontSet(This,fontset,family_model,collection) (This)->lpVtbl->IDWriteFactory6_CreateFontCollectionFromFontSet(This,fontset,family_model,collection)
+#define IDWriteFactory6_CreateFontSetBuilder(This,builder) (This)->lpVtbl->IDWriteFactory6_CreateFontSetBuilder(This,builder)
+#define IDWriteFactory6_CreateTextFormat(This,familyname,collection,axis_values,num_axis,fontsize,localename,format) (This)->lpVtbl->IDWriteFactory6_CreateTextFormat(This,familyname,collection,axis_values,num_axis,fontsize,localename,format)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_QueryInterface(IDWriteFactory6* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory6_AddRef(IDWriteFactory6* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory6_Release(IDWriteFactory6* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_CreateCustomFontCollection(IDWriteFactory6* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_RegisterFontCollectionLoader(IDWriteFactory6* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_UnregisterFontCollectionLoader(IDWriteFactory6* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontFileReference(IDWriteFactory6* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateCustomFontFileReference(IDWriteFactory6* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontFace(IDWriteFactory6* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateRenderingParams(IDWriteFactory6* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateMonitorRenderingParams(IDWriteFactory6* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_RegisterFontFileLoader(IDWriteFactory6* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_UnregisterFontFileLoader(IDWriteFactory6* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateTypography(IDWriteFactory6* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_GetGdiInterop(IDWriteFactory6* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateTextLayout(IDWriteFactory6* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateGdiCompatibleTextLayout(IDWriteFactory6* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateEllipsisTrimmingSign(IDWriteFactory6* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateTextAnalyzer(IDWriteFactory6* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateNumberSubstitution(IDWriteFactory6* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_GetEudcFontCollection(IDWriteFactory6* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+/*** IDWriteFactory2 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_GetSystemFontFallback(IDWriteFactory6* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetSystemFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontFallbackBuilder(IDWriteFactory6* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
+    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
+}
+/*** IDWriteFactory3 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_CreateGlyphRunAnalysis(IDWriteFactory6* This,const DWRITE_GLYPH_RUN *run,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_MEASURING_MODE measuring_mode,DWRITE_GRID_FIT_MODE gridfit_mode,DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,FLOAT origin_x,FLOAT origin_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateCustomRenderingParams(IDWriteFactory6* This,FLOAT gamma,FLOAT enhanced_contrast,FLOAT grayscale_enhanced_contrast,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY pixel_geometry,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_GRID_FIT_MODE gridfit_mode,IDWriteRenderingParams3 **params) {
+    return This->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontFaceReference_(IDWriteFactory6* This,IDWriteFontFile *file,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_GetFontDownloadQueue(IDWriteFactory6* This,IDWriteFontDownloadQueue **queue) {
+    return This->lpVtbl->GetFontDownloadQueue(This,queue);
+}
+/*** IDWriteFactory4 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_TranslateColorGlyphRun(IDWriteFactory6* This,D2D1_POINT_2F baseline_origin,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,DWRITE_GLYPH_IMAGE_FORMATS desired_formats,DWRITE_MEASURING_MODE measuring_mode,const DWRITE_MATRIX *transform,UINT32 palette,IDWriteColorGlyphRunEnumerator1 **layers) {
+    return This->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_ComputeGlyphOrigins_(IDWriteFactory6* This,const DWRITE_GLYPH_RUN *run,D2D1_POINT_2F baseline_origin,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_ComputeGlyphOrigins(IDWriteFactory6* This,const DWRITE_GLYPH_RUN *run,DWRITE_MEASURING_MODE measuring_mode,D2D1_POINT_2F baseline_origin,const DWRITE_MATRIX *transform,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins);
+}
+/*** IDWriteFactory5 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_CreateInMemoryFontFileLoader(IDWriteFactory6* This,IDWriteInMemoryFontFileLoader **loader) {
+    return This->lpVtbl->CreateInMemoryFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateHttpFontFileLoader(IDWriteFactory6* This,const WCHAR *referrer_url,const WCHAR *extra_headers,IDWriteRemoteFontFileLoader **loader) {
+    return This->lpVtbl->CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader);
+}
+static FORCEINLINE DWRITE_CONTAINER_TYPE IDWriteFactory6_AnalyzeContainerType(IDWriteFactory6* This,const void *data,UINT32 data_size) {
+    return This->lpVtbl->AnalyzeContainerType(This,data,data_size);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_UnpackFontFile(IDWriteFactory6* This,DWRITE_CONTAINER_TYPE container_type,const void *data,UINT32 data_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->UnpackFontFile(This,container_type,data,data_size,stream);
+}
+/*** IDWriteFactory6 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontFaceReference(IDWriteFactory6* This,IDWriteFontFile *file,UINT32 face_index,DWRITE_FONT_SIMULATIONS simulations,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_axis,IDWriteFontFaceReference1 **face_ref) {
+    return This->lpVtbl->IDWriteFactory6_CreateFontFaceReference(This,file,face_index,simulations,axis_values,num_axis,face_ref);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontResource(IDWriteFactory6* This,IDWriteFontFile *file,UINT32 face_index,IDWriteFontResource **resource) {
+    return This->lpVtbl->CreateFontResource(This,file,face_index,resource);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_GetSystemFontSet(IDWriteFactory6* This,WINBOOL include_downloadable,IDWriteFontSet1 **fontset) {
+    return This->lpVtbl->IDWriteFactory6_GetSystemFontSet(This,include_downloadable,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_GetSystemFontCollection(IDWriteFactory6* This,WINBOOL include_downloadable,DWRITE_FONT_FAMILY_MODEL family_model,IDWriteFontCollection2 **collection) {
+    return This->lpVtbl->IDWriteFactory6_GetSystemFontCollection(This,include_downloadable,family_model,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontCollectionFromFontSet(IDWriteFactory6* This,IDWriteFontSet *fontset,DWRITE_FONT_FAMILY_MODEL family_model,IDWriteFontCollection2 **collection) {
+    return This->lpVtbl->IDWriteFactory6_CreateFontCollectionFromFontSet(This,fontset,family_model,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateFontSetBuilder(IDWriteFactory6* This,IDWriteFontSetBuilder2 **builder) {
+    return This->lpVtbl->IDWriteFactory6_CreateFontSetBuilder(This,builder);
+}
+static FORCEINLINE HRESULT IDWriteFactory6_CreateTextFormat(IDWriteFactory6* This,const WCHAR *familyname,IDWriteFontCollection *collection,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_axis,FLOAT fontsize,const WCHAR *localename,IDWriteTextFormat3 **format) {
+    return This->lpVtbl->IDWriteFactory6_CreateTextFormat(This,familyname,collection,axis_values,num_axis,fontsize,localename,format);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFactory6_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDWriteFactory7 interface
+ */
+#ifndef __IDWriteFactory7_INTERFACE_DEFINED__
+#define __IDWriteFactory7_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDWriteFactory7, 0x35d0e0b3, 0x9076, 0x4d2e, 0xa0,0x16, 0xa9,0x1b,0x56,0x8a,0x06,0xb4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("35d0e0b3-9076-4d2e-a016-a91b568a06b4")
+IDWriteFactory7 : public IDWriteFactory6
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontSet(
+        WINBOOL include_downloadable,
+        IDWriteFontSet2 **fontset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSystemFontCollection(
+        WINBOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection3 **collection) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDWriteFactory7, 0x35d0e0b3, 0x9076, 0x4d2e, 0xa0,0x16, 0xa9,0x1b,0x56,0x8a,0x06,0xb4)
+#endif
+#else
+typedef struct IDWriteFactory7Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDWriteFactory7 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDWriteFactory7 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDWriteFactory7 *This);
+
+    /*** IDWriteFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontCollection)(
+        IDWriteFactory7 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontCollection)(
+        IDWriteFactory7 *This,
+        IDWriteFontCollectionLoader *loader,
+        const void *key,
+        UINT32 key_size,
+        IDWriteFontCollection **collection);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontCollectionLoader)(
+        IDWriteFactory7 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontCollectionLoader)(
+        IDWriteFactory7 *This,
+        IDWriteFontCollectionLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFileReference)(
+        IDWriteFactory7 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomFontFileReference)(
+        IDWriteFactory7 *This,
+        const void *reference_key,
+        UINT32 key_size,
+        IDWriteFontFileLoader *loader,
+        IDWriteFontFile **font_file);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
+        IDWriteFactory7 *This,
+        DWRITE_FONT_FACE_TYPE facetype,
+        UINT32 files_number,
+        IDWriteFontFile *const *font_files,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS sim_flags,
+        IDWriteFontFace **font_face);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderingParams)(
+        IDWriteFactory7 *This,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateMonitorRenderingParams)(
+        IDWriteFactory7 *This,
+        HMONITOR monitor,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomRenderingParams)(
+        IDWriteFactory7 *This,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams **params);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFontFileLoader)(
+        IDWriteFactory7 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFontFileLoader)(
+        IDWriteFactory7 *This,
+        IDWriteFontFileLoader *loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextFormat)(
+        IDWriteFactory7 *This,
+        const WCHAR *family_name,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style,
+        DWRITE_FONT_STRETCH stretch,
+        FLOAT size,
+        const WCHAR *locale,
+        IDWriteTextFormat **format);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTypography)(
+        IDWriteFactory7 *This,
+        IDWriteTypography **typography);
+
+    HRESULT (STDMETHODCALLTYPE *GetGdiInterop)(
+        IDWriteFactory7 *This,
+        IDWriteGdiInterop **gdi_interop);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextLayout)(
+        IDWriteFactory7 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT max_width,
+        FLOAT max_height,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGdiCompatibleTextLayout)(
+        IDWriteFactory7 *This,
+        const WCHAR *string,
+        UINT32 len,
+        IDWriteTextFormat *format,
+        FLOAT layout_width,
+        FLOAT layout_height,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        WINBOOL use_gdi_natural,
+        IDWriteTextLayout **layout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEllipsisTrimmingSign)(
+        IDWriteFactory7 *This,
+        IDWriteTextFormat *format,
+        IDWriteInlineObject **trimming_sign);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextAnalyzer)(
+        IDWriteFactory7 *This,
+        IDWriteTextAnalyzer **analyzer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNumberSubstitution)(
+        IDWriteFactory7 *This,
+        DWRITE_NUMBER_SUBSTITUTION_METHOD method,
+        const WCHAR *locale,
+        WINBOOL ignore_user_override,
+        IDWriteNumberSubstitution **substitution);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGlyphRunAnalysis)(
+        IDWriteFactory7 *This,
+        const DWRITE_GLYPH_RUN *glyph_run,
+        FLOAT pixels_per_dip,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        FLOAT baseline_x,
+        FLOAT baseline_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEudcFontCollection)(
+        IDWriteFactory7 *This,
+        IDWriteFontCollection **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory1_CreateCustomRenderingParams)(
+        IDWriteFactory7 *This,
+        FLOAT gamma,
+        FLOAT enhcontrast,
+        FLOAT enhcontrast_grayscale,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY geometry,
+        DWRITE_RENDERING_MODE mode,
+        IDWriteRenderingParams1 **params);
+
+    /*** IDWriteFactory2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontFallback)(
+        IDWriteFactory7 *This,
+        IDWriteFontFallback **fallback);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFallbackBuilder)(
+        IDWriteFactory7 *This,
+        IDWriteFontFallbackBuilder **fallbackbuilder);
+
+    HRESULT (STDMETHODCALLTYPE *TranslateColorGlyphRun)(
+        IDWriteFactory7 *This,
+        FLOAT originX,
+        FLOAT originY,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
+        DWRITE_MEASURING_MODE mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette_index,
+        IDWriteColorGlyphRunEnumerator **colorlayers);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateCustomRenderingParams)(
+        IDWriteFactory7 *This,
+        FLOAT gamma,
+        FLOAT contrast,
+        FLOAT grayscalecontrast,
+        FLOAT cleartypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        IDWriteRenderingParams2 **params);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory2_CreateGlyphRunAnalysis)(
+        IDWriteFactory7 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE renderingMode,
+        DWRITE_MEASURING_MODE measuringMode,
+        DWRITE_GRID_FIT_MODE gridFitMode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
+        FLOAT originX,
+        FLOAT originY,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    /*** IDWriteFactory3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateGlyphRunAnalysis)(
+        IDWriteFactory7 *This,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_MATRIX *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_CreateCustomRenderingParams)(
+        IDWriteFactory7 *This,
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference_)(
+        IDWriteFactory7 *This,
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontFaceReference)(
+        IDWriteFactory7 *This,
+        const WCHAR *path,
+        const FILETIME *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT (STDMETHODCALLTYPE *GetSystemFontSet)(
+        IDWriteFactory7 *This,
+        IDWriteFontSet **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontSetBuilder)(
+        IDWriteFactory7 *This,
+        IDWriteFontSetBuilder **builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontCollectionFromFontSet)(
+        IDWriteFactory7 *This,
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory3_GetSystemFontCollection)(
+        IDWriteFactory7 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        WINBOOL check_for_updates);
+
+    HRESULT (STDMETHODCALLTYPE *GetFontDownloadQueue)(
+        IDWriteFactory7 *This,
+        IDWriteFontDownloadQueue **queue);
+
+    /*** IDWriteFactory4 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory4_TranslateColorGlyphRun)(
+        IDWriteFactory7 *This,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_GLYPH_RUN *run,
+        const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,
+        DWRITE_GLYPH_IMAGE_FORMATS desired_formats,
+        DWRITE_MEASURING_MODE measuring_mode,
+        const DWRITE_MATRIX *transform,
+        UINT32 palette,
+        IDWriteColorGlyphRunEnumerator1 **layers);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins_)(
+        IDWriteFactory7 *This,
+        const DWRITE_GLYPH_RUN *run,
+        D2D1_POINT_2F baseline_origin,
+        D2D1_POINT_2F *origins);
+
+    HRESULT (STDMETHODCALLTYPE *ComputeGlyphOrigins)(
+        IDWriteFactory7 *This,
+        const DWRITE_GLYPH_RUN *run,
+        DWRITE_MEASURING_MODE measuring_mode,
+        D2D1_POINT_2F baseline_origin,
+        const DWRITE_MATRIX *transform,
+        D2D1_POINT_2F *origins);
+
+    /*** IDWriteFactory5 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory5_CreateFontSetBuilder)(
+        IDWriteFactory7 *This,
+        IDWriteFontSetBuilder1 **fontset_builder);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInMemoryFontFileLoader)(
+        IDWriteFactory7 *This,
+        IDWriteInMemoryFontFileLoader **loader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateHttpFontFileLoader)(
+        IDWriteFactory7 *This,
+        const WCHAR *referrer_url,
+        const WCHAR *extra_headers,
+        IDWriteRemoteFontFileLoader **loader);
+
+    DWRITE_CONTAINER_TYPE (STDMETHODCALLTYPE *AnalyzeContainerType)(
+        IDWriteFactory7 *This,
+        const void *data,
+        UINT32 data_size);
+
+    HRESULT (STDMETHODCALLTYPE *UnpackFontFile)(
+        IDWriteFactory7 *This,
+        DWRITE_CONTAINER_TYPE container_type,
+        const void *data,
+        UINT32 data_size,
+        IDWriteFontFileStream **stream);
+
+    /*** IDWriteFactory6 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateFontFaceReference)(
+        IDWriteFactory7 *This,
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_axis,
+        IDWriteFontFaceReference1 **face_ref);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
+        IDWriteFactory7 *This,
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        IDWriteFontResource **resource);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_GetSystemFontSet)(
+        IDWriteFactory7 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontSet1 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_GetSystemFontCollection)(
+        IDWriteFactory7 *This,
+        WINBOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateFontCollectionFromFontSet)(
+        IDWriteFactory7 *This,
+        IDWriteFontSet *fontset,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateFontSetBuilder)(
+        IDWriteFactory7 *This,
+        IDWriteFontSetBuilder2 **builder);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory6_CreateTextFormat)(
+        IDWriteFactory7 *This,
+        const WCHAR *familyname,
+        IDWriteFontCollection *collection,
+        const DWRITE_FONT_AXIS_VALUE *axis_values,
+        UINT32 num_axis,
+        FLOAT fontsize,
+        const WCHAR *localename,
+        IDWriteTextFormat3 **format);
+
+    /*** IDWriteFactory7 methods ***/
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory7_GetSystemFontSet)(
+        IDWriteFactory7 *This,
+        WINBOOL include_downloadable,
+        IDWriteFontSet2 **fontset);
+
+    HRESULT (STDMETHODCALLTYPE *IDWriteFactory7_GetSystemFontCollection)(
+        IDWriteFactory7 *This,
+        WINBOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection3 **collection);
+
+    END_INTERFACE
+} IDWriteFactory7Vtbl;
+
+interface IDWriteFactory7 {
+    CONST_VTBL IDWriteFactory7Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDWriteFactory7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDWriteFactory7_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDWriteFactory7_Release(This) (This)->lpVtbl->Release(This)
+/*** IDWriteFactory methods ***/
+#define IDWriteFactory7_CreateCustomFontCollection(This,loader,key,key_size,collection) (This)->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection)
+#define IDWriteFactory7_RegisterFontCollectionLoader(This,loader) (This)->lpVtbl->RegisterFontCollectionLoader(This,loader)
+#define IDWriteFactory7_UnregisterFontCollectionLoader(This,loader) (This)->lpVtbl->UnregisterFontCollectionLoader(This,loader)
+#define IDWriteFactory7_CreateFontFileReference(This,path,writetime,font_file) (This)->lpVtbl->CreateFontFileReference(This,path,writetime,font_file)
+#define IDWriteFactory7_CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file) (This)->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file)
+#define IDWriteFactory7_CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face) (This)->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face)
+#define IDWriteFactory7_CreateRenderingParams(This,params) (This)->lpVtbl->CreateRenderingParams(This,params)
+#define IDWriteFactory7_CreateMonitorRenderingParams(This,monitor,params) (This)->lpVtbl->CreateMonitorRenderingParams(This,monitor,params)
+#define IDWriteFactory7_RegisterFontFileLoader(This,loader) (This)->lpVtbl->RegisterFontFileLoader(This,loader)
+#define IDWriteFactory7_UnregisterFontFileLoader(This,loader) (This)->lpVtbl->UnregisterFontFileLoader(This,loader)
+#define IDWriteFactory7_CreateTypography(This,typography) (This)->lpVtbl->CreateTypography(This,typography)
+#define IDWriteFactory7_GetGdiInterop(This,gdi_interop) (This)->lpVtbl->GetGdiInterop(This,gdi_interop)
+#define IDWriteFactory7_CreateTextLayout(This,string,len,format,max_width,max_height,layout) (This)->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout)
+#define IDWriteFactory7_CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout) (This)->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout)
+#define IDWriteFactory7_CreateEllipsisTrimmingSign(This,format,trimming_sign) (This)->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign)
+#define IDWriteFactory7_CreateTextAnalyzer(This,analyzer) (This)->lpVtbl->CreateTextAnalyzer(This,analyzer)
+#define IDWriteFactory7_CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution) (This)->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution)
+/*** IDWriteFactory1 methods ***/
+#define IDWriteFactory7_GetEudcFontCollection(This,collection,check_for_updates) (This)->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates)
+/*** IDWriteFactory2 methods ***/
+#define IDWriteFactory7_GetSystemFontFallback(This,fallback) (This)->lpVtbl->GetSystemFontFallback(This,fallback)
+#define IDWriteFactory7_CreateFontFallbackBuilder(This,fallbackbuilder) (This)->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder)
+/*** IDWriteFactory3 methods ***/
+#define IDWriteFactory7_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis) (This)->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis)
+#define IDWriteFactory7_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params) (This)->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params)
+#define IDWriteFactory7_CreateFontFaceReference_(This,file,index,simulations,reference) (This)->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference)
+#define IDWriteFactory7_GetFontDownloadQueue(This,queue) (This)->lpVtbl->GetFontDownloadQueue(This,queue)
+/*** IDWriteFactory4 methods ***/
+#define IDWriteFactory7_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers) (This)->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers)
+#define IDWriteFactory7_ComputeGlyphOrigins_(This,run,baseline_origin,origins) (This)->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins)
+#define IDWriteFactory7_ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins) (This)->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins)
+/*** IDWriteFactory5 methods ***/
+#define IDWriteFactory7_CreateInMemoryFontFileLoader(This,loader) (This)->lpVtbl->CreateInMemoryFontFileLoader(This,loader)
+#define IDWriteFactory7_CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader) (This)->lpVtbl->CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader)
+#define IDWriteFactory7_AnalyzeContainerType(This,data,data_size) (This)->lpVtbl->AnalyzeContainerType(This,data,data_size)
+#define IDWriteFactory7_UnpackFontFile(This,container_type,data,data_size,stream) (This)->lpVtbl->UnpackFontFile(This,container_type,data,data_size,stream)
+/*** IDWriteFactory6 methods ***/
+#define IDWriteFactory7_CreateFontFaceReference(This,file,face_index,simulations,axis_values,num_axis,face_ref) (This)->lpVtbl->IDWriteFactory6_CreateFontFaceReference(This,file,face_index,simulations,axis_values,num_axis,face_ref)
+#define IDWriteFactory7_CreateFontResource(This,file,face_index,resource) (This)->lpVtbl->CreateFontResource(This,file,face_index,resource)
+#define IDWriteFactory7_CreateFontCollectionFromFontSet(This,fontset,family_model,collection) (This)->lpVtbl->IDWriteFactory6_CreateFontCollectionFromFontSet(This,fontset,family_model,collection)
+#define IDWriteFactory7_CreateFontSetBuilder(This,builder) (This)->lpVtbl->IDWriteFactory6_CreateFontSetBuilder(This,builder)
+#define IDWriteFactory7_CreateTextFormat(This,familyname,collection,axis_values,num_axis,fontsize,localename,format) (This)->lpVtbl->IDWriteFactory6_CreateTextFormat(This,familyname,collection,axis_values,num_axis,fontsize,localename,format)
+/*** IDWriteFactory7 methods ***/
+#define IDWriteFactory7_GetSystemFontSet(This,include_downloadable,fontset) (This)->lpVtbl->IDWriteFactory7_GetSystemFontSet(This,include_downloadable,fontset)
+#define IDWriteFactory7_GetSystemFontCollection(This,include_downloadable,family_model,collection) (This)->lpVtbl->IDWriteFactory7_GetSystemFontCollection(This,include_downloadable,family_model,collection)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_QueryInterface(IDWriteFactory7* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDWriteFactory7_AddRef(IDWriteFactory7* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDWriteFactory7_Release(IDWriteFactory7* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDWriteFactory methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_CreateCustomFontCollection(IDWriteFactory7* This,IDWriteFontCollectionLoader *loader,const void *key,UINT32 key_size,IDWriteFontCollection **collection) {
+    return This->lpVtbl->CreateCustomFontCollection(This,loader,key,key_size,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_RegisterFontCollectionLoader(IDWriteFactory7* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_UnregisterFontCollectionLoader(IDWriteFactory7* This,IDWriteFontCollectionLoader *loader) {
+    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontFileReference(IDWriteFactory7* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateCustomFontFileReference(IDWriteFactory7* This,const void *reference_key,UINT32 key_size,IDWriteFontFileLoader *loader,IDWriteFontFile **font_file) {
+    return This->lpVtbl->CreateCustomFontFileReference(This,reference_key,key_size,loader,font_file);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontFace(IDWriteFactory7* This,DWRITE_FONT_FACE_TYPE facetype,UINT32 files_number,IDWriteFontFile *const *font_files,UINT32 index,DWRITE_FONT_SIMULATIONS sim_flags,IDWriteFontFace **font_face) {
+    return This->lpVtbl->CreateFontFace(This,facetype,files_number,font_files,index,sim_flags,font_face);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateRenderingParams(IDWriteFactory7* This,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateRenderingParams(This,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateMonitorRenderingParams(IDWriteFactory7* This,HMONITOR monitor,IDWriteRenderingParams **params) {
+    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_RegisterFontFileLoader(IDWriteFactory7* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->RegisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_UnregisterFontFileLoader(IDWriteFactory7* This,IDWriteFontFileLoader *loader) {
+    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateTypography(IDWriteFactory7* This,IDWriteTypography **typography) {
+    return This->lpVtbl->CreateTypography(This,typography);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_GetGdiInterop(IDWriteFactory7* This,IDWriteGdiInterop **gdi_interop) {
+    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateTextLayout(IDWriteFactory7* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT max_width,FLOAT max_height,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateTextLayout(This,string,len,format,max_width,max_height,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateGdiCompatibleTextLayout(IDWriteFactory7* This,const WCHAR *string,UINT32 len,IDWriteTextFormat *format,FLOAT layout_width,FLOAT layout_height,FLOAT pixels_per_dip,const DWRITE_MATRIX *transform,WINBOOL use_gdi_natural,IDWriteTextLayout **layout) {
+    return This->lpVtbl->CreateGdiCompatibleTextLayout(This,string,len,format,layout_width,layout_height,pixels_per_dip,transform,use_gdi_natural,layout);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateEllipsisTrimmingSign(IDWriteFactory7* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
+    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateTextAnalyzer(IDWriteFactory7* This,IDWriteTextAnalyzer **analyzer) {
+    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateNumberSubstitution(IDWriteFactory7* This,DWRITE_NUMBER_SUBSTITUTION_METHOD method,const WCHAR *locale,WINBOOL ignore_user_override,IDWriteNumberSubstitution **substitution) {
+    return This->lpVtbl->CreateNumberSubstitution(This,method,locale,ignore_user_override,substitution);
+}
+/*** IDWriteFactory1 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_GetEudcFontCollection(IDWriteFactory7* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
+    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
+}
+/*** IDWriteFactory2 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_GetSystemFontFallback(IDWriteFactory7* This,IDWriteFontFallback **fallback) {
+    return This->lpVtbl->GetSystemFontFallback(This,fallback);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontFallbackBuilder(IDWriteFactory7* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
+    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
+}
+/*** IDWriteFactory3 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_CreateGlyphRunAnalysis(IDWriteFactory7* This,const DWRITE_GLYPH_RUN *run,const DWRITE_MATRIX *transform,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_MEASURING_MODE measuring_mode,DWRITE_GRID_FIT_MODE gridfit_mode,DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,FLOAT origin_x,FLOAT origin_y,IDWriteGlyphRunAnalysis **analysis) {
+    return This->lpVtbl->IDWriteFactory3_CreateGlyphRunAnalysis(This,run,transform,rendering_mode,measuring_mode,gridfit_mode,antialias_mode,origin_x,origin_y,analysis);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateCustomRenderingParams(IDWriteFactory7* This,FLOAT gamma,FLOAT enhanced_contrast,FLOAT grayscale_enhanced_contrast,FLOAT cleartype_level,DWRITE_PIXEL_GEOMETRY pixel_geometry,DWRITE_RENDERING_MODE1 rendering_mode,DWRITE_GRID_FIT_MODE gridfit_mode,IDWriteRenderingParams3 **params) {
+    return This->lpVtbl->IDWriteFactory3_CreateCustomRenderingParams(This,gamma,enhanced_contrast,grayscale_enhanced_contrast,cleartype_level,pixel_geometry,rendering_mode,gridfit_mode,params);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontFaceReference_(IDWriteFactory7* This,IDWriteFontFile *file,UINT32 index,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFaceReference **reference) {
+    return This->lpVtbl->CreateFontFaceReference_(This,file,index,simulations,reference);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_GetFontDownloadQueue(IDWriteFactory7* This,IDWriteFontDownloadQueue **queue) {
+    return This->lpVtbl->GetFontDownloadQueue(This,queue);
+}
+/*** IDWriteFactory4 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_TranslateColorGlyphRun(IDWriteFactory7* This,D2D1_POINT_2F baseline_origin,const DWRITE_GLYPH_RUN *run,const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc,DWRITE_GLYPH_IMAGE_FORMATS desired_formats,DWRITE_MEASURING_MODE measuring_mode,const DWRITE_MATRIX *transform,UINT32 palette,IDWriteColorGlyphRunEnumerator1 **layers) {
+    return This->lpVtbl->IDWriteFactory4_TranslateColorGlyphRun(This,baseline_origin,run,run_desc,desired_formats,measuring_mode,transform,palette,layers);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_ComputeGlyphOrigins_(IDWriteFactory7* This,const DWRITE_GLYPH_RUN *run,D2D1_POINT_2F baseline_origin,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins_(This,run,baseline_origin,origins);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_ComputeGlyphOrigins(IDWriteFactory7* This,const DWRITE_GLYPH_RUN *run,DWRITE_MEASURING_MODE measuring_mode,D2D1_POINT_2F baseline_origin,const DWRITE_MATRIX *transform,D2D1_POINT_2F *origins) {
+    return This->lpVtbl->ComputeGlyphOrigins(This,run,measuring_mode,baseline_origin,transform,origins);
+}
+/*** IDWriteFactory5 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_CreateInMemoryFontFileLoader(IDWriteFactory7* This,IDWriteInMemoryFontFileLoader **loader) {
+    return This->lpVtbl->CreateInMemoryFontFileLoader(This,loader);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateHttpFontFileLoader(IDWriteFactory7* This,const WCHAR *referrer_url,const WCHAR *extra_headers,IDWriteRemoteFontFileLoader **loader) {
+    return This->lpVtbl->CreateHttpFontFileLoader(This,referrer_url,extra_headers,loader);
+}
+static FORCEINLINE DWRITE_CONTAINER_TYPE IDWriteFactory7_AnalyzeContainerType(IDWriteFactory7* This,const void *data,UINT32 data_size) {
+    return This->lpVtbl->AnalyzeContainerType(This,data,data_size);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_UnpackFontFile(IDWriteFactory7* This,DWRITE_CONTAINER_TYPE container_type,const void *data,UINT32 data_size,IDWriteFontFileStream **stream) {
+    return This->lpVtbl->UnpackFontFile(This,container_type,data,data_size,stream);
+}
+/*** IDWriteFactory6 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontFaceReference(IDWriteFactory7* This,IDWriteFontFile *file,UINT32 face_index,DWRITE_FONT_SIMULATIONS simulations,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_axis,IDWriteFontFaceReference1 **face_ref) {
+    return This->lpVtbl->IDWriteFactory6_CreateFontFaceReference(This,file,face_index,simulations,axis_values,num_axis,face_ref);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontResource(IDWriteFactory7* This,IDWriteFontFile *file,UINT32 face_index,IDWriteFontResource **resource) {
+    return This->lpVtbl->CreateFontResource(This,file,face_index,resource);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontCollectionFromFontSet(IDWriteFactory7* This,IDWriteFontSet *fontset,DWRITE_FONT_FAMILY_MODEL family_model,IDWriteFontCollection2 **collection) {
+    return This->lpVtbl->IDWriteFactory6_CreateFontCollectionFromFontSet(This,fontset,family_model,collection);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateFontSetBuilder(IDWriteFactory7* This,IDWriteFontSetBuilder2 **builder) {
+    return This->lpVtbl->IDWriteFactory6_CreateFontSetBuilder(This,builder);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_CreateTextFormat(IDWriteFactory7* This,const WCHAR *familyname,IDWriteFontCollection *collection,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_axis,FLOAT fontsize,const WCHAR *localename,IDWriteTextFormat3 **format) {
+    return This->lpVtbl->IDWriteFactory6_CreateTextFormat(This,familyname,collection,axis_values,num_axis,fontsize,localename,format);
+}
+/*** IDWriteFactory7 methods ***/
+static FORCEINLINE HRESULT IDWriteFactory7_GetSystemFontSet(IDWriteFactory7* This,WINBOOL include_downloadable,IDWriteFontSet2 **fontset) {
+    return This->lpVtbl->IDWriteFactory7_GetSystemFontSet(This,include_downloadable,fontset);
+}
+static FORCEINLINE HRESULT IDWriteFactory7_GetSystemFontCollection(IDWriteFactory7* This,WINBOOL include_downloadable,DWRITE_FONT_FAMILY_MODEL family_model,IDWriteFontCollection3 **collection) {
+    return This->lpVtbl->IDWriteFactory7_GetSystemFontCollection(This,include_downloadable,family_model,collection);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDWriteFactory7_INTERFACE_DEFINED__ */
+
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
-    using IDWriteFontFace2::GetRecommendedRenderingMode;
+}
 #endif
 
-    STDMETHOD_(BOOL, IsCharacterLocal)(THIS_ UINT32 unicodeValue) PURE;
-    STDMETHOD_(BOOL, IsGlyphLocal)(THIS_ UINT16 glyphId) PURE;
-    STDMETHOD(AreCharactersLocal)(THIS_ WCHAR const *characters, UINT32 characterCount,
-        BOOL enqueueIfNotLocal, BOOL *isLocal) PURE;
-    STDMETHOD(AreGlyphsLocal)(THIS_ UINT16 const *glyphIndices, UINT32 glyphCount,
-        BOOL enqueueIfNotLocal, BOOL *isLocal) PURE;
-
-    END_INTERFACE
-};
-
-__CRT_UUID_DECL(IDWriteFontFace3, 0xd37d7598,0x09be,0x4222,0xa2,0x36,0x20,0x81,0x34,0x1c,0xc1,0xf2)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFace4
-DECLARE_INTERFACE_(IDWriteFontFace4,IDWriteFontFace3)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteFontFace methods */
-    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)(THIS) PURE;
-
-    STDMETHOD(GetFiles)(THIS_
-        UINT32 *numberOfFiles,
-        IDWriteFontFile **fontFiles) PURE;
-
-    STDMETHOD_(UINT32, GetIndex)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)(THIS) PURE;
-    STDMETHOD_(WINBOOL, IsSymbolFont)(THIS) PURE;
-
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-    STDMETHOD_(UINT16, GetGlyphCount)(THIS) PURE;
-
-    STDMETHOD(GetDesignGlyphMetrics)(THIS_
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(GetGlyphIndices)(THIS_
-        UINT32 const *codePoints,
-        UINT32 codePointCount,
-        UINT16 *glyphIndices) PURE;
-
-    STDMETHOD(TryGetFontTable)(THIS_
-        UINT32 openTypeTableTag,
-        const void **tableData,
-        UINT32 *tableSize,
-        void **tableContext,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD_(void, ReleaseFontTable)(THIS_
-        void *tableContext) PURE;
-
-    STDMETHOD(GetGlyphRunOutline)(THIS_
-        FLOAT emSize,
-        UINT16 const *glyphIndices,
-        FLOAT const *glyphAdvances,
-        DWRITE_GLYPH_OFFSET const *glyphOffsets,
-        UINT32 glyphCount,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        IDWriteGeometrySink *geometrySink) PURE;
-
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE *renderingMode) PURE;
-
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-    STDMETHOD(GetGdiCompatibleGlyphMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    /* IDWriteFontFace1 methods */
-    STDMETHOD_(void, GetMetrics)(THIS_ DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD_(void, GetCaretMetrics)(THIS_ DWRITE_CARET_METRICS*) PURE;
-    STDMETHOD(GetUnicodeRanges)(THIS_ UINT32, DWRITE_UNICODE_RANGE*,UINT32*) PURE;
-    STDMETHOD_(BOOL, IsMonospacedFont)(THIS) PURE;
-    STDMETHOD(GetDesignGlyphAdvances)(THIS_ UINT32,UINT16 const*,INT32*,BOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-    STDMETHOD(GetGdiCompatibleGlyphAdvances)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,BOOL,UINT32,
-            UINT16 const*,INT32*) PURE;
-    STDMETHOD(GetKerningPairAdjustments)(THIS_ UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(THIS);
-    STDMETHOD(GetRecommendedRenderingMode)(FLOAT,FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,
-            DWRITE_OUTLINE_THRESHOLD,DWRITE_MEASURING_MODE,DWRITE_RENDERING_MODE*) PURE;
-    STDMETHOD(GetVerticalGlyphVariants)(THIS_ UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(THIS);
-
-    /* IDWriteFontFace2 methods */
-    STDMETHOD_(BOOL, IsColorFont)(THIS) PURE;
-    STDMETHOD_(UINT32, GetColorPaletteCount)(THIS) PURE;
-    STDMETHOD_(UINT32, GetPaletteEntryCount)(THIS) PURE;
-        STDMETHOD(GetPaletteEntries)(THIS_
-        UINT32 colorPaletteIndex,
-        UINT32 firstEntryIndex,
-        UINT32 entryCount,
-        DWRITE_COLOR_F* paletteEntries
-        ) PURE;
-
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT fontEmSize,
-        FLOAT dpiX,
-        FLOAT dpiY,
-        DWRITE_MATRIX const* transform,
-        BOOL isSideways,
-        DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams* renderingParams,
-        DWRITE_RENDERING_MODE* renderingMode,
-        DWRITE_GRID_FIT_MODE* gridFitMode
-        ) PURE;
-
-    /* IDWriteFontFace3 methods */
-    STDMETHOD(GetFontFaceReference)(THIS_ IDWriteFontFaceReference **fontFaceReference) PURE;
-    STDMETHOD_(void, GetPanose)(THIS_ DWRITE_PANOSE *panose) PURE;
-    STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)(THIS) PURE;
-    STDMETHOD(GetFamilyNames)(THIS_ IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD(GetFaceNames)(THIS_ IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD(GetInformationalStrings)(THIS_ DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
-        IDWriteLocalizedStrings **informationalStrings, BOOL *exists) PURE;
-    STDMETHOD_(BOOL, HasCharacter)(THIS_ UINT32 unicodeValue) PURE;
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_ FLOAT fontEmSize, FLOAT dpiX, FLOAT dpiY,
-        DWRITE_MATRIX const *transform, BOOL isSideways, DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode, IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE1 *renderingMode, DWRITE_GRID_FIT_MODE *gridFitMode) PURE;
-    STDMETHOD_(BOOL, IsCharacterLocal)(THIS_ UINT32 unicodeValue) PURE;
-    STDMETHOD_(BOOL, IsGlyphLocal)(THIS_ UINT16 glyphId) PURE;
-    STDMETHOD(AreCharactersLocal)(THIS_ WCHAR const *characters, UINT32 characterCount,
-        BOOL enqueueIfNotLocal, BOOL *isLocal) PURE;
-    STDMETHOD(AreGlyphsLocal)(THIS_ UINT16 const *glyphIndices, UINT32 glyphCount,
-        BOOL enqueueIfNotLocal, BOOL *isLocal) PURE;
-#endif
-
-    /* IDWriteFontFace4 methods */
-    STDMETHOD_(DWRITE_GLYPH_IMAGE_FORMATS, GetGlyphImageFormats)(THIS) PURE;
-    STDMETHOD(GetGlyphImageFormats)(THIS_ UINT16 glyphId, UINT32 pixelsPerEmFirst,
-        UINT32 pixelsPerEmLast, DWRITE_GLYPH_IMAGE_FORMATS *glyphImageFormats) PURE;
-    STDMETHOD(GetGlyphImageData)(THIS_ UINT16 glyphId, UINT32 pixelsPerEm,
-        DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat, DWRITE_GLYPH_IMAGE_DATA *glyphData,
-        void **glyphDataContext) PURE;
-    STDMETHOD_(void, ReleaseGlyphImageData)(THIS_ void *glyphDataContext) PURE;
-
-    END_INTERFACE
-};
-
-__CRT_UUID_DECL(IDWriteFontFace4, 0x27f2a904,0x4eb8,0x441d,0x96,0x78,0x05,0x63,0xf5,0x3e,0x3e,0x2f)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontFace5
-DECLARE_INTERFACE_(IDWriteFontFace5,IDWriteFontFace4)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteFontFace methods */
-    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)(THIS) PURE;
-
-    STDMETHOD(GetFiles)(THIS_
-        UINT32 *numberOfFiles,
-        IDWriteFontFile **fontFiles) PURE;
-
-    STDMETHOD_(UINT32, GetIndex)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)(THIS) PURE;
-    STDMETHOD_(WINBOOL, IsSymbolFont)(THIS) PURE;
-
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-    STDMETHOD_(UINT16, GetGlyphCount)(THIS) PURE;
-
-    STDMETHOD(GetDesignGlyphMetrics)(THIS_
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    STDMETHOD(GetGlyphIndices)(THIS_
-        UINT32 const *codePoints,
-        UINT32 codePointCount,
-        UINT16 *glyphIndices) PURE;
-
-    STDMETHOD(TryGetFontTable)(THIS_
-        UINT32 openTypeTableTag,
-        const void **tableData,
-        UINT32 *tableSize,
-        void **tableContext,
-        WINBOOL *exists) PURE;
-
-    STDMETHOD_(void, ReleaseFontTable)(THIS_
-        void *tableContext) PURE;
-
-    STDMETHOD(GetGlyphRunOutline)(THIS_
-        FLOAT emSize,
-        UINT16 const *glyphIndices,
-        FLOAT const *glyphAdvances,
-        DWRITE_GLYPH_OFFSET const *glyphOffsets,
-        UINT32 glyphCount,
-        WINBOOL isSideways,
-        WINBOOL isRightToLeft,
-        IDWriteGeometrySink *geometrySink) PURE;
-
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE *renderingMode) PURE;
-
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        DWRITE_FONT_METRICS *fontFaceMetrics) PURE;
-
-    STDMETHOD(GetGdiCompatibleGlyphMetrics)(THIS_
-        FLOAT emSize,
-        FLOAT pixelsPerDip,
-        DWRITE_MATRIX const *transform,
-        WINBOOL useGdiNatural,
-        UINT16 const *glyphIndices,
-        UINT32 glyphCount,
-        DWRITE_GLYPH_METRICS *glyphMetrics,
-        WINBOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-
-    /* IDWriteFontFace1 methods */
-    STDMETHOD_(void, GetMetrics)(THIS_ DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD(GetGdiCompatibleMetrics)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,DWRITE_FONT_METRICS1*) PURE;
-    STDMETHOD_(void, GetCaretMetrics)(THIS_ DWRITE_CARET_METRICS*) PURE;
-    STDMETHOD(GetUnicodeRanges)(THIS_ UINT32, DWRITE_UNICODE_RANGE*,UINT32*) PURE;
-    STDMETHOD_(BOOL, IsMonospacedFont)(THIS) PURE;
-    STDMETHOD(GetDesignGlyphAdvances)(THIS_ UINT32,UINT16 const*,INT32*,BOOL isSideways __MINGW_DEF_ARG_VAL(FALSE)) PURE;
-    STDMETHOD(GetGdiCompatibleGlyphAdvances)(THIS_ FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,BOOL,UINT32,
-            UINT16 const*,INT32*) PURE;
-    STDMETHOD(GetKerningPairAdjustments)(THIS_ UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(THIS);
-    STDMETHOD(GetRecommendedRenderingMode)(FLOAT,FLOAT,FLOAT,DWRITE_MATRIX const*,BOOL,
-            DWRITE_OUTLINE_THRESHOLD,DWRITE_MEASURING_MODE,DWRITE_RENDERING_MODE*) PURE;
-    STDMETHOD(GetVerticalGlyphVariants)(THIS_ UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(THIS);
-
-    /* IDWriteFontFace2 methods */
-    STDMETHOD_(BOOL, IsColorFont)(THIS) PURE;
-    STDMETHOD_(UINT32, GetColorPaletteCount)(THIS) PURE;
-    STDMETHOD_(UINT32, GetPaletteEntryCount)(THIS) PURE;
-        STDMETHOD(GetPaletteEntries)(THIS_
-        UINT32 colorPaletteIndex,
-        UINT32 firstEntryIndex,
-        UINT32 entryCount,
-        DWRITE_COLOR_F* paletteEntries
-        ) PURE;
-
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_
-        FLOAT fontEmSize,
-        FLOAT dpiX,
-        FLOAT dpiY,
-        DWRITE_MATRIX const* transform,
-        BOOL isSideways,
-        DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode,
-        IDWriteRenderingParams* renderingParams,
-        DWRITE_RENDERING_MODE* renderingMode,
-        DWRITE_GRID_FIT_MODE* gridFitMode
-        ) PURE;
-
-    /* IDWriteFontFace3 methods */
-    STDMETHOD(GetFontFaceReference)(THIS_ IDWriteFontFaceReference **fontFaceReference) PURE;
-    STDMETHOD_(void, GetPanose)(THIS_ DWRITE_PANOSE *panose) PURE;
-    STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)(THIS) PURE;
-    STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)(THIS) PURE;
-    STDMETHOD(GetFamilyNames)(THIS_ IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD(GetFaceNames)(THIS_ IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD(GetInformationalStrings)(THIS_ DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
-        IDWriteLocalizedStrings **informationalStrings, BOOL *exists) PURE;
-    STDMETHOD_(BOOL, HasCharacter)(THIS_ UINT32 unicodeValue) PURE;
-    STDMETHOD(GetRecommendedRenderingMode)(THIS_ FLOAT fontEmSize, FLOAT dpiX, FLOAT dpiY,
-        DWRITE_MATRIX const *transform, BOOL isSideways, DWRITE_OUTLINE_THRESHOLD outlineThreshold,
-        DWRITE_MEASURING_MODE measuringMode, IDWriteRenderingParams *renderingParams,
-        DWRITE_RENDERING_MODE1 *renderingMode, DWRITE_GRID_FIT_MODE *gridFitMode) PURE;
-    STDMETHOD_(BOOL, IsCharacterLocal)(THIS_ UINT32 unicodeValue) PURE;
-    STDMETHOD_(BOOL, IsGlyphLocal)(THIS_ UINT16 glyphId) PURE;
-    STDMETHOD(AreCharactersLocal)(THIS_ WCHAR const *characters, UINT32 characterCount,
-        BOOL enqueueIfNotLocal, BOOL *isLocal) PURE;
-    STDMETHOD(AreGlyphsLocal)(THIS_ UINT16 const *glyphIndices, UINT32 glyphCount,
-        BOOL enqueueIfNotLocal, BOOL *isLocal) PURE;
-
-    /* IDWriteFontFace4 methods */
-    STDMETHOD_(DWRITE_GLYPH_IMAGE_FORMATS, GetGlyphImageFormats)(THIS) PURE;
-    STDMETHOD(GetGlyphImageFormats)(THIS_ UINT16 glyphId, UINT32 pixelsPerEmFirst,
-        UINT32 pixelsPerEmLast, DWRITE_GLYPH_IMAGE_FORMATS *glyphImageFormats) PURE;
-    STDMETHOD(GetGlyphImageData)(THIS_ UINT16 glyphId, UINT32 pixelsPerEm,
-        DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat, DWRITE_GLYPH_IMAGE_DATA *glyphData,
-        void **glyphDataContext) PURE;
-    STDMETHOD_(void, ReleaseGlyphImageData)(THIS_ void *glyphDataContext) PURE;
-#endif
-
-    /* IDWriteFontFace5 methods */
-    STDMETHOD_(UINT32, GetFontAxisValueCount)(THIS) PURE;
-    STDMETHOD(GetFontAxisValues)(THIS_ DWRITE_FONT_AXIS_VALUE *fontAxisValues,
-        UINT32 fontAxisValueCount) PURE;
-    STDMETHOD_(BOOL, HasVariations)(THIS) PURE;
-    STDMETHOD(GetFontResource)(THIS_ IDWriteFontResource **fontResource) PURE;
-    STDMETHOD_(BOOL, Equals)(THIS_ IDWriteFontFace *fontFace) PURE;
-
-    END_INTERFACE
-};
-
-__CRT_UUID_DECL(IDWriteFontFace5, 0x98eff3a5,0xb667,0x479a,0xb1,0x45,0xe2,0xfa,0x5b,0x9f,0xdc,0x29)
-
-#undef  INTERFACE
-#define INTERFACE IDWriteFontResource
-DECLARE_INTERFACE_(IDWriteFontResource,IUnknown)
-{
-    BEGIN_INTERFACE
-
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-
-    STDMETHOD(GetFontFile)(THIS_ IDWriteFontFile **fontFile) PURE;
-    STDMETHOD_(UINT32, GetFontFaceIndex)(THIS) PURE;
-    STDMETHOD_(UINT32, GetFontAxisCount)(THIS) PURE;
-    STDMETHOD(GetDefaultFontAxisValues)(THIS_ DWRITE_FONT_AXIS_VALUE *fontAxisValues,
-        UINT32 fontAxisValueCount) PURE;
-    STDMETHOD(GetFontAxisRanges)(THIS_ DWRITE_FONT_AXIS_RANGE *fontAxisRanges,
-        UINT32 fontAxisRangeCount) PURE;
-    STDMETHOD_(DWRITE_FONT_AXIS_ATTRIBUTES, GetFontAxisAttributes)(THIS_ UINT32 axisIndex) PURE;
-    STDMETHOD(GetAxisNames)(THIS_ UINT32 axisIndex, IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD_(UINT32, GetAxisValueNameCount)(THIS_ UINT32 axisIndex) PURE;
-    STDMETHOD(GetAxisValueNames)(THIS_ UINT32 axisIndex, UINT32 axisValueIndex,
-        DWRITE_FONT_AXIS_RANGE* fontAxisRange, IDWriteLocalizedStrings **names) PURE;
-    STDMETHOD_(BOOL, HasVariations)(THIS) PURE;
-    STDMETHOD(CreateFontFace)(THIS_ DWRITE_FONT_SIMULATIONS fontSimulations,
-        DWRITE_FONT_AXIS_VALUE const *fontAxisValues, UINT32 fontAxisValueCount,
-        IDWriteFontFace5 **fontFace) PURE;
-    STDMETHOD(CreateFontFaceReference)(THIS_ DWRITE_FONT_SIMULATIONS fontSimulations,
-        DWRITE_FONT_AXIS_VALUE const *fontAxisValues, UINT32 fontAxisValueCount,
-        IDWriteFontFaceReference1 **fontFaceReference) PURE;
-
-    END_INTERFACE
-};
-
-__CRT_UUID_DECL(IDWriteFontResource, 0x1f803a76,0x6871,0x48e8,0x98,0x7f,0xb9,0x75,0x55,0x1c,0x50,0xf2)
-
-
-#endif /* DWRITE_3_H_INCLUDED */
+#endif /* __dwrite_3_h__ */
diff --git a/mingw-w64-headers/include/dwrite_3.idl b/mingw-w64-headers/include/dwrite_3.idl
new file mode 100644
index 0000000..f5ee615
--- /dev/null
+++ b/mingw-w64-headers/include/dwrite_3.idl
@@ -0,0 +1,994 @@
+/*
+ * Copyright 2016 Nikolay Sivov for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "dwrite_2.idl";
+
+interface IDWriteFontFaceReference;
+interface IDWriteFontFaceReference1;
+interface IDWriteFontFace3;
+interface IDWriteFontSet;
+interface IDWriteFontDownloadQueue;
+interface IDWriteFontFace5;
+interface IDWriteFontList2;
+
+cpp_quote("#ifndef _WINGDI_")
+/* already defined in wingdi.h but needed for WIDL */
+typedef struct FONTSIGNATURE FONTSIGNATURE;
+cpp_quote("#endif /* _WINGDI_ */")
+
+typedef enum DWRITE_LOCALITY
+{
+    DWRITE_LOCALITY_REMOTE,
+    DWRITE_LOCALITY_PARTIAL,
+    DWRITE_LOCALITY_LOCAL
+} DWRITE_LOCALITY;
+
+typedef enum DWRITE_RENDERING_MODE1
+{
+    DWRITE_RENDERING_MODE1_DEFAULT,
+    DWRITE_RENDERING_MODE1_ALIASED,
+    DWRITE_RENDERING_MODE1_GDI_CLASSIC,
+    DWRITE_RENDERING_MODE1_GDI_NATURAL,
+    DWRITE_RENDERING_MODE1_NATURAL,
+    DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC,
+    DWRITE_RENDERING_MODE1_OUTLINE,
+    DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC_DOWNSAMPLED
+} DWRITE_RENDERING_MODE1;
+
+typedef enum DWRITE_FONT_PROPERTY_ID
+{
+    DWRITE_FONT_PROPERTY_ID_NONE,
+    DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FACE_NAME,
+    DWRITE_FONT_PROPERTY_ID_FULL_NAME,
+    DWRITE_FONT_PROPERTY_ID_WIN32_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_POSTSCRIPT_NAME,
+    DWRITE_FONT_PROPERTY_ID_DESIGN_SCRIPT_LANGUAGE_TAG,
+    DWRITE_FONT_PROPERTY_ID_SUPPORTED_SCRIPT_LANGUAGE_TAG,
+    DWRITE_FONT_PROPERTY_ID_SEMANTIC_TAG,
+    DWRITE_FONT_PROPERTY_ID_WEIGHT,
+    DWRITE_FONT_PROPERTY_ID_STRETCH,
+    DWRITE_FONT_PROPERTY_ID_STYLE,
+    DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FACE_NAME,
+    DWRITE_FONT_PROPERTY_ID_TOTAL = DWRITE_FONT_PROPERTY_ID_STYLE + 1,
+    DWRITE_FONT_PROPERTY_ID_TOTAL_RS3 = DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FACE_NAME + 1,
+    DWRITE_FONT_PROPERTY_ID_FAMILY_NAME = DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_PREFERRED_FAMILY_NAME = DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FAMILY_NAME,
+    DWRITE_FONT_PROPERTY_ID_FACE_NAME = DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FACE_NAME,
+} DWRITE_FONT_PROPERTY_ID;
+
+typedef struct DWRITE_FONT_PROPERTY
+{
+    DWRITE_FONT_PROPERTY_ID propertyId;
+    WCHAR const *propertyValue;
+    WCHAR const *localeName;
+} DWRITE_FONT_PROPERTY;
+
+typedef enum DWRITE_FONT_AXIS_TAG
+{
+    DWRITE_FONT_AXIS_TAG_WEIGHT       = 0x74686777, /* 'wght' */
+    DWRITE_FONT_AXIS_TAG_WIDTH        = 0x68746477, /* 'wdth' */
+    DWRITE_FONT_AXIS_TAG_SLANT        = 0x746e6c73, /* 'slnt' */
+    DWRITE_FONT_AXIS_TAG_OPTICAL_SIZE = 0x7a73706f, /* 'opsz' */
+    DWRITE_FONT_AXIS_TAG_ITALIC       = 0x6c617469, /* 'ital' */
+} DWRITE_FONT_AXIS_TAG;
+
+typedef enum DWRITE_FONT_SOURCE_TYPE
+{
+    DWRITE_FONT_SOURCE_TYPE_UNKNOWN,
+    DWRITE_FONT_SOURCE_TYPE_PER_MACHINE,
+    DWRITE_FONT_SOURCE_TYPE_PER_USER,
+    DWRITE_FONT_SOURCE_TYPE_APPX_PACKAGE,
+    DWRITE_FONT_SOURCE_TYPE_REMOTE_FONT_PROVIDER
+} DWRITE_FONT_SOURCE_TYPE;
+
+typedef struct DWRITE_FONT_AXIS_VALUE
+{
+    DWRITE_FONT_AXIS_TAG axisTag;
+    FLOAT value;
+} DWRITE_FONT_AXIS_VALUE;
+
+typedef struct DWRITE_FONT_AXIS_RANGE
+{
+    DWRITE_FONT_AXIS_TAG axisTag;
+    FLOAT minValue;
+    FLOAT maxValue;
+} DWRITE_FONT_AXIS_RANGE;
+
+typedef enum DWRITE_AUTOMATIC_FONT_AXES
+{
+    DWRITE_AUTOMATIC_FONT_AXES_NONE,
+    DWRITE_AUTOMATIC_FONT_AXES_OPTICAL_SIZE,
+} DWRITE_AUTOMATIC_FONT_AXES;
+
+typedef enum DWRITE_FONT_AXIS_ATTRIBUTES
+{
+    DWRITE_FONT_AXIS_ATTRIBUTES_NONE,
+    DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE,
+    DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN,
+} DWRITE_FONT_AXIS_ATTRIBUTES;
+
+typedef enum DWRITE_FONT_FAMILY_MODEL
+{
+    DWRITE_FONT_FAMILY_MODEL_TYPOGRAPHIC,
+    DWRITE_FONT_FAMILY_MODEL_WEIGHT_STRETCH_STYLE,
+} DWRITE_FONT_FAMILY_MODEL;
+
+[
+    local,
+    object,
+    uuid(b06fe5b9-43ec-4393-881b-dbe4dc72fda7)
+]
+interface IDWriteFontDownloadListener : IUnknown
+{
+    void DownloadCompleted(IDWriteFontDownloadQueue *queue, IUnknown *context, HRESULT result);
+}
+
+[
+    local,
+    object,
+    uuid(b71e6052-5aea-4fa3-832e-f60d431f7e91)
+]
+interface IDWriteFontDownloadQueue : IUnknown
+{
+    HRESULT AddListener(IDWriteFontDownloadListener *listener, UINT32 *token);
+    HRESULT RemoveListener(UINT32 token);
+    BOOL IsEmpty();
+    HRESULT BeginDownload(IUnknown *context);
+    HRESULT CancelDownload();
+    UINT64 GetGenerationCount();
+}
+
+[
+    local,
+    object,
+    uuid(b7924baa-391b-412a-8c5c-e44cc2d867dc)
+]
+interface IDWriteRenderingParams3 : IDWriteRenderingParams2
+{
+    DWRITE_RENDERING_MODE1 GetRenderingMode1();
+}
+
+[
+    local,
+    object,
+    uuid(cfee3140-1257-47ca-8b85-31bfcf3f2d0e)
+]
+interface IDWriteStringList : IUnknown
+{
+    UINT32 GetCount();
+    HRESULT GetLocaleNameLength(UINT32 index, UINT32 *length);
+    HRESULT GetLocaleName(UINT32 index, WCHAR *name, UINT32 size);
+    HRESULT GetStringLength(UINT32 index, UINT32 *length);
+    HRESULT GetString(UINT32 index, WCHAR *string, UINT32 size);
+}
+
+[
+    local,
+    object,
+    uuid(53585141-d9f8-4095-8321-d73cf6bd116b)
+]
+interface IDWriteFontSet : IUnknown
+{
+    UINT32 GetFontCount();
+    HRESULT GetFontFaceReference(UINT32 index, IDWriteFontFaceReference **reference);
+    HRESULT FindFontFaceReference(IDWriteFontFaceReference *reference,
+        UINT32 *index, BOOL *exists);
+    HRESULT FindFontFace(IDWriteFontFace *fontface, UINT32 *index, BOOL *exists);
+    HRESULT GetPropertyValues__(DWRITE_FONT_PROPERTY_ID id, IDWriteStringList **values);
+    HRESULT GetPropertyValues_(DWRITE_FONT_PROPERTY_ID id,
+        WCHAR const *preferred_locales, IDWriteStringList **values);
+    HRESULT GetPropertyValues(UINT32 index, DWRITE_FONT_PROPERTY_ID id, BOOL *exists,
+        IDWriteLocalizedStrings **values);
+    HRESULT GetPropertyOccurrenceCount(DWRITE_FONT_PROPERTY const *property, UINT32 *count);
+    HRESULT GetMatchingFonts_(WCHAR const *family, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STRETCH stretch,
+        DWRITE_FONT_STYLE style, IDWriteFontSet **fontset);
+    HRESULT GetMatchingFonts(DWRITE_FONT_PROPERTY const *props, UINT32 count, IDWriteFontSet **fontset);
+}
+
+[
+    local,
+    object,
+    uuid(1f803a76-6871-48e8-987f-b975551c50f2)
+]
+interface IDWriteFontResource : IUnknown
+{
+    HRESULT GetFontFile(IDWriteFontFile **fontfile);
+    UINT32 GetFontFaceIndex();
+    UINT32 GetFontAxisCount();
+    HRESULT GetDefaultFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE const *values,
+        UINT32 num_values);
+    HRESULT GetFontAxisRanges(
+        DWRITE_FONT_AXIS_RANGE const *ranges,
+        UINT32 num_ranges);
+    DWRITE_FONT_AXIS_ATTRIBUTES GetFontAxisAttributes(
+        UINT32 axis);
+    HRESULT GetAxisNames(
+        UINT32 axis,
+        IDWriteLocalizedStrings **names);
+    UINT32 GetAxisValueNameCount(
+        UINT32 axis);
+    HRESULT GetAxisValueNames(
+        UINT32 axis,
+        UINT32 axis_value,
+        DWRITE_FONT_AXIS_RANGE *axis_range,
+        IDWriteLocalizedStrings **names);
+    BOOL HasVariations();
+    HRESULT CreateFontFace(
+        DWRITE_FONT_SIMULATIONS simulations,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        IDWriteFontFace5 **fontface);
+    HRESULT CreateFontFaceReference(
+        DWRITE_FONT_SIMULATIONS simulations,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        IDWriteFontFaceReference1 **reference);
+}
+
+[
+    local,
+    object,
+    uuid(7e9fda85-6c92-4053-bc47-7ae3530db4d3)
+]
+interface IDWriteFontSet1 : IDWriteFontSet
+{
+    HRESULT GetMatchingFonts(
+        DWRITE_FONT_PROPERTY const *property,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        IDWriteFontSet1 **fontset);
+    HRESULT GetFirstFontResources(IDWriteFontSet1 **fontset);
+    HRESULT GetFilteredFonts__(
+        UINT32 const *indices,
+        UINT32 num_indices,
+        IDWriteFontSet1 **fontset);
+    HRESULT GetFilteredFonts_(
+        DWRITE_FONT_AXIS_RANGE const *axis_ranges,
+        UINT32 num_ranges,
+        BOOL select_any_range,
+        IDWriteFontSet1 **fontset);
+    HRESULT GetFilteredFonts(
+        DWRITE_FONT_PROPERTY const *props,
+        UINT32 num_properties,
+        BOOL select_any_property,
+        IDWriteFontSet1 **fontset);
+    HRESULT GetFilteredFontIndices_(
+        DWRITE_FONT_AXIS_RANGE const *ranges,
+        UINT32 num_ranges,
+        BOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+    HRESULT GetFilteredFontIndices(
+        DWRITE_FONT_PROPERTY const *props,
+        UINT32 num_properties,
+        BOOL select_any_range,
+        UINT32 *indices,
+        UINT32 num_indices,
+        UINT32 *actual_num_indices);
+    HRESULT GetFontAxisRanges_(
+        UINT32 font_index,
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+    HRESULT GetFontAxisRanges(
+        DWRITE_FONT_AXIS_RANGE *axis_ranges,
+        UINT32 num_ranges,
+        UINT32 *actual_num_ranges);
+    HRESULT GetFontFaceReference(
+        UINT32 index,
+        IDWriteFontFaceReference1 **reference);
+    HRESULT CreateFontResource(
+        UINT32 index,
+        IDWriteFontResource **resource);
+    HRESULT CreateFontFace(
+        UINT32 index,
+        IDWriteFontFace5 **fontface);
+    DWRITE_LOCALITY GetFontLocality(UINT32 index);
+}
+
+[
+    local,
+    object,
+    uuid(29748ed6-8c9c-4a6a-be0b-d912e8538944)
+]
+interface IDWriteFont3 : IDWriteFont2
+{
+    HRESULT CreateFontFace(IDWriteFontFace3 **fontface);
+    BOOL Equals(IDWriteFont *font);
+    HRESULT GetFontFaceReference(IDWriteFontFaceReference **reference);
+    BOOL HasCharacter(UINT32 character);
+    DWRITE_LOCALITY GetLocality();
+}
+
+[
+    local,
+    object,
+    uuid(da20d8ef-812a-4c43-9802-62ec4abd7adf)
+]
+interface IDWriteFontFamily1 : IDWriteFontFamily
+{
+    DWRITE_LOCALITY GetFontLocality(UINT32 index);
+    HRESULT GetFont(UINT32 index, IDWriteFont3 **font);
+    HRESULT GetFontFaceReference(UINT32 index, IDWriteFontFaceReference **reference);
+}
+
+[
+    local,
+    object,
+    uuid(3ed49e77-a398-4261-b9cf-c126c2131ef3)
+]
+interface IDWriteFontFamily2 : IDWriteFontFamily1
+{
+    HRESULT GetMatchingFonts(
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist);
+    HRESULT GetFontSet(IDWriteFontSet1 **fontset);
+}
+
+[
+    local,
+    object,
+    uuid(53585141-d9f8-4095-8321-d73cf6bd116c)
+]
+interface IDWriteFontCollection1 : IDWriteFontCollection
+{
+    HRESULT GetFontSet(IDWriteFontSet **fontset);
+    HRESULT GetFontFamily(UINT32 index, IDWriteFontFamily1 **family);
+}
+
+[
+    local,
+    object,
+    uuid(514039c6-4617-4064-bf8b-92ea83e506e0)
+]
+interface IDWriteFontCollection2 : IDWriteFontCollection1
+{
+    HRESULT GetFontFamily(
+        UINT32 index,
+        IDWriteFontFamily2 **family);
+    HRESULT GetMatchingFonts(
+        const WCHAR *familyname,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        IDWriteFontList2 **fontlist);
+    DWRITE_FONT_FAMILY_MODEL GetFontFamilyModel();
+    HRESULT GetFontSet(IDWriteFontSet1 **fontset);
+}
+
+[
+    local,
+    object,
+    uuid(a4d055a6-f9e3-4e25-93b7-9e309f3af8e9)
+]
+interface IDWriteFontCollection3 : IDWriteFontCollection2
+{
+    HANDLE GetExpirationEvent();
+}
+
+[
+    local,
+    object,
+    uuid(5e7fa7ca-dde3-424c-89f0-9fcd6fed58cd)
+]
+interface IDWriteFontFaceReference : IUnknown
+{
+    HRESULT CreateFontFace(IDWriteFontFace3 **fontface);
+    HRESULT CreateFontFaceWithSimulations(DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFace3 **fontface);
+    BOOL Equals(IDWriteFontFaceReference *reference);
+    UINT32 GetFontFaceIndex();
+    DWRITE_FONT_SIMULATIONS GetSimulations();
+    HRESULT GetFontFile(IDWriteFontFile **fontfile);
+    UINT64 GetLocalFileSize();
+    UINT64 GetFileSize();
+    HRESULT GetFileTime(FILETIME *writetime);
+    DWRITE_LOCALITY GetLocality();
+    HRESULT EnqueueFontDownloadRequest();
+    HRESULT EnqueueCharacterDownloadRequest(WCHAR const *chars, UINT32 count);
+    HRESULT EnqueueGlyphDownloadRequest(UINT16 const *glyphs, UINT32 count);
+    HRESULT EnqueueFileFragmentDownloadRequest(UINT64 offset, UINT64 size);
+}
+
+[
+    local,
+    object,
+    uuid(c081fe77-2fd1-41ac-a5a3-34983c4ba61a)
+]
+interface IDWriteFontFaceReference1 : IDWriteFontFaceReference
+{
+    HRESULT CreateFontFace(IDWriteFontFace5 **fontface);
+    UINT32 GetFontAxisValueCount();
+    HRESULT GetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values);
+}
+
+[
+    local,
+    object,
+    uuid(da20d8ef-812a-4c43-9802-62ec4abd7ade)
+]
+interface IDWriteFontList1 : IDWriteFontList
+{
+    DWRITE_LOCALITY GetFontLocality(UINT32 index);
+    HRESULT GetFont(UINT32 index, IDWriteFont3 **font);
+    HRESULT GetFontFaceReference(UINT32 index, IDWriteFontFaceReference **reference);
+}
+
+[
+    local,
+    object,
+    uuid(c0763a34-77af-445a-b735-08c37b0a5bf5)
+]
+interface IDWriteFontList2 : IDWriteFontList1
+{
+    HRESULT GetFontSet(IDWriteFontSet1 **fontset);
+}
+
+[
+    local,
+    object,
+    uuid(dc7ead19-e54c-43af-b2da-4e2b79ba3f7f)
+]
+interface IDWriteFontSet2 : IDWriteFontSet1
+{
+    HANDLE GetExpirationEvent();
+}
+
+[
+    local,
+    object,
+    uuid(7c073ef2-a7f4-4045-8c32-8ab8ae640f90)
+]
+interface IDWriteFontSet3 : IDWriteFontSet2
+{
+    DWRITE_FONT_SOURCE_TYPE GetFontSourceType(UINT32 index);
+    UINT32 GetFontSourceNameLength(UINT32 index);
+    HRESULT GetFontSourceName(UINT32 index, WCHAR *buffer, UINT32 buffer_size);
+}
+
+[
+    local,
+    object,
+    uuid(d37d7598-09be-4222-a236-2081341cc1f2)
+]
+interface IDWriteFontFace3 : IDWriteFontFace2
+{
+    HRESULT GetFontFaceReference(IDWriteFontFaceReference **reference);
+    void GetPanose(DWRITE_PANOSE *panose);
+    DWRITE_FONT_WEIGHT GetWeight();
+    DWRITE_FONT_STRETCH GetStretch();
+    DWRITE_FONT_STYLE GetStyle();
+    HRESULT GetFamilyNames(IDWriteLocalizedStrings **names);
+    HRESULT GetFaceNames(IDWriteLocalizedStrings **names);
+    HRESULT GetInformationalStrings(DWRITE_INFORMATIONAL_STRING_ID stringid,
+        IDWriteLocalizedStrings **strings,
+        BOOL *exists);
+    BOOL HasCharacter(UINT32 character);
+    HRESULT GetRecommendedRenderingMode(
+        FLOAT emsize,
+        FLOAT dpi_x,
+        FLOAT dpi_y,
+        DWRITE_MATRIX const *transform,
+        BOOL is_sideways,
+        DWRITE_OUTLINE_THRESHOLD threshold,
+        DWRITE_MEASURING_MODE measuring_mode,
+        IDWriteRenderingParams *params,
+        DWRITE_RENDERING_MODE1 *rendering_mode,
+        DWRITE_GRID_FIT_MODE *gridfit_mode);
+    BOOL IsCharacterLocal(UINT32 character);
+    BOOL IsGlyphLocal(UINT16 glyph);
+    HRESULT AreCharactersLocal(WCHAR const *characters,
+        UINT32 count, BOOL enqueue_if_not, BOOL *are_local);
+    HRESULT AreGlyphsLocal(UINT16 const *glyphs, UINT32 count,
+        BOOL enqueue_if_not, BOOL *are_local);
+}
+
+
+typedef struct DWRITE_LINE_METRICS1
+{
+    UINT32 length;
+    UINT32 trailingWhitespaceLength;
+    UINT32 newlineLength;
+    FLOAT height;
+    FLOAT baseline;
+    BOOL isTrimmed;
+    FLOAT leadingBefore;
+    FLOAT leadingAfter;
+} DWRITE_LINE_METRICS1;
+
+typedef enum DWRITE_FONT_LINE_GAP_USAGE
+{
+    DWRITE_FONT_LINE_GAP_USAGE_DEFAULT,
+    DWRITE_FONT_LINE_GAP_USAGE_DISABLED,
+    DWRITE_FONT_LINE_GAP_USAGE_ENABLED
+} DWRITE_FONT_LINE_GAP_USAGE;
+
+typedef struct DWRITE_LINE_SPACING
+{
+    DWRITE_LINE_SPACING_METHOD method;
+    FLOAT height;
+    FLOAT baseline;
+    FLOAT leadingBefore;
+    DWRITE_FONT_LINE_GAP_USAGE fontLineGapUsage;
+} DWRITE_LINE_SPACING;
+
+[
+    local,
+    object,
+    uuid(f67e0edd-9e3d-4ecc-8c32-4183253dfe70)
+]
+interface IDWriteTextFormat2 : IDWriteTextFormat1
+{
+    HRESULT SetLineSpacing(DWRITE_LINE_SPACING const *spacing);
+    HRESULT GetLineSpacing(DWRITE_LINE_SPACING *spacing);
+}
+
+[
+    local,
+    object,
+    uuid(6d3b5641-e550-430d-a85b-b7bf48a93427)
+]
+interface IDWriteTextFormat3 : IDWriteTextFormat2
+{
+    HRESULT SetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values);
+    UINT32 GetFontAxisValueCount();
+    HRESULT GetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values);
+    DWRITE_AUTOMATIC_FONT_AXES GetAutomaticFontAxes();
+    HRESULT SetAutomaticFontAxes(DWRITE_AUTOMATIC_FONT_AXES axes);
+}
+
+[
+    local,
+    object,
+    uuid(07ddcd52-020e-4de8-ac33-6c953d83f92d)
+]
+interface IDWriteTextLayout3 : IDWriteTextLayout2
+{
+    HRESULT InvalidateLayout();
+    HRESULT SetLineSpacing(DWRITE_LINE_SPACING const *spacing);
+    HRESULT GetLineSpacing(DWRITE_LINE_SPACING *spacing);
+    HRESULT GetLineMetrics(DWRITE_LINE_METRICS1 *metrics, UINT32 max_count, UINT32 *count);
+}
+
+[
+    local,
+    object,
+    uuid(05a9bf42-223f-4441-b5fb-8263685f55e9)
+]
+interface IDWriteTextLayout4 : IDWriteTextLayout3
+{
+    HRESULT SetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        DWRITE_TEXT_RANGE range);
+    UINT32 GetFontAxisValueCount(UINT32 pos);
+    HRESULT GetFontAxisValues(
+        UINT32 pos,
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 num_values,
+        DWRITE_TEXT_RANGE *range);
+    DWRITE_AUTOMATIC_FONT_AXES GetAutomaticFontAxes();
+    HRESULT SetAutomaticFontAxes(DWRITE_AUTOMATIC_FONT_AXES axes);
+}
+
+[
+    local,
+    object,
+    uuid(2397599d-dd0d-4681-bd6a-f4f31eaade77)
+]
+interface IDWriteFontFallback1 : IDWriteFontFallback
+{
+    HRESULT MapCharacters(
+        IDWriteTextAnalysisSource *source,
+        UINT32 pos,
+        UINT32 length,
+        IDWriteFontCollection *base_collection,
+        const WCHAR *familyname,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        UINT32 *mapped_length,
+        FLOAT *scale,
+        IDWriteFontFace5 **fontface);
+}
+
+[
+    local,
+    object,
+    uuid(4556be70-3abd-4f70-90be-421780a6f515)
+]
+interface IDWriteGdiInterop1 : IDWriteGdiInterop
+{
+    HRESULT CreateFontFromLOGFONT(LOGFONTW const *logfont,
+        IDWriteFontCollection *collection,
+        IDWriteFont **font);
+
+    /* GetFontSignature() methods are listed in reversed order to make
+       resulting vtable order compatible. */
+    HRESULT GetFontSignature_(IDWriteFontFace *fontface, FONTSIGNATURE *fontsig);
+    HRESULT GetFontSignature(IDWriteFont *font, FONTSIGNATURE *fontsig);
+    HRESULT GetMatchingFontsByLOGFONT(LOGFONTW const *logfont,
+        IDWriteFontSet *fontset,
+        IDWriteFontSet **subset);
+}
+
+[
+    local,
+    object,
+    uuid(2f642afe-9c68-4f40-b8be-457401afcb3d)
+]
+interface IDWriteFontSetBuilder : IUnknown
+{
+    HRESULT AddFontFaceReference_(IDWriteFontFaceReference *ref,
+        DWRITE_FONT_PROPERTY const *props,
+        UINT32 prop_count);
+    HRESULT AddFontFaceReference(IDWriteFontFaceReference *ref);
+    HRESULT AddFontSet(IDWriteFontSet *fontset);
+    HRESULT CreateFontSet(IDWriteFontSet **fontset);
+}
+
+[
+    local,
+    object,
+    uuid(3ff7715f-3cdc-4dc6-9b72-ec5621dccafd)
+]
+interface IDWriteFontSetBuilder1 : IDWriteFontSetBuilder
+{
+    HRESULT AddFontFile(IDWriteFontFile *file);
+}
+
+[
+    local,
+    object,
+    uuid(ee5ba612-b131-463c-8f4f-3189b9401e45)
+]
+interface IDWriteFontSetBuilder2 : IDWriteFontSetBuilder1
+{
+    HRESULT AddFont(
+        IDWriteFontFile *fontfile,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_values,
+        DWRITE_FONT_AXIS_RANGE const *axis_ranges,
+        UINT32 num_ranges,
+        DWRITE_FONT_PROPERTY const *props,
+        UINT32 num_properties);
+    HRESULT AddFontFile(const WCHAR *filepath);
+}
+
+[
+    local,
+    object,
+    uuid(9a1b41c3-d3bb-466a-87fc-fe67556a3b65)
+]
+interface IDWriteFactory3 : IDWriteFactory2
+{
+    HRESULT CreateGlyphRunAnalysis(
+        DWRITE_GLYPH_RUN const *run,
+        DWRITE_MATRIX const *transform,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode,
+        FLOAT origin_x,
+        FLOAT origin_y,
+        IDWriteGlyphRunAnalysis **analysis);
+
+    HRESULT CreateCustomRenderingParams(
+        FLOAT gamma,
+        FLOAT enhanced_contrast,
+        FLOAT grayscale_enhanced_contrast,
+        FLOAT cleartype_level,
+        DWRITE_PIXEL_GEOMETRY pixel_geometry,
+        DWRITE_RENDERING_MODE1 rendering_mode,
+        DWRITE_GRID_FIT_MODE gridfit_mode,
+        IDWriteRenderingParams3 **params);
+
+    /* CreateFontFaceReference methods are listed in reversed order to make
+       resulting vtable order compatible. */
+    HRESULT CreateFontFaceReference_(
+        IDWriteFontFile *file,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT CreateFontFaceReference(
+        WCHAR const *path,
+        FILETIME const *writetime,
+        UINT32 index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        IDWriteFontFaceReference **reference);
+
+    HRESULT GetSystemFontSet(IDWriteFontSet **fontset);
+    HRESULT CreateFontSetBuilder(IDWriteFontSetBuilder **builder);
+    HRESULT CreateFontCollectionFromFontSet(
+        IDWriteFontSet *fontset,
+        IDWriteFontCollection1 **collection);
+
+    HRESULT GetSystemFontCollection(
+        BOOL include_downloadable,
+        IDWriteFontCollection1 **collection,
+        BOOL check_for_updates);
+
+    HRESULT GetFontDownloadQueue(IDWriteFontDownloadQueue **queue);
+}
+
+typedef struct DWRITE_GLYPH_IMAGE_DATA
+{
+    void const *imageData;
+    UINT32 imageDataSize;
+    UINT32 uniqueDataId;
+    UINT32 pixelsPerEm;
+    D2D1_SIZE_U pixelSize;
+    D2D1_POINT_2L horizontalLeftOrigin;
+    D2D1_POINT_2L horizontalRightOrigin;
+    D2D1_POINT_2L verticalTopOrigin;
+    D2D1_POINT_2L verticalBottomOrigin;
+} DWRITE_GLYPH_IMAGE_DATA;
+
+[
+    local,
+    object,
+    uuid(27f2a904-4eb8-441d-9678-0563f53e3e2f)
+]
+interface IDWriteFontFace4 : IDWriteFontFace3
+{
+    HRESULT GetGlyphImageFormats_(
+        UINT16 glyph,
+        UINT32 ppem_first,
+        UINT32 ppem_last,
+        DWRITE_GLYPH_IMAGE_FORMATS *formats);
+    DWRITE_GLYPH_IMAGE_FORMATS GetGlyphImageFormats();
+    HRESULT GetGlyphImageData(
+        UINT16 glyph,
+        UINT32 ppem,
+        DWRITE_GLYPH_IMAGE_FORMATS format,
+        DWRITE_GLYPH_IMAGE_DATA *data,
+        void **context);
+    void ReleaseGlyphImageData(void *context);
+}
+
+[
+    local,
+    object,
+    uuid(98eff3a5-b667-479a-b145-e2fa5b9fdc29)
+]
+interface IDWriteFontFace5 : IDWriteFontFace4
+{
+    UINT32 GetFontAxisValueCount();
+    HRESULT GetFontAxisValues(
+        DWRITE_FONT_AXIS_VALUE *values,
+        UINT32 value_count);
+    BOOL HasVariations();
+    HRESULT GetFontResource(IDWriteFontResource **resource);
+    BOOL Equals(IDWriteFontFace *fontface);
+}
+
+typedef struct DWRITE_COLOR_GLYPH_RUN1
+{
+    DWRITE_GLYPH_RUN glyphRun;
+    DWRITE_GLYPH_RUN_DESCRIPTION *glyphRunDescription;
+    FLOAT baselineOriginX;
+    FLOAT baselineOriginY;
+    DWRITE_COLOR_F runColor;
+    UINT16 paletteIndex;
+    DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat;
+    DWRITE_MEASURING_MODE measuringMode;
+} DWRITE_COLOR_GLYPH_RUN1;
+
+[
+    local,
+    object,
+    uuid(7c5f86da-c7a1-4f05-b8e1-55a179fe5a35)
+]
+interface IDWriteColorGlyphRunEnumerator1 : IDWriteColorGlyphRunEnumerator
+{
+    HRESULT GetCurrentRun(
+        DWRITE_COLOR_GLYPH_RUN1 const **run);
+}
+
+[
+    local,
+    object,
+    uuid(4b0b5bd3-0797-4549-8ac5-fe915cc53856)
+]
+interface IDWriteFactory4 : IDWriteFactory3
+{
+    HRESULT TranslateColorGlyphRun(
+        D2D1_POINT_2F baseline_origin,
+        DWRITE_GLYPH_RUN const *run,
+        DWRITE_GLYPH_RUN_DESCRIPTION const *run_desc,
+        DWRITE_GLYPH_IMAGE_FORMATS desired_formats,
+        DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_MATRIX const *transform,
+        UINT32 palette,
+        IDWriteColorGlyphRunEnumerator1 **layers);
+
+    HRESULT ComputeGlyphOrigins_(
+        DWRITE_GLYPH_RUN const *run,
+        D2D1_POINT_2F baseline_origin,
+        D2D1_POINT_2F *origins);
+
+    HRESULT ComputeGlyphOrigins(
+        DWRITE_GLYPH_RUN const *run,
+        DWRITE_MEASURING_MODE measuring_mode,
+        D2D1_POINT_2F baseline_origin,
+        DWRITE_MATRIX const *transform,
+        D2D1_POINT_2F *origins);
+}
+
+[
+    local,
+    object,
+    uuid(ce25f8fd-863b-4d13-9651-c1f88dc73fe2)
+]
+interface IDWriteAsyncResult : IUnknown
+{
+    HANDLE GetWaitHandle();
+    HRESULT GetResult();
+}
+
+typedef struct DWRITE_FILE_FRAGMENT
+{
+    UINT64 fileOffset;
+    UINT64 fragmentSize;
+} DWRITE_FILE_FRAGMENT;
+
+[
+    local,
+    object,
+    uuid(4db3757a-2c72-4ed9-b2b6-1ababe1aff9c)
+]
+interface IDWriteRemoteFontFileStream : IDWriteFontFileStream
+{
+    HRESULT GetLocalFileSize(UINT64 *size);
+    HRESULT GetFileFragmentLocality(UINT64 offset, UINT64 size, BOOL *is_local, UINT64 *partial_size);
+    DWRITE_LOCALITY GetLocality();
+    HRESULT BeginDownload(
+        GUID const *operation_id,
+        DWRITE_FILE_FRAGMENT const *fragments,
+        UINT32 fragment_count,
+        IDWriteAsyncResult **async_result);
+}
+
+typedef enum DWRITE_CONTAINER_TYPE
+{
+    DWRITE_CONTAINER_TYPE_UNKNOWN,
+    DWRITE_CONTAINER_TYPE_WOFF,
+    DWRITE_CONTAINER_TYPE_WOFF2,
+} DWRITE_CONTAINER_TYPE;
+
+[
+    local,
+    object,
+    uuid(68648c83-6ede-46c0-ab46-20083a887fde)
+]
+interface IDWriteRemoteFontFileLoader : IDWriteFontFileLoader
+{
+    HRESULT CreateRemoteStreamFromKey(void const *key, UINT32 key_size, IDWriteRemoteFontFileStream **stream);
+    HRESULT GetLocalityFromKey(void const *key, UINT32 key_size, DWRITE_LOCALITY *locality);
+    HRESULT CreateFontFileReferenceFromUrl(
+        IDWriteFactory *factory,
+        WCHAR const *base_url,
+        WCHAR const *file_url,
+        IDWriteFontFile **fontfile);
+}
+
+[
+    local,
+    object,
+    uuid(dc102f47-a12d-4b1c-822d-9e117e33043f)
+]
+interface IDWriteInMemoryFontFileLoader : IDWriteFontFileLoader
+{
+    HRESULT CreateInMemoryFontFileReference(
+        IDWriteFactory *factory,
+        void const *data,
+        UINT32 data_size,
+        IUnknown *owner,
+        IDWriteFontFile **fontfile);
+    UINT32 GetFileCount();
+}
+
+[
+    local,
+    object,
+    uuid(958db99a-be2a-4f09-af7d-65189803d1d3)
+]
+interface IDWriteFactory5 : IDWriteFactory4
+{
+    HRESULT CreateFontSetBuilder(IDWriteFontSetBuilder1 **fontset_builder);
+    HRESULT CreateInMemoryFontFileLoader(IDWriteInMemoryFontFileLoader **loader);
+    HRESULT CreateHttpFontFileLoader(
+        WCHAR const *referrer_url,
+        WCHAR const *extra_headers,
+        IDWriteRemoteFontFileLoader **loader);
+    DWRITE_CONTAINER_TYPE AnalyzeContainerType(void const *data, UINT32 data_size);
+    HRESULT UnpackFontFile(
+        DWRITE_CONTAINER_TYPE container_type,
+        void const *data,
+        UINT32 data_size,
+        IDWriteFontFileStream **stream);
+}
+
+[
+    local,
+    object,
+    uuid(f3744d80-21f7-42eb-b35d-995bc72fc223)
+]
+interface IDWriteFactory6 : IDWriteFactory5
+{
+    HRESULT CreateFontFaceReference(
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        DWRITE_FONT_SIMULATIONS simulations,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_axis,
+        IDWriteFontFaceReference1 **face_ref);
+    HRESULT CreateFontResource(
+        IDWriteFontFile *file,
+        UINT32 face_index,
+        IDWriteFontResource **resource);
+    HRESULT GetSystemFontSet(
+        BOOL include_downloadable,
+        IDWriteFontSet1 **fontset);
+    HRESULT GetSystemFontCollection(
+        BOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection);
+    HRESULT CreateFontCollectionFromFontSet(
+        IDWriteFontSet *fontset,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection2 **collection);
+    HRESULT CreateFontSetBuilder(
+        IDWriteFontSetBuilder2 **builder);
+    HRESULT CreateTextFormat(
+        const WCHAR *familyname,
+        IDWriteFontCollection *collection,
+        DWRITE_FONT_AXIS_VALUE const *axis_values,
+        UINT32 num_axis,
+        FLOAT fontsize,
+        const WCHAR *localename,
+        IDWriteTextFormat3 **format);
+}
+
+[
+    local,
+    object,
+    uuid(35d0e0b3-9076-4d2e-a016-a91b568a06b4)
+]
+interface IDWriteFactory7 : IDWriteFactory6
+{
+    HRESULT GetSystemFontSet(
+        BOOL include_downloadable,
+        IDWriteFontSet2 **fontset);
+    HRESULT GetSystemFontCollection(
+        BOOL include_downloadable,
+        DWRITE_FONT_FAMILY_MODEL family_model,
+        IDWriteFontCollection3 **collection);
+}
diff --git a/mingw-w64-headers/wine-import.sh b/mingw-w64-headers/wine-import.sh
index 12ec2d6..3b8ff60 100755
--- a/mingw-w64-headers/wine-import.sh
+++ b/mingw-w64-headers/wine-import.sh
@@ -47,6 +47,7 @@
 	amaudio.h \
 	audevcod.h \
 	corerror.h \
+	d2dbasetypes.h \
 	d3d10_1shader.h \
 	d3d10effect.h \
 	d3d10misc.h \
@@ -141,11 +142,16 @@
 	d3d11sdklayers \
 	d3d12shader \
 	d3dcommon \
+	dcommon \
 	ddstream \
 	devicetopology \
 	downloadmgr \
 	drmexternals \
 	dvdif \
+	dwrite \
+	dwrite_1 \
+	dwrite_2 \
+	dwrite_3 \
 	dxgi \
 	dxgi1_2 \
 	dxgi1_3 \
@@ -158,7 +164,7 @@
 	dxgitype \
 	dxva2api \
 	endpointvolume \
-        exdisp \
+	exdisp \
 	fusion \
 	icftypes \
 	mediaobj \
@@ -171,7 +177,7 @@
 	objectarray \
 	optary \
 	qedit \
-        spatialaudioclient \
+	spatialaudioclient \
 	taskschd \
 	thumbcache \
 	uiautomationclient \
