diff --git a/mingw-w64-headers/include/dwrite_1.h b/mingw-w64-headers/include/dwrite_1.h
index 52de1fc..527c80f 100644
--- a/mingw-w64-headers/include/dwrite_1.h
+++ b/mingw-w64-headers/include/dwrite_1.h
@@ -9,6 +9,51 @@
 
 #include <dwrite.h>
 
+#ifndef __IDWriteFont1_FWD_DEFINED__
+#define __IDWriteFont1_FWD_DEFINED__
+typedef struct IDWriteFont1 IDWriteFont1;
+#endif
+
+#ifndef __IDWriteFontFace1_FWD_DEFINED__
+#define __IDWriteFontFace1_FWD_DEFINED__
+typedef struct IDWriteFontFace1 IDWriteFontFace1;
+#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;
+#endif
+
+#ifndef __IDWriteTextAnalyzer1_FWD_DEFINED__
+#define __IDWriteTextAnalyzer1_FWD_DEFINED__
+typedef struct IDWriteTextAnalyzer1 IDWriteTextAnalyzer1;
+#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;
+#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
@@ -173,232 +218,152 @@
     } symbol;
 };
 
+#ifndef D2D_USE_C_DEFINITIONS
+
 #undef  INTERFACE
 #define INTERFACE IDWriteFont1
 DECLARE_INTERFACE_(IDWriteFont1,IDWriteFont)
 {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    STDMETHOD_(void, GetMetrics)(DWRITE_FONT_METRICS1 *fontMetrics) PURE;
 
-    /* IDWriteFont methods */
-    STDMETHOD(GetFontFamily)(THIS_
-        IDWriteFontFamily **fontFamily) PURE;
+    STDMETHOD_(void, GetPanose)(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_(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;
-#endif
-
-    STDMETHOD_(void, GetMetrics)(THIS_
-        DWRITE_FONT_METRICS1 *fontMetrics) PURE;
-
-    STDMETHOD_(void, GetPanose)(THIS_
-        DWRITE_PANOSE *panose) PURE;
-
-    STDMETHOD(GetUnicodeRanges)(THIS_
-        UINT32 maxCount,
+    STDMETHOD(GetUnicodeRanges)(UINT32 maxCount,
         DWRITE_UNICODE_RANGE *ranges,
         UINT32 *actualCount) PURE;
 
     END_INTERFACE
 };
 
+#else  /* D2D_USE_C_DEFINITIONS */
+
+typedef struct IDWriteFont1Vtbl
+{
+    IDWriteFontVtbl Base;
+
+    STDMETHOD_(void, GetMetrics)(IDWriteFont1 *This,
+        struct DWRITE_FONT_METRICS1 *fontMetrics) PURE;
+
+    STDMETHOD_(void, GetPanose)(IDWriteFont1 *This,
+        union DWRITE_PANOSE *panose) PURE;
+
+    STDMETHOD(GetUnicodeRanges)(IDWriteFont1 *This,
+        UINT32 maxCount,
+        struct DWRITE_UNICODE_RANGE *ranges,
+        UINT32 *actualCount) PURE;
+}
+IDWriteFont1Vtbl;
+
+interface IDWriteFont1
+{
+    const IDWriteFont1Vtbl *lpVtbl;
+};
+
+#endif  /* D2D_USE_C_DEFINITIONS */
+
 __CRT_UUID_DECL(IDWriteFont1, 0xacd16696,0x8c14,0x4f5d,0x87,0x7e,0xfe,0x3f,0xc1,0xd3,0x27,0x38);
 
+#ifndef D2D_USE_C_DEFINITIONS
+
 #undef  INTERFACE
 #define INTERFACE IDWriteFontFace1
 DECLARE_INTERFACE_(IDWriteFontFace1, IDWriteFontFace)
 {
     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;
-#endif
-
-    /* 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,
+    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)(THIS_ UINT32,UINT16 const*,INT32*) PURE;
-    STDMETHOD_(BOOL, HasKerningPairs)(THIS);
+    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)(THIS_ UINT32,UINT16 const*,UINT16*);
-    STDMETHOD_(BOOL, HasVerticalGlyphVariants)(THIS);
+    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
 
-#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;
-#endif
-
-    /* IDWriteRenderingParams1 methods */
-    STDMETHOD_(FLOAT, GetGrayscaleEnhancedContrast)(THIS) PURE;
+    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
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* 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;
-#endif
-
-    STDMETHOD(GetVerticalGlyphOrientation)(THIS_
+    STDMETHOD(GetVerticalGlyphOrientation)(
         UINT32 textPosition,
         UINT32 *textLength,
         DWRITE_VERTICAL_GLYPH_ORIENTATION *orientation,
@@ -407,45 +372,38 @@
     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
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDWriteTextAnalysisSink methods */
-    STDMETHOD(SetScriptAnalysis)(THIS_
-            UINT32 textPosition,
-            UINT32 textLength,
-            DWRITE_SCRIPT_ANALYSIS const *scriptAnalysis) PURE;
-
-    STDMETHOD(SetLineBreakpoints)(THIS_
-            UINT32 textPosition,
-            UINT32 textLength,
-            DWRITE_LINE_BREAKPOINT const *lineBreakpoints) PURE;
-
-    STDMETHOD(SetBidiLevel)(THIS_
-            UINT32 textPosition,
-            UINT32 textLength,
-            UINT8 explicitLevel,
-            UINT8 resolvedLevel) PURE;
-
-    STDMETHOD(SetNumberSubstitution)(THIS_
-            UINT32 textPosition,
-            UINT32 textLength,
-            IDWriteNumberSubstitution *numberSubstitution) PURE;
-#endif
-
-    /* IDWriteTextAnalysisSink1 methods */
-    STDMETHOD(SetGlyphOrientation)(THIS_
+    STDMETHOD(SetGlyphOrientation)(
             UINT32 textPosition,
             UINT32 textLength,
             DWRITE_GLYPH_ORIENTATION_ANGLE angle,
@@ -456,110 +414,40 @@
     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
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* 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;
-#endif
-
-    /* IDWriteTextAnalyzer1 methods */
-    STDMETHOD(ApplyCharacterSpacing)(THIS_
+    STDMETHOD(ApplyCharacterSpacing)(
         FLOAT leadingSpacing,
         FLOAT trailingSpacing,
         FLOAT minimumAdvanceWidth,
@@ -572,7 +460,7 @@
         FLOAT* modifiedGlyphAdvances,
         DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets) PURE;
 
-    STDMETHOD(GetBaseline)(THIS_
+    STDMETHOD(GetBaseline)(
         IDWriteFontFace* fontFace,
         DWRITE_BASELINE baseline,
         BOOL isVertical,
@@ -655,225 +543,134 @@
     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
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* 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;
-
-    /* IDWriteTextLayout methods */
-    STDMETHOD(SetMaxWidth)(THIS_
-            FLOAT maxWidth) PURE;
-    STDMETHOD(SetMaxHeight)(THIS_
-            FLOAT maxHeight) PURE;
-    STDMETHOD(SetFontCollection)(THIS_
-            IDWriteFontCollection *fontCollection,
+    STDMETHOD(SetPairKerning)(WINBOOL isPairKerningEnabled,
             DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontFamilyName)(THIS_
-            WCHAR const *fontFamilyName,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontWeight)(THIS_
-            DWRITE_FONT_WEIGHT fontWeight,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontStyle)(THIS_
-            DWRITE_FONT_STYLE fontStyle,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontStretch)(THIS_
-            DWRITE_FONT_STRETCH fontStretch,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetFontSize)(THIS_
-            FLOAT fontSize,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetUnderline)(THIS_
-            WINBOOL hasUnderline,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetStrikethrough)(THIS_
-            WINBOOL hasStrikethrough,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetDrawingEffect)(THIS_
-            IUnknown *drawingEffect,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetInlineObject)(THIS_
-            IDWriteInlineObject *inlineObject,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetTypography)(THIS_
-            IDWriteTypography *typography,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(SetLocaleName)(THIS_
-            WCHAR const *localeName,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD_(FLOAT, GetMaxWidth)(THIS) PURE;
-    STDMETHOD_(FLOAT, GetMaxHeight)(THIS) PURE;
-    STDMETHOD(GetFontCollection)(THIS_
-            UINT32 currentPosition,
-            IDWriteFontCollection** fontCollection,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontFamilyNameLength)(THIS_
-            UINT32 currentPosition,
-            UINT32 *nameLength,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontFamilyName)(THIS_
-            UINT32 currentPosition,
-            WCHAR *fontFamilyName,
-            UINT32 nameSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontWeight)(THIS_
-            UINT32 currentPosition,
-            DWRITE_FONT_WEIGHT *fontWeight,
-            DWRITE_TEXT_RANGE* textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontStyle)(THIS_
-            UINT32 currentPosition,
-            DWRITE_FONT_STYLE *fontStyle,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontStretch)(THIS_
-            UINT32 currentPosition,
-            DWRITE_FONT_STRETCH* fontStretch,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetFontSize)(THIS_
-            UINT32 currentPosition,
-            FLOAT *fontSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetUnderline)(THIS_
-            UINT32 currentPosition,
-            WINBOOL *hasUnderline,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetStrikethrough)(THIS_
-            UINT32 currentPosition,
-            WINBOOL *hasStrikethrough,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetDrawingEffect)(THIS_
-            UINT32 currentPosition,
-            IUnknown **drawingEffect,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetInlineObject)(THIS_
-            UINT32 currentPosition,
-            IDWriteInlineObject **inlineObject,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetTypography)(THIS_
-            UINT32 currentPosition,
-            IDWriteTypography **typography,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetLocaleNameLength)(THIS_
-            UINT32 currentPosition,
-            UINT32 *nameLength,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(GetLocaleName)(THIS_
-            UINT32 currentPosition,
-            WCHAR *localeName,
-            UINT32 nameSize,
-            DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(Draw)(THIS_
-            void *clientDrawingContext,
-            IDWriteTextRenderer *renderer,
-            FLOAT originX,
-            FLOAT originY) PURE;
-    STDMETHOD(GetLineMetrics)(THIS_
-            DWRITE_LINE_METRICS *lineMetrics,
-            UINT32 maxLineCount,
-            UINT32 *actualLineCount) PURE;
-    STDMETHOD(GetMetrics)(THIS_
-            DWRITE_TEXT_METRICS *textMetrics) PURE;
-    STDMETHOD(GetOverhangMetrics)(THIS_
-            DWRITE_OVERHANG_METRICS *overhangs) PURE;
-    STDMETHOD(GetClusterMetrics)(THIS_
-            DWRITE_CLUSTER_METRICS *clusterMetrics,
-            UINT32 maxClusterCount,
-            UINT32 *actualClusterCount) PURE;
-    STDMETHOD(DetermineMinWidth)(THIS_
-            FLOAT *minWidth) PURE;
-    STDMETHOD(HitTestPoint)(THIS_
-            FLOAT pointX,
-            FLOAT pointY,
-            WINBOOL *isTrailingHit,
-            WINBOOL *isInside,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics) PURE;
-    STDMETHOD(HitTestTextPosition)(THIS_
-            UINT32 textPosition,
-            WINBOOL isTrailingHit,
-            FLOAT *pointX,
-            FLOAT *pointY,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics) PURE;
-    STDMETHOD(HitTestTextRange)(THIS_
-            UINT32 textPosition,
-            UINT32 textLength,
-            FLOAT originX,
-            FLOAT originY,
-            DWRITE_HIT_TEST_METRICS *hitTestMetrics,
-            UINT32 maxHitTestMetricsCount,
-            UINT32 *actualHitTestMetricsCount) PURE;
-#endif
-
-    /* IDWriteTextLayout1 methods */
-    STDMETHOD(SetPairKerning)(THIS_
-            WINBOOL isPairKerningEnabled,
-            DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(GetPairKerning)(THIS_
-            UINT32 position,
+    STDMETHOD(GetPairKerning)(UINT32 position,
             WINBOOL *isPairKerningEnabled,
             DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
-    STDMETHOD(SetCharacterSpacing)(THIS_
-            FLOAT leadingSpacing,
+    STDMETHOD(SetCharacterSpacing)(FLOAT leadingSpacing,
             FLOAT trailingSpacing,
             FLOAT minimumAdvance,
             DWRITE_TEXT_RANGE textRange) PURE;
-    STDMETHOD(GetCharacterSpacing)(THIS_
-            FLOAT *leadingSpacing,
+    STDMETHOD(GetCharacterSpacing)(FLOAT *leadingSpacing,
             FLOAT *trailingSpacing,
             FLOAT *minimumAdvance,
             DWRITE_TEXT_RANGE *textRange __MINGW_DEF_ARG_VAL(NULL)) PURE;
@@ -881,143 +678,53 @@
     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
 
-#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;
-#endif
-
-    /* IDWriteFactory1 methods */
-    STDMETHOD(GetEudcFontCollection)(THIS_
-        IDWriteFontCollection **fontCollection,
+    STDMETHOD(GetEudcFontCollection)(IDWriteFontCollection **fontCollection,
         BOOL checkForUpdates __MINGW_DEF_ARG_VAL(FALSE)) PURE;
 
-    STDMETHOD(CreateCustomRenderingParams)(THIS_
-        FLOAT gamma,
+    STDMETHOD(CreateCustomRenderingParams)(FLOAT gamma,
         FLOAT enhancedContrast,
         FLOAT enhancedContrastGrayscale,
         FLOAT clearTypeLevel,
@@ -1025,66 +732,78 @@
         DWRITE_RENDERING_MODE renderingMode,
         IDWriteRenderingParams1 **renderingParams) PURE;
 
-#ifdef __cplusplus
     using IDWriteFactory::CreateCustomRenderingParams;
-#endif
 
     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,
+        FLOAT gamma,
+        FLOAT enhancedContrast,
+        FLOAT enhancedContrastGrayscale,
+        FLOAT clearTypeLevel,
+        DWRITE_PIXEL_GEOMETRY pixelGeometry,
+        DWRITE_RENDERING_MODE renderingMode,
+        IDWriteRenderingParams1 **renderingParams) PURE;
+}
+IDWriteFactory1Vtbl;
+
+interface IDWriteFactory1
+{
+    const IDWriteFactory1Vtbl *lpVtbl;
+};
+
+#endif  /* D2D_USE_C_DEFINITIONS */
+
+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)
 
+#ifndef D2D_USE_C_DEFINITIONS
+
 #undef  INTERFACE
 #define INTERFACE IDWriteBitmapRenderTarget1
 DECLARE_INTERFACE_(IDWriteBitmapRenderTarget1,IDWriteBitmapRenderTarget)
 {
     BEGIN_INTERFACE
 
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    STDMETHOD_(DWRITE_TEXT_ANTIALIAS_MODE, GetTextAntialiasMode)(void) PURE;
 
-    /* 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;
-
-#endif
-
-    STDMETHOD_(DWRITE_TEXT_ANTIALIAS_MODE, GetTextAntialiasMode)(THIS) PURE;
-
-    STDMETHOD(SetTextAntialiasMode)(THIS_
+    STDMETHOD(SetTextAntialiasMode)(
         DWRITE_TEXT_ANTIALIAS_MODE antialiasMode) PURE;
 
     END_INTERFACE
 };
 
+#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;
+}
+IDWriteBitmapRenderTarget1Vtbl;
+
+interface IDWriteBitmapRenderTarget1
+{
+    const IDWriteBitmapRenderTarget1Vtbl *lpVtbl;
+};
+
+#endif  /* D2D_USE_C_DEFINITIONS */
+
 __CRT_UUID_DECL(IDWriteBitmapRenderTarget1, 0x791e8298,0x3ef3,0x4230,0x98,0x80,0xc9,0xbd,0xec,0xc4,0x20,0x64)
 
 #endif /* DWRITE_1_H_INCLUDED */
