/*** Autogenerated by WIDL 9.18 from include/dwrite_3.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 __dwrite_3_h__
#define __dwrite_3_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* 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 __IDWriteFontSet4_FWD_DEFINED__
#define __IDWriteFontSet4_FWD_DEFINED__
typedef interface IDWriteFontSet4 IDWriteFontSet4;
#ifdef __cplusplus
interface IDWriteFontSet4;
#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 __IDWriteFontFace6_FWD_DEFINED__
#define __IDWriteFontFace6_FWD_DEFINED__
typedef interface IDWriteFontFace6 IDWriteFontFace6;
#ifdef __cplusplus
interface IDWriteFontFace6;
#endif /* __cplusplus */
#endif

#ifndef __IDWritePaintReader_FWD_DEFINED__
#define __IDWritePaintReader_FWD_DEFINED__
typedef interface IDWritePaintReader IDWritePaintReader;
#ifdef __cplusplus
interface IDWritePaintReader;
#endif /* __cplusplus */
#endif

#ifndef __IDWriteFontFace7_FWD_DEFINED__
#define __IDWriteFontFace7_FWD_DEFINED__
typedef interface IDWriteFontFace7 IDWriteFontFace7;
#ifdef __cplusplus
interface IDWriteFontFace7;
#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>

#ifdef __cplusplus
extern "C" {
#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 __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 struct D2D1_GRADIENT_STOP D2D1_GRADIENT_STOP;
typedef enum DWRITE_COLOR_COMPOSITE_MODE {
    DWRITE_COLOR_COMPOSITE_CLEAR = 0,
    DWRITE_COLOR_COMPOSITE_SRC = 1,
    DWRITE_COLOR_COMPOSITE_DEST = 2,
    DWRITE_COLOR_COMPOSITE_SRC_OVER = 3,
    DWRITE_COLOR_COMPOSITE_DEST_OVER = 4,
    DWRITE_COLOR_COMPOSITE_SRC_IN = 5,
    DWRITE_COLOR_COMPOSITE_DEST_IN = 6,
    DWRITE_COLOR_COMPOSITE_SRC_OUT = 7,
    DWRITE_COLOR_COMPOSITE_DEST_OUT = 8,
    DWRITE_COLOR_COMPOSITE_SRC_ATOP = 9,
    DWRITE_COLOR_COMPOSITE_DEST_ATOP = 10,
    DWRITE_COLOR_COMPOSITE_XOR = 11,
    DWRITE_COLOR_COMPOSITE_PLUS = 12,
    DWRITE_COLOR_COMPOSITE_SCREEN = 13,
    DWRITE_COLOR_COMPOSITE_OVERLAY = 14,
    DWRITE_COLOR_COMPOSITE_DARKEN = 15,
    DWRITE_COLOR_COMPOSITE_LIGHTEN = 16,
    DWRITE_COLOR_COMPOSITE_COLOR_DODGE = 17,
    DWRITE_COLOR_COMPOSITE_COLOR_BURN = 18,
    DWRITE_COLOR_COMPOSITE_HARD_LIGHT = 19,
    DWRITE_COLOR_COMPOSITE_SOFT_LIGHT = 20,
    DWRITE_COLOR_COMPOSITE_DIFFERENCE = 21,
    DWRITE_COLOR_COMPOSITE_EXCLUSION = 22,
    DWRITE_COLOR_COMPOSITE_MULTIPLY = 23,
    DWRITE_COLOR_COMPOSITE_HSL_HUE = 24,
    DWRITE_COLOR_COMPOSITE_HSL_SATURATION = 25,
    DWRITE_COLOR_COMPOSITE_HSL_COLOR = 26,
    DWRITE_COLOR_COMPOSITE_HSL_LUMINOSITY = 27
} DWRITE_COLOR_COMPOSITE_MODE;
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;
#ifdef __cplusplus
#define DWRITE_MAKE_FONT_AXIS_TAG(a,b,c,d) (static_cast<DWRITE_FONT_AXIS_TAG>(DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d)))
#else
#define DWRITE_MAKE_FONT_AXIS_TAG(a,b,c,d) (DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d))
#endif
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;
typedef enum DWRITE_PAINT_TYPE {
    DWRITE_PAINT_TYPE_NONE = 0,
    DWRITE_PAINT_TYPE_LAYERS = 1,
    DWRITE_PAINT_TYPE_SOLID_GLYPH = 2,
    DWRITE_PAINT_TYPE_SOLID = 3,
    DWRITE_PAINT_TYPE_LINEAR_GRADIENT = 4,
    DWRITE_PAINT_TYPE_RADIAL_GRADIENT = 5,
    DWRITE_PAINT_TYPE_SWEEP_GRADIENT = 6,
    DWRITE_PAINT_TYPE_GLYPH = 7,
    DWRITE_PAINT_TYPE_COLOR_GLYPH = 8,
    DWRITE_PAINT_TYPE_TRANSFORM = 9,
    DWRITE_PAINT_TYPE_COMPOSITE = 10
} DWRITE_PAINT_TYPE;
typedef enum DWRITE_PAINT_FEATURE_LEVEL {
    DWRITE_PAINT_FEATURE_LEVEL_NONE = 0,
    DWRITE_PAINT_FEATURE_LEVEL_COLR_V0 = 1,
    DWRITE_PAINT_FEATURE_LEVEL_COLR_V1 = 2
} DWRITE_PAINT_FEATURE_LEVEL;
typedef enum DWRITE_PAINT_ATTRIBUTES {
    DWRITE_PAINT_ATTRIBUTES_NONE = 0,
    DWRITE_PAINT_ATTRIBUTES_USES_PALETTE = 0x1,
    DWRITE_PAINT_ATTRIBUTES_USES_TEXT_COLOR = 0x2
} DWRITE_PAINT_ATTRIBUTES;
DEFINE_ENUM_FLAG_OPERATORS(DWRITE_PAINT_ATTRIBUTES)
typedef struct DWRITE_PAINT_COLOR {
    DWRITE_COLOR_F value;
    UINT16 paletteEntryIndex;
    float alphaMultiplier;
    DWRITE_PAINT_ATTRIBUTES colorAttributes;
} DWRITE_PAINT_COLOR;
typedef struct DWRITE_PAINT_ELEMENT {
    DWRITE_PAINT_TYPE paintType;
    union PAINT_UNION {
        struct PAINT_LAYERS {
            UINT32 childCount;
        } layers;
        struct PAINT_SOLID_GLYPH {
            UINT32 glyphIndex;
            DWRITE_PAINT_COLOR color;
        } solidGlyph;
        DWRITE_PAINT_COLOR solid;
        struct PAINT_LINEAR_GRADIENT {
            UINT32 extendMode;
            UINT32 gradientStopCount;
            float x0;
            float y0;
            float x1;
            float y1;
            float x2;
            float y2;
        } linearGradient;
        struct PAINT_RADIAL_GRADIENT {
            UINT32 extendMode;
            UINT32 gradientStopCount;
            float x0;
            float y0;
            float radius0;
            float x1;
            float y1;
            float radius1;
        } radialGradient;
        struct PAINT_SWEEP_GRADIENT {
            UINT32 extendMode;
            UINT32 gradientStopCount;
            float centerX;
            float centerY;
            float startAngle;
            float endAngle;
        } sweepGradient;
        struct PAINT_GLYPH {
            UINT32 glyphIndex;
        } glyph;
        struct PAINT_COLOR_GLYPH {
            UINT32 glyphIndex;
            D2D_RECT_F clipBox;
        } colorGlyph;
        DWRITE_MATRIX transform;
        struct PAINT_COMPOSITE {
            DWRITE_COLOR_COMPOSITE_MODE mode;
        } composite;
    } paint;
} DWRITE_PAINT_ELEMENT;
/*****************************************************************************
 * 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;
};

#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 __WIDL_INLINE HRESULT IDWriteFontDownloadListener_QueryInterface(IDWriteFontDownloadListener* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontDownloadListener_AddRef(IDWriteFontDownloadListener* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontDownloadListener_Release(IDWriteFontDownloadListener* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontDownloadListener methods ***/
static __WIDL_INLINE 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;
};

#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 __WIDL_INLINE HRESULT IDWriteFontDownloadQueue_QueryInterface(IDWriteFontDownloadQueue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontDownloadQueue_AddRef(IDWriteFontDownloadQueue* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontDownloadQueue_Release(IDWriteFontDownloadQueue* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontDownloadQueue methods ***/
static __WIDL_INLINE HRESULT IDWriteFontDownloadQueue_AddListener(IDWriteFontDownloadQueue* This,IDWriteFontDownloadListener *listener,UINT32 *token) {
    return This->lpVtbl->AddListener(This,listener,token);
}
static __WIDL_INLINE HRESULT IDWriteFontDownloadQueue_RemoveListener(IDWriteFontDownloadQueue* This,UINT32 token) {
    return This->lpVtbl->RemoveListener(This,token);
}
static __WIDL_INLINE WINBOOL IDWriteFontDownloadQueue_IsEmpty(IDWriteFontDownloadQueue* This) {
    return This->lpVtbl->IsEmpty(This);
}
static __WIDL_INLINE HRESULT IDWriteFontDownloadQueue_BeginDownload(IDWriteFontDownloadQueue* This,IUnknown *context) {
    return This->lpVtbl->BeginDownload(This,context);
}
static __WIDL_INLINE HRESULT IDWriteFontDownloadQueue_CancelDownload(IDWriteFontDownloadQueue* This) {
    return This->lpVtbl->CancelDownload(This);
}
static __WIDL_INLINE 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;
};

#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 __WIDL_INLINE HRESULT IDWriteRenderingParams3_QueryInterface(IDWriteRenderingParams3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteRenderingParams3_AddRef(IDWriteRenderingParams3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteRenderingParams3_Release(IDWriteRenderingParams3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteRenderingParams methods ***/
static __WIDL_INLINE FLOAT IDWriteRenderingParams3_GetGamma(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetGamma(This);
}
static __WIDL_INLINE FLOAT IDWriteRenderingParams3_GetEnhancedContrast(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetEnhancedContrast(This);
}
static __WIDL_INLINE FLOAT IDWriteRenderingParams3_GetClearTypeLevel(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetClearTypeLevel(This);
}
static __WIDL_INLINE DWRITE_PIXEL_GEOMETRY IDWriteRenderingParams3_GetPixelGeometry(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetPixelGeometry(This);
}
static __WIDL_INLINE DWRITE_RENDERING_MODE IDWriteRenderingParams3_GetRenderingMode(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetRenderingMode(This);
}
/*** IDWriteRenderingParams1 methods ***/
static __WIDL_INLINE FLOAT IDWriteRenderingParams3_GetGrayscaleEnhancedContrast(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetGrayscaleEnhancedContrast(This);
}
/*** IDWriteRenderingParams2 methods ***/
static __WIDL_INLINE DWRITE_GRID_FIT_MODE IDWriteRenderingParams3_GetGridFitMode(IDWriteRenderingParams3* This) {
    return This->lpVtbl->GetGridFitMode(This);
}
/*** IDWriteRenderingParams3 methods ***/
static __WIDL_INLINE 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, 0x1157, 0x47ca, 0x8b,0x85, 0x31,0xbf,0xcf,0x3f,0x2d,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cfee3140-1157-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, 0x1157, 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 __WIDL_INLINE HRESULT IDWriteStringList_QueryInterface(IDWriteStringList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteStringList_AddRef(IDWriteStringList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteStringList_Release(IDWriteStringList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteStringList methods ***/
static __WIDL_INLINE UINT32 IDWriteStringList_GetCount(IDWriteStringList* This) {
    return This->lpVtbl->GetCount(This);
}
static __WIDL_INLINE HRESULT IDWriteStringList_GetLocaleNameLength(IDWriteStringList* This,UINT32 index,UINT32 *length) {
    return This->lpVtbl->GetLocaleNameLength(This,index,length);
}
static __WIDL_INLINE HRESULT IDWriteStringList_GetLocaleName(IDWriteStringList* This,UINT32 index,WCHAR *name,UINT32 size) {
    return This->lpVtbl->GetLocaleName(This,index,name,size);
}
static __WIDL_INLINE HRESULT IDWriteStringList_GetStringLength(IDWriteStringList* This,UINT32 index,UINT32 *length) {
    return This->lpVtbl->GetStringLength(This,index,length);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet_QueryInterface(IDWriteFontSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSet_AddRef(IDWriteFontSet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSet_Release(IDWriteFontSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSet methods ***/
static __WIDL_INLINE UINT32 IDWriteFontSet_GetFontCount(IDWriteFontSet* This) {
    return This->lpVtbl->GetFontCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontSet_GetFontFaceReference(IDWriteFontSet* This,UINT32 index,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,index,reference);
}
static __WIDL_INLINE HRESULT IDWriteFontSet_FindFontFaceReference(IDWriteFontSet* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet_FindFontFace(IDWriteFontSet* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet_GetPropertyValues__(IDWriteFontSet* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
    return This->lpVtbl->GetPropertyValues__(This,id,values);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet_GetPropertyOccurrenceCount(IDWriteFontSet* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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(
        DWRITE_FONT_AXIS_VALUE *values,
        UINT32 num_values) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFontAxisRanges(
        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,
        DWRITE_FONT_AXIS_VALUE *values,
        UINT32 num_values);

    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges)(
        IDWriteFontResource *This,
        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 __WIDL_INLINE HRESULT IDWriteFontResource_QueryInterface(IDWriteFontResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontResource_AddRef(IDWriteFontResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontResource_Release(IDWriteFontResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontResource methods ***/
static __WIDL_INLINE HRESULT IDWriteFontResource_GetFontFile(IDWriteFontResource* This,IDWriteFontFile **fontfile) {
    return This->lpVtbl->GetFontFile(This,fontfile);
}
static __WIDL_INLINE UINT32 IDWriteFontResource_GetFontFaceIndex(IDWriteFontResource* This) {
    return This->lpVtbl->GetFontFaceIndex(This);
}
static __WIDL_INLINE UINT32 IDWriteFontResource_GetFontAxisCount(IDWriteFontResource* This) {
    return This->lpVtbl->GetFontAxisCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontResource_GetDefaultFontAxisValues(IDWriteFontResource* This,DWRITE_FONT_AXIS_VALUE *values,UINT32 num_values) {
    return This->lpVtbl->GetDefaultFontAxisValues(This,values,num_values);
}
static __WIDL_INLINE HRESULT IDWriteFontResource_GetFontAxisRanges(IDWriteFontResource* This,DWRITE_FONT_AXIS_RANGE *ranges,UINT32 num_ranges) {
    return This->lpVtbl->GetFontAxisRanges(This,ranges,num_ranges);
}
static __WIDL_INLINE DWRITE_FONT_AXIS_ATTRIBUTES IDWriteFontResource_GetFontAxisAttributes(IDWriteFontResource* This,UINT32 axis) {
    return This->lpVtbl->GetFontAxisAttributes(This,axis);
}
static __WIDL_INLINE HRESULT IDWriteFontResource_GetAxisNames(IDWriteFontResource* This,UINT32 axis,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetAxisNames(This,axis,names);
}
static __WIDL_INLINE UINT32 IDWriteFontResource_GetAxisValueNameCount(IDWriteFontResource* This,UINT32 axis) {
    return This->lpVtbl->GetAxisValueNameCount(This,axis);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontResource_HasVariations(IDWriteFontResource* This) {
    return This->lpVtbl->HasVariations(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet1_QueryInterface(IDWriteFontSet1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSet1_AddRef(IDWriteFontSet1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSet1_Release(IDWriteFontSet1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSet methods ***/
static __WIDL_INLINE UINT32 IDWriteFontSet1_GetFontCount(IDWriteFontSet1* This) {
    return This->lpVtbl->GetFontCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontSet1_FindFontFaceReference(IDWriteFontSet1* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet1_FindFontFace(IDWriteFontSet1* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet1_GetPropertyValues__(IDWriteFontSet1* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
    return This->lpVtbl->GetPropertyValues__(This,id,values);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet1_GetPropertyOccurrenceCount(IDWriteFontSet1* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet1_GetFirstFontResources(IDWriteFontSet1* This,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFirstFontResources(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSet1_GetFilteredFonts__(IDWriteFontSet1* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet1_GetFontFaceReference(IDWriteFontSet1* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
}
static __WIDL_INLINE HRESULT IDWriteFontSet1_CreateFontResource(IDWriteFontSet1* This,UINT32 index,IDWriteFontResource **resource) {
    return This->lpVtbl->CreateFontResource(This,index,resource);
}
static __WIDL_INLINE HRESULT IDWriteFontSet1_CreateFontFace(IDWriteFontSet1* This,UINT32 index,IDWriteFontFace5 **fontface) {
    return This->lpVtbl->CreateFontFace(This,index,fontface);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFont3_QueryInterface(IDWriteFont3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFont3_AddRef(IDWriteFont3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFont3_Release(IDWriteFont3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFont methods ***/
static __WIDL_INLINE HRESULT IDWriteFont3_GetFontFamily(IDWriteFont3* This,IDWriteFontFamily **family) {
    return This->lpVtbl->GetFontFamily(This,family);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteFont3_GetWeight(IDWriteFont3* This) {
    return This->lpVtbl->GetWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteFont3_GetStretch(IDWriteFont3* This) {
    return This->lpVtbl->GetStretch(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteFont3_GetStyle(IDWriteFont3* This) {
    return This->lpVtbl->GetStyle(This);
}
static __WIDL_INLINE WINBOOL IDWriteFont3_IsSymbolFont(IDWriteFont3* This) {
    return This->lpVtbl->IsSymbolFont(This);
}
static __WIDL_INLINE HRESULT IDWriteFont3_GetFaceNames(IDWriteFont3* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFaceNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFont3_GetInformationalStrings(IDWriteFont3* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFont3_GetSimulations(IDWriteFont3* This) {
    return This->lpVtbl->GetSimulations(This);
}
/*** IDWriteFont1 methods ***/
static __WIDL_INLINE void IDWriteFont3_GetMetrics(IDWriteFont3* This,DWRITE_FONT_METRICS1 *metrics) {
    This->lpVtbl->IDWriteFont1_GetMetrics(This,metrics);
}
static __WIDL_INLINE void IDWriteFont3_GetPanose(IDWriteFont3* This,DWRITE_PANOSE *panose) {
    This->lpVtbl->GetPanose(This,panose);
}
static __WIDL_INLINE HRESULT IDWriteFont3_GetUnicodeRanges(IDWriteFont3* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
}
static __WIDL_INLINE WINBOOL IDWriteFont3_IsMonospacedFont(IDWriteFont3* This) {
    return This->lpVtbl->IsMonospacedFont(This);
}
/*** IDWriteFont2 methods ***/
static __WIDL_INLINE WINBOOL IDWriteFont3_IsColorFont(IDWriteFont3* This) {
    return This->lpVtbl->IsColorFont(This);
}
/*** IDWriteFont3 methods ***/
static __WIDL_INLINE HRESULT IDWriteFont3_CreateFontFace(IDWriteFont3* This,IDWriteFontFace3 **fontface) {
    return This->lpVtbl->IDWriteFont3_CreateFontFace(This,fontface);
}
static __WIDL_INLINE WINBOOL IDWriteFont3_Equals(IDWriteFont3* This,IDWriteFont *font) {
    return This->lpVtbl->Equals(This,font);
}
static __WIDL_INLINE HRESULT IDWriteFont3_GetFontFaceReference(IDWriteFont3* This,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,reference);
}
static __WIDL_INLINE WINBOOL IDWriteFont3_HasCharacter(IDWriteFont3* This,UINT32 character) {
    return This->lpVtbl->IDWriteFont3_HasCharacter(This,character);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFamily1_QueryInterface(IDWriteFontFamily1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFamily1_AddRef(IDWriteFontFamily1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFamily1_Release(IDWriteFontFamily1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontList methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFamily1_GetFontCollection(IDWriteFontFamily1* This,IDWriteFontCollection **collection) {
    return This->lpVtbl->GetFontCollection(This,collection);
}
static __WIDL_INLINE UINT32 IDWriteFontFamily1_GetFontCount(IDWriteFontFamily1* This) {
    return This->lpVtbl->GetFontCount(This);
}
/*** IDWriteFontFamily methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFamily1_GetFamilyNames(IDWriteFontFamily1* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFamilyNames(This,names);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE DWRITE_LOCALITY IDWriteFontFamily1_GetFontLocality(IDWriteFontFamily1* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
static __WIDL_INLINE HRESULT IDWriteFontFamily1_GetFont(IDWriteFontFamily1* This,UINT32 index,IDWriteFont3 **font) {
    return This->lpVtbl->IDWriteFontFamily1_GetFont(This,index,font);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFamily2_QueryInterface(IDWriteFontFamily2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFamily2_AddRef(IDWriteFontFamily2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFamily2_Release(IDWriteFontFamily2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontList methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFamily2_GetFontCollection(IDWriteFontFamily2* This,IDWriteFontCollection **collection) {
    return This->lpVtbl->GetFontCollection(This,collection);
}
static __WIDL_INLINE UINT32 IDWriteFontFamily2_GetFontCount(IDWriteFontFamily2* This) {
    return This->lpVtbl->GetFontCount(This);
}
/*** IDWriteFontFamily methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFamily2_GetFamilyNames(IDWriteFontFamily2* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFamilyNames(This,names);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_LOCALITY IDWriteFontFamily2_GetFontLocality(IDWriteFontFamily2* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
static __WIDL_INLINE HRESULT IDWriteFontFamily2_GetFont(IDWriteFontFamily2* This,UINT32 index,IDWriteFont3 **font) {
    return This->lpVtbl->IDWriteFontFamily1_GetFont(This,index,font);
}
static __WIDL_INLINE HRESULT IDWriteFontFamily2_GetFontFaceReference(IDWriteFontFamily2* This,UINT32 index,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,index,reference);
}
/*** IDWriteFontFamily2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontCollection1_QueryInterface(IDWriteFontCollection1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontCollection1_AddRef(IDWriteFontCollection1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontCollection1_Release(IDWriteFontCollection1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontCollection methods ***/
static __WIDL_INLINE UINT32 IDWriteFontCollection1_GetFontFamilyCount(IDWriteFontCollection1* This) {
    return This->lpVtbl->GetFontFamilyCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection1_FindFamilyName(IDWriteFontCollection1* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFamilyName(This,name,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection1_GetFontFromFontFace(IDWriteFontCollection1* This,IDWriteFontFace *face,IDWriteFont **font) {
    return This->lpVtbl->GetFontFromFontFace(This,face,font);
}
/*** IDWriteFontCollection1 methods ***/
static __WIDL_INLINE HRESULT IDWriteFontCollection1_GetFontSet(IDWriteFontCollection1* This,IDWriteFontSet **fontset) {
    return This->lpVtbl->GetFontSet(This,fontset);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontCollection2_QueryInterface(IDWriteFontCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontCollection2_AddRef(IDWriteFontCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontCollection2_Release(IDWriteFontCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontCollection methods ***/
static __WIDL_INLINE UINT32 IDWriteFontCollection2_GetFontFamilyCount(IDWriteFontCollection2* This) {
    return This->lpVtbl->GetFontFamilyCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection2_FindFamilyName(IDWriteFontCollection2* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFamilyName(This,name,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection2_GetFontFromFontFace(IDWriteFontCollection2* This,IDWriteFontFace *face,IDWriteFont **font) {
    return This->lpVtbl->GetFontFromFontFace(This,face,font);
}
/*** IDWriteFontCollection1 methods ***/
/*** IDWriteFontCollection2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFontCollection2_GetFontFamily(IDWriteFontCollection2* This,UINT32 index,IDWriteFontFamily2 **family) {
    return This->lpVtbl->IDWriteFontCollection2_GetFontFamily(This,index,family);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_FONT_FAMILY_MODEL IDWriteFontCollection2_GetFontFamilyModel(IDWriteFontCollection2* This) {
    return This->lpVtbl->GetFontFamilyModel(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontCollection3_QueryInterface(IDWriteFontCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontCollection3_AddRef(IDWriteFontCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontCollection3_Release(IDWriteFontCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontCollection methods ***/
static __WIDL_INLINE UINT32 IDWriteFontCollection3_GetFontFamilyCount(IDWriteFontCollection3* This) {
    return This->lpVtbl->GetFontFamilyCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection3_FindFamilyName(IDWriteFontCollection3* This,const WCHAR *name,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFamilyName(This,name,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection3_GetFontFromFontFace(IDWriteFontCollection3* This,IDWriteFontFace *face,IDWriteFont **font) {
    return This->lpVtbl->GetFontFromFontFace(This,face,font);
}
/*** IDWriteFontCollection1 methods ***/
/*** IDWriteFontCollection2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFontCollection3_GetFontFamily(IDWriteFontCollection3* This,UINT32 index,IDWriteFontFamily2 **family) {
    return This->lpVtbl->IDWriteFontCollection2_GetFontFamily(This,index,family);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_FONT_FAMILY_MODEL IDWriteFontCollection3_GetFontFamilyModel(IDWriteFontCollection3* This) {
    return This->lpVtbl->GetFontFamilyModel(This);
}
static __WIDL_INLINE HRESULT IDWriteFontCollection3_GetFontSet(IDWriteFontCollection3* This,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->IDWriteFontCollection2_GetFontSet(This,fontset);
}
/*** IDWriteFontCollection3 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFaceReference_QueryInterface(IDWriteFontFaceReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFaceReference_AddRef(IDWriteFontFaceReference* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFaceReference_Release(IDWriteFontFaceReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFaceReference methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_CreateFontFace(IDWriteFontFaceReference* This,IDWriteFontFace3 **fontface) {
    return This->lpVtbl->CreateFontFace(This,fontface);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_CreateFontFaceWithSimulations(IDWriteFontFaceReference* This,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFace3 **fontface) {
    return This->lpVtbl->CreateFontFaceWithSimulations(This,simulations,fontface);
}
static __WIDL_INLINE WINBOOL IDWriteFontFaceReference_Equals(IDWriteFontFaceReference* This,IDWriteFontFaceReference *reference) {
    return This->lpVtbl->Equals(This,reference);
}
static __WIDL_INLINE UINT32 IDWriteFontFaceReference_GetFontFaceIndex(IDWriteFontFaceReference* This) {
    return This->lpVtbl->GetFontFaceIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFaceReference_GetSimulations(IDWriteFontFaceReference* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_GetFontFile(IDWriteFontFaceReference* This,IDWriteFontFile **fontfile) {
    return This->lpVtbl->GetFontFile(This,fontfile);
}
static __WIDL_INLINE UINT64 IDWriteFontFaceReference_GetLocalFileSize(IDWriteFontFaceReference* This) {
    return This->lpVtbl->GetLocalFileSize(This);
}
static __WIDL_INLINE UINT64 IDWriteFontFaceReference_GetFileSize(IDWriteFontFaceReference* This) {
    return This->lpVtbl->GetFileSize(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_GetFileTime(IDWriteFontFaceReference* This,FILETIME *writetime) {
    return This->lpVtbl->GetFileTime(This,writetime);
}
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontFaceReference_GetLocality(IDWriteFontFaceReference* This) {
    return This->lpVtbl->GetLocality(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_EnqueueFontDownloadRequest(IDWriteFontFaceReference* This) {
    return This->lpVtbl->EnqueueFontDownloadRequest(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_EnqueueCharacterDownloadRequest(IDWriteFontFaceReference* This,const WCHAR *chars,UINT32 count) {
    return This->lpVtbl->EnqueueCharacterDownloadRequest(This,chars,count);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference_EnqueueGlyphDownloadRequest(IDWriteFontFaceReference* This,const UINT16 *glyphs,UINT32 count) {
    return This->lpVtbl->EnqueueGlyphDownloadRequest(This,glyphs,count);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFaceReference1_QueryInterface(IDWriteFontFaceReference1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFaceReference1_AddRef(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFaceReference1_Release(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFaceReference methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_CreateFontFaceWithSimulations(IDWriteFontFaceReference1* This,DWRITE_FONT_SIMULATIONS simulations,IDWriteFontFace3 **fontface) {
    return This->lpVtbl->CreateFontFaceWithSimulations(This,simulations,fontface);
}
static __WIDL_INLINE WINBOOL IDWriteFontFaceReference1_Equals(IDWriteFontFaceReference1* This,IDWriteFontFaceReference *reference) {
    return This->lpVtbl->Equals(This,reference);
}
static __WIDL_INLINE UINT32 IDWriteFontFaceReference1_GetFontFaceIndex(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->GetFontFaceIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFaceReference1_GetSimulations(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_GetFontFile(IDWriteFontFaceReference1* This,IDWriteFontFile **fontfile) {
    return This->lpVtbl->GetFontFile(This,fontfile);
}
static __WIDL_INLINE UINT64 IDWriteFontFaceReference1_GetLocalFileSize(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->GetLocalFileSize(This);
}
static __WIDL_INLINE UINT64 IDWriteFontFaceReference1_GetFileSize(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->GetFileSize(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_GetFileTime(IDWriteFontFaceReference1* This,FILETIME *writetime) {
    return This->lpVtbl->GetFileTime(This,writetime);
}
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontFaceReference1_GetLocality(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->GetLocality(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_EnqueueFontDownloadRequest(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->EnqueueFontDownloadRequest(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_EnqueueCharacterDownloadRequest(IDWriteFontFaceReference1* This,const WCHAR *chars,UINT32 count) {
    return This->lpVtbl->EnqueueCharacterDownloadRequest(This,chars,count);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_EnqueueGlyphDownloadRequest(IDWriteFontFaceReference1* This,const UINT16 *glyphs,UINT32 count) {
    return This->lpVtbl->EnqueueGlyphDownloadRequest(This,glyphs,count);
}
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_EnqueueFileFragmentDownloadRequest(IDWriteFontFaceReference1* This,UINT64 offset,UINT64 size) {
    return This->lpVtbl->EnqueueFileFragmentDownloadRequest(This,offset,size);
}
/*** IDWriteFontFaceReference1 methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFaceReference1_CreateFontFace(IDWriteFontFaceReference1* This,IDWriteFontFace5 **fontface) {
    return This->lpVtbl->IDWriteFontFaceReference1_CreateFontFace(This,fontface);
}
static __WIDL_INLINE UINT32 IDWriteFontFaceReference1_GetFontAxisValueCount(IDWriteFontFaceReference1* This) {
    return This->lpVtbl->GetFontAxisValueCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontList1_QueryInterface(IDWriteFontList1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontList1_AddRef(IDWriteFontList1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontList1_Release(IDWriteFontList1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontList methods ***/
static __WIDL_INLINE HRESULT IDWriteFontList1_GetFontCollection(IDWriteFontList1* This,IDWriteFontCollection **collection) {
    return This->lpVtbl->GetFontCollection(This,collection);
}
static __WIDL_INLINE UINT32 IDWriteFontList1_GetFontCount(IDWriteFontList1* This) {
    return This->lpVtbl->GetFontCount(This);
}
/*** IDWriteFontList1 methods ***/
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontList1_GetFontLocality(IDWriteFontList1* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
static __WIDL_INLINE HRESULT IDWriteFontList1_GetFont(IDWriteFontList1* This,UINT32 index,IDWriteFont3 **font) {
    return This->lpVtbl->IDWriteFontList1_GetFont(This,index,font);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontList2_QueryInterface(IDWriteFontList2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontList2_AddRef(IDWriteFontList2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontList2_Release(IDWriteFontList2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontList methods ***/
static __WIDL_INLINE HRESULT IDWriteFontList2_GetFontCollection(IDWriteFontList2* This,IDWriteFontCollection **collection) {
    return This->lpVtbl->GetFontCollection(This,collection);
}
static __WIDL_INLINE UINT32 IDWriteFontList2_GetFontCount(IDWriteFontList2* This) {
    return This->lpVtbl->GetFontCount(This);
}
/*** IDWriteFontList1 methods ***/
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontList2_GetFontLocality(IDWriteFontList2* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
static __WIDL_INLINE HRESULT IDWriteFontList2_GetFont(IDWriteFontList2* This,UINT32 index,IDWriteFont3 **font) {
    return This->lpVtbl->IDWriteFontList1_GetFont(This,index,font);
}
static __WIDL_INLINE HRESULT IDWriteFontList2_GetFontFaceReference(IDWriteFontList2* This,UINT32 index,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,index,reference);
}
/*** IDWriteFontList2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet2_QueryInterface(IDWriteFontSet2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSet2_AddRef(IDWriteFontSet2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSet2_Release(IDWriteFontSet2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSet methods ***/
static __WIDL_INLINE UINT32 IDWriteFontSet2_GetFontCount(IDWriteFontSet2* This) {
    return This->lpVtbl->GetFontCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontSet2_FindFontFaceReference(IDWriteFontSet2* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet2_FindFontFace(IDWriteFontSet2* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet2_GetPropertyValues__(IDWriteFontSet2* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
    return This->lpVtbl->GetPropertyValues__(This,id,values);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet2_GetPropertyOccurrenceCount(IDWriteFontSet2* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet2_GetFirstFontResources(IDWriteFontSet2* This,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFirstFontResources(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSet2_GetFilteredFonts__(IDWriteFontSet2* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet2_GetFontFaceReference(IDWriteFontSet2* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
}
static __WIDL_INLINE HRESULT IDWriteFontSet2_CreateFontResource(IDWriteFontSet2* This,UINT32 index,IDWriteFontResource **resource) {
    return This->lpVtbl->CreateFontResource(This,index,resource);
}
static __WIDL_INLINE HRESULT IDWriteFontSet2_CreateFontFace(IDWriteFontSet2* This,UINT32 index,IDWriteFontFace5 **fontface) {
    return This->lpVtbl->CreateFontFace(This,index,fontface);
}
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontSet2_GetFontLocality(IDWriteFontSet2* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
/*** IDWriteFontSet2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet3_QueryInterface(IDWriteFontSet3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSet3_AddRef(IDWriteFontSet3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSet3_Release(IDWriteFontSet3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSet methods ***/
static __WIDL_INLINE UINT32 IDWriteFontSet3_GetFontCount(IDWriteFontSet3* This) {
    return This->lpVtbl->GetFontCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontSet3_FindFontFaceReference(IDWriteFontSet3* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet3_FindFontFace(IDWriteFontSet3* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet3_GetPropertyValues__(IDWriteFontSet3* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
    return This->lpVtbl->GetPropertyValues__(This,id,values);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet3_GetPropertyOccurrenceCount(IDWriteFontSet3* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet3_GetFirstFontResources(IDWriteFontSet3* This,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFirstFontResources(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSet3_GetFilteredFonts__(IDWriteFontSet3* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSet3_GetFontFaceReference(IDWriteFontSet3* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
}
static __WIDL_INLINE HRESULT IDWriteFontSet3_CreateFontResource(IDWriteFontSet3* This,UINT32 index,IDWriteFontResource **resource) {
    return This->lpVtbl->CreateFontResource(This,index,resource);
}
static __WIDL_INLINE HRESULT IDWriteFontSet3_CreateFontFace(IDWriteFontSet3* This,UINT32 index,IDWriteFontFace5 **fontface) {
    return This->lpVtbl->CreateFontFace(This,index,fontface);
}
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontSet3_GetFontLocality(IDWriteFontSet3* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
/*** IDWriteFontSet2 methods ***/
static __WIDL_INLINE HANDLE IDWriteFontSet3_GetExpirationEvent(IDWriteFontSet3* This) {
    return This->lpVtbl->GetExpirationEvent(This);
}
/*** IDWriteFontSet3 methods ***/
static __WIDL_INLINE DWRITE_FONT_SOURCE_TYPE IDWriteFontSet3_GetFontSourceType(IDWriteFontSet3* This,UINT32 index) {
    return This->lpVtbl->GetFontSourceType(This,index);
}
static __WIDL_INLINE UINT32 IDWriteFontSet3_GetFontSourceNameLength(IDWriteFontSet3* This,UINT32 index) {
    return This->lpVtbl->GetFontSourceNameLength(This,index);
}
static __WIDL_INLINE 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__ */

/*****************************************************************************
 * IDWriteFontSet4 interface
 */
#ifndef __IDWriteFontSet4_INTERFACE_DEFINED__
#define __IDWriteFontSet4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDWriteFontSet4, 0xeec175fc, 0xbea9, 0x4c86, 0x8b,0x53, 0xcc,0xbd,0xd7,0xdf,0x0c,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eec175fc-bea9-4c86-8b53-ccbdd7df0c82")
IDWriteFontSet4 : public IDWriteFontSet3
{
    virtual UINT32 STDMETHODCALLTYPE ConvertWeightStretchStyleToFontAxisValues(
        const DWRITE_FONT_AXIS_VALUE *input_axis_values,
        UINT32 input_axis_count,
        DWRITE_FONT_WEIGHT weight,
        DWRITE_FONT_STRETCH stretch,
        DWRITE_FONT_STYLE style,
        float size,
        DWRITE_FONT_AXIS_VALUE *output_axis_values) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMatchingFonts(
        const WCHAR *family_name,
        const DWRITE_FONT_AXIS_VALUE *axis_values,
        UINT32 axis_value_count,
        DWRITE_FONT_SIMULATIONS allowed_simulations,
        IDWriteFontSet4 **fonts) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDWriteFontSet4, 0xeec175fc, 0xbea9, 0x4c86, 0x8b,0x53, 0xcc,0xbd,0xd7,0xdf,0x0c,0x82)
#endif
#else
typedef struct IDWriteFontSet4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDWriteFontSet4 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDWriteFontSet4 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDWriteFontSet4 *This);

    /*** IDWriteFontSet methods ***/
    UINT32 (STDMETHODCALLTYPE *GetFontCount)(
        IDWriteFontSet4 *This);

    HRESULT (STDMETHODCALLTYPE *GetFontFaceReference)(
        IDWriteFontSet4 *This,
        UINT32 index,
        IDWriteFontFaceReference **reference);

    HRESULT (STDMETHODCALLTYPE *FindFontFaceReference)(
        IDWriteFontSet4 *This,
        IDWriteFontFaceReference *reference,
        UINT32 *index,
        WINBOOL *exists);

    HRESULT (STDMETHODCALLTYPE *FindFontFace)(
        IDWriteFontSet4 *This,
        IDWriteFontFace *fontface,
        UINT32 *index,
        WINBOOL *exists);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValues__)(
        IDWriteFontSet4 *This,
        DWRITE_FONT_PROPERTY_ID id,
        IDWriteStringList **values);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValues_)(
        IDWriteFontSet4 *This,
        DWRITE_FONT_PROPERTY_ID id,
        const WCHAR *preferred_locales,
        IDWriteStringList **values);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValues)(
        IDWriteFontSet4 *This,
        UINT32 index,
        DWRITE_FONT_PROPERTY_ID id,
        WINBOOL *exists,
        IDWriteLocalizedStrings **values);

    HRESULT (STDMETHODCALLTYPE *GetPropertyOccurrenceCount)(
        IDWriteFontSet4 *This,
        const DWRITE_FONT_PROPERTY *property,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts_)(
        IDWriteFontSet4 *This,
        const WCHAR *family,
        DWRITE_FONT_WEIGHT weight,
        DWRITE_FONT_STRETCH stretch,
        DWRITE_FONT_STYLE style,
        IDWriteFontSet **fontset);

    HRESULT (STDMETHODCALLTYPE *GetMatchingFonts)(
        IDWriteFontSet4 *This,
        const DWRITE_FONT_PROPERTY *props,
        UINT32 count,
        IDWriteFontSet **fontset);

    /*** IDWriteFontSet1 methods ***/
    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetMatchingFonts)(
        IDWriteFontSet4 *This,
        const DWRITE_FONT_PROPERTY *property,
        const DWRITE_FONT_AXIS_VALUE *axis_values,
        UINT32 num_values,
        IDWriteFontSet1 **fontset);

    HRESULT (STDMETHODCALLTYPE *GetFirstFontResources)(
        IDWriteFontSet4 *This,
        IDWriteFontSet1 **fontset);

    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts__)(
        IDWriteFontSet4 *This,
        const UINT32 *indices,
        UINT32 num_indices,
        IDWriteFontSet1 **fontset);

    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts_)(
        IDWriteFontSet4 *This,
        const DWRITE_FONT_AXIS_RANGE *axis_ranges,
        UINT32 num_ranges,
        WINBOOL select_any_range,
        IDWriteFontSet1 **fontset);

    HRESULT (STDMETHODCALLTYPE *GetFilteredFonts)(
        IDWriteFontSet4 *This,
        const DWRITE_FONT_PROPERTY *props,
        UINT32 num_properties,
        WINBOOL select_any_property,
        IDWriteFontSet1 **fontset);

    HRESULT (STDMETHODCALLTYPE *GetFilteredFontIndices_)(
        IDWriteFontSet4 *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)(
        IDWriteFontSet4 *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_)(
        IDWriteFontSet4 *This,
        UINT32 font_index,
        DWRITE_FONT_AXIS_RANGE *axis_ranges,
        UINT32 num_ranges,
        UINT32 *actual_num_ranges);

    HRESULT (STDMETHODCALLTYPE *GetFontAxisRanges)(
        IDWriteFontSet4 *This,
        DWRITE_FONT_AXIS_RANGE *axis_ranges,
        UINT32 num_ranges,
        UINT32 *actual_num_ranges);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet1_GetFontFaceReference)(
        IDWriteFontSet4 *This,
        UINT32 index,
        IDWriteFontFaceReference1 **reference);

    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
        IDWriteFontSet4 *This,
        UINT32 index,
        IDWriteFontResource **resource);

    HRESULT (STDMETHODCALLTYPE *CreateFontFace)(
        IDWriteFontSet4 *This,
        UINT32 index,
        IDWriteFontFace5 **fontface);

    DWRITE_LOCALITY (STDMETHODCALLTYPE *GetFontLocality)(
        IDWriteFontSet4 *This,
        UINT32 index);

    /*** IDWriteFontSet2 methods ***/
    HANDLE (STDMETHODCALLTYPE *GetExpirationEvent)(
        IDWriteFontSet4 *This);

    /*** IDWriteFontSet3 methods ***/
    DWRITE_FONT_SOURCE_TYPE (STDMETHODCALLTYPE *GetFontSourceType)(
        IDWriteFontSet4 *This,
        UINT32 index);

    UINT32 (STDMETHODCALLTYPE *GetFontSourceNameLength)(
        IDWriteFontSet4 *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *GetFontSourceName)(
        IDWriteFontSet4 *This,
        UINT32 index,
        WCHAR *buffer,
        UINT32 buffer_size);

    /*** IDWriteFontSet4 methods ***/
    UINT32 (STDMETHODCALLTYPE *ConvertWeightStretchStyleToFontAxisValues)(
        IDWriteFontSet4 *This,
        const DWRITE_FONT_AXIS_VALUE *input_axis_values,
        UINT32 input_axis_count,
        DWRITE_FONT_WEIGHT weight,
        DWRITE_FONT_STRETCH stretch,
        DWRITE_FONT_STYLE style,
        float size,
        DWRITE_FONT_AXIS_VALUE *output_axis_values);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontSet4_GetMatchingFonts)(
        IDWriteFontSet4 *This,
        const WCHAR *family_name,
        const DWRITE_FONT_AXIS_VALUE *axis_values,
        UINT32 axis_value_count,
        DWRITE_FONT_SIMULATIONS allowed_simulations,
        IDWriteFontSet4 **fonts);

    END_INTERFACE
} IDWriteFontSet4Vtbl;

interface IDWriteFontSet4 {
    CONST_VTBL IDWriteFontSet4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDWriteFontSet4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDWriteFontSet4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDWriteFontSet4_Release(This) (This)->lpVtbl->Release(This)
/*** IDWriteFontSet methods ***/
#define IDWriteFontSet4_GetFontCount(This) (This)->lpVtbl->GetFontCount(This)
#define IDWriteFontSet4_FindFontFaceReference(This,reference,index,exists) (This)->lpVtbl->FindFontFaceReference(This,reference,index,exists)
#define IDWriteFontSet4_FindFontFace(This,fontface,index,exists) (This)->lpVtbl->FindFontFace(This,fontface,index,exists)
#define IDWriteFontSet4_GetPropertyValues__(This,id,values) (This)->lpVtbl->GetPropertyValues__(This,id,values)
#define IDWriteFontSet4_GetPropertyValues_(This,id,preferred_locales,values) (This)->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values)
#define IDWriteFontSet4_GetPropertyValues(This,index,id,exists,values) (This)->lpVtbl->GetPropertyValues(This,index,id,exists,values)
#define IDWriteFontSet4_GetPropertyOccurrenceCount(This,property,count) (This)->lpVtbl->GetPropertyOccurrenceCount(This,property,count)
#define IDWriteFontSet4_GetMatchingFonts_(This,family,weight,stretch,style,fontset) (This)->lpVtbl->GetMatchingFonts_(This,family,weight,stretch,style,fontset)
/*** IDWriteFontSet1 methods ***/
#define IDWriteFontSet4_GetFirstFontResources(This,fontset) (This)->lpVtbl->GetFirstFontResources(This,fontset)
#define IDWriteFontSet4_GetFilteredFonts__(This,indices,num_indices,fontset) (This)->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset)
#define IDWriteFontSet4_GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset) (This)->lpVtbl->GetFilteredFonts_(This,axis_ranges,num_ranges,select_any_range,fontset)
#define IDWriteFontSet4_GetFilteredFonts(This,props,num_properties,select_any_property,fontset) (This)->lpVtbl->GetFilteredFonts(This,props,num_properties,select_any_property,fontset)
#define IDWriteFontSet4_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 IDWriteFontSet4_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 IDWriteFontSet4_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 IDWriteFontSet4_GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges) (This)->lpVtbl->GetFontAxisRanges(This,axis_ranges,num_ranges,actual_num_ranges)
#define IDWriteFontSet4_GetFontFaceReference(This,index,reference) (This)->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference)
#define IDWriteFontSet4_CreateFontResource(This,index,resource) (This)->lpVtbl->CreateFontResource(This,index,resource)
#define IDWriteFontSet4_CreateFontFace(This,index,fontface) (This)->lpVtbl->CreateFontFace(This,index,fontface)
#define IDWriteFontSet4_GetFontLocality(This,index) (This)->lpVtbl->GetFontLocality(This,index)
/*** IDWriteFontSet2 methods ***/
#define IDWriteFontSet4_GetExpirationEvent(This) (This)->lpVtbl->GetExpirationEvent(This)
/*** IDWriteFontSet3 methods ***/
#define IDWriteFontSet4_GetFontSourceType(This,index) (This)->lpVtbl->GetFontSourceType(This,index)
#define IDWriteFontSet4_GetFontSourceNameLength(This,index) (This)->lpVtbl->GetFontSourceNameLength(This,index)
#define IDWriteFontSet4_GetFontSourceName(This,index,buffer,buffer_size) (This)->lpVtbl->GetFontSourceName(This,index,buffer,buffer_size)
/*** IDWriteFontSet4 methods ***/
#define IDWriteFontSet4_ConvertWeightStretchStyleToFontAxisValues(This,input_axis_values,input_axis_count,weight,stretch,style,size,output_axis_values) (This)->lpVtbl->ConvertWeightStretchStyleToFontAxisValues(This,input_axis_values,input_axis_count,weight,stretch,style,size,output_axis_values)
#define IDWriteFontSet4_GetMatchingFonts(This,family_name,axis_values,axis_value_count,allowed_simulations,fonts) (This)->lpVtbl->IDWriteFontSet4_GetMatchingFonts(This,family_name,axis_values,axis_value_count,allowed_simulations,fonts)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDWriteFontSet4_QueryInterface(IDWriteFontSet4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSet4_AddRef(IDWriteFontSet4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSet4_Release(IDWriteFontSet4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSet methods ***/
static __WIDL_INLINE UINT32 IDWriteFontSet4_GetFontCount(IDWriteFontSet4* This) {
    return This->lpVtbl->GetFontCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_FindFontFaceReference(IDWriteFontSet4* This,IDWriteFontFaceReference *reference,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFaceReference(This,reference,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_FindFontFace(IDWriteFontSet4* This,IDWriteFontFace *fontface,UINT32 *index,WINBOOL *exists) {
    return This->lpVtbl->FindFontFace(This,fontface,index,exists);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetPropertyValues__(IDWriteFontSet4* This,DWRITE_FONT_PROPERTY_ID id,IDWriteStringList **values) {
    return This->lpVtbl->GetPropertyValues__(This,id,values);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetPropertyValues_(IDWriteFontSet4* This,DWRITE_FONT_PROPERTY_ID id,const WCHAR *preferred_locales,IDWriteStringList **values) {
    return This->lpVtbl->GetPropertyValues_(This,id,preferred_locales,values);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetPropertyValues(IDWriteFontSet4* This,UINT32 index,DWRITE_FONT_PROPERTY_ID id,WINBOOL *exists,IDWriteLocalizedStrings **values) {
    return This->lpVtbl->GetPropertyValues(This,index,id,exists,values);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetPropertyOccurrenceCount(IDWriteFontSet4* This,const DWRITE_FONT_PROPERTY *property,UINT32 *count) {
    return This->lpVtbl->GetPropertyOccurrenceCount(This,property,count);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetMatchingFonts_(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFirstFontResources(IDWriteFontSet4* This,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFirstFontResources(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetFilteredFonts__(IDWriteFontSet4* This,const UINT32 *indices,UINT32 num_indices,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->GetFilteredFonts__(This,indices,num_indices,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetFilteredFonts_(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFilteredFonts(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFilteredFontIndices_(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFilteredFontIndices(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFontAxisRanges_(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFontAxisRanges(IDWriteFontSet4* 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 __WIDL_INLINE HRESULT IDWriteFontSet4_GetFontFaceReference(IDWriteFontSet4* This,UINT32 index,IDWriteFontFaceReference1 **reference) {
    return This->lpVtbl->IDWriteFontSet1_GetFontFaceReference(This,index,reference);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_CreateFontResource(IDWriteFontSet4* This,UINT32 index,IDWriteFontResource **resource) {
    return This->lpVtbl->CreateFontResource(This,index,resource);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_CreateFontFace(IDWriteFontSet4* This,UINT32 index,IDWriteFontFace5 **fontface) {
    return This->lpVtbl->CreateFontFace(This,index,fontface);
}
static __WIDL_INLINE DWRITE_LOCALITY IDWriteFontSet4_GetFontLocality(IDWriteFontSet4* This,UINT32 index) {
    return This->lpVtbl->GetFontLocality(This,index);
}
/*** IDWriteFontSet2 methods ***/
static __WIDL_INLINE HANDLE IDWriteFontSet4_GetExpirationEvent(IDWriteFontSet4* This) {
    return This->lpVtbl->GetExpirationEvent(This);
}
/*** IDWriteFontSet3 methods ***/
static __WIDL_INLINE DWRITE_FONT_SOURCE_TYPE IDWriteFontSet4_GetFontSourceType(IDWriteFontSet4* This,UINT32 index) {
    return This->lpVtbl->GetFontSourceType(This,index);
}
static __WIDL_INLINE UINT32 IDWriteFontSet4_GetFontSourceNameLength(IDWriteFontSet4* This,UINT32 index) {
    return This->lpVtbl->GetFontSourceNameLength(This,index);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetFontSourceName(IDWriteFontSet4* This,UINT32 index,WCHAR *buffer,UINT32 buffer_size) {
    return This->lpVtbl->GetFontSourceName(This,index,buffer,buffer_size);
}
/*** IDWriteFontSet4 methods ***/
static __WIDL_INLINE UINT32 IDWriteFontSet4_ConvertWeightStretchStyleToFontAxisValues(IDWriteFontSet4* This,const DWRITE_FONT_AXIS_VALUE *input_axis_values,UINT32 input_axis_count,DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,float size,DWRITE_FONT_AXIS_VALUE *output_axis_values) {
    return This->lpVtbl->ConvertWeightStretchStyleToFontAxisValues(This,input_axis_values,input_axis_count,weight,stretch,style,size,output_axis_values);
}
static __WIDL_INLINE HRESULT IDWriteFontSet4_GetMatchingFonts(IDWriteFontSet4* This,const WCHAR *family_name,const DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 axis_value_count,DWRITE_FONT_SIMULATIONS allowed_simulations,IDWriteFontSet4 **fonts) {
    return This->lpVtbl->IDWriteFontSet4_GetMatchingFonts(This,family_name,axis_values,axis_value_count,allowed_simulations,fonts);
}
#endif
#endif

#endif


#endif  /* __IDWriteFontSet4_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 __WIDL_INLINE HRESULT IDWriteFontFace3_QueryInterface(IDWriteFontFace3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFace3_AddRef(IDWriteFontFace3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFace3_Release(IDWriteFontFace3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFace methods ***/
static __WIDL_INLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace3_GetType(IDWriteFontFace3* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace3_GetFiles(IDWriteFontFace3* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
}
static __WIDL_INLINE UINT32 IDWriteFontFace3_GetIndex(IDWriteFontFace3* This) {
    return This->lpVtbl->GetIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace3_GetSimulations(IDWriteFontFace3* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace3_IsSymbolFont(IDWriteFontFace3* This) {
    return This->lpVtbl->IsSymbolFont(This);
}
static __WIDL_INLINE UINT16 IDWriteFontFace3_GetGlyphCount(IDWriteFontFace3* This) {
    return This->lpVtbl->GetGlyphCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace3_GetGlyphIndices(IDWriteFontFace3* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace3_ReleaseFontTable(IDWriteFontFace3* This,void *table_context) {
    This->lpVtbl->ReleaseFontTable(This,table_context);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace3_GetMetrics(IDWriteFontFace3* This,DWRITE_FONT_METRICS1 *metrics) {
    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace3_GetCaretMetrics(IDWriteFontFace3* This,DWRITE_CARET_METRICS *metrics) {
    This->lpVtbl->GetCaretMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace3_GetUnicodeRanges(IDWriteFontFace3* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace3_IsMonospacedFont(IDWriteFontFace3* This) {
    return This->lpVtbl->IsMonospacedFont(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace3_GetKerningPairAdjustments(IDWriteFontFace3* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace3_HasKerningPairs(IDWriteFontFace3* This) {
    return This->lpVtbl->HasKerningPairs(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontFace3_HasVerticalGlyphVariants(IDWriteFontFace3* This) {
    return This->lpVtbl->HasVerticalGlyphVariants(This);
}
/*** IDWriteFontFace2 methods ***/
static __WIDL_INLINE WINBOOL IDWriteFontFace3_IsColorFont(IDWriteFontFace3* This) {
    return This->lpVtbl->IsColorFont(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace3_GetColorPaletteCount(IDWriteFontFace3* This) {
    return This->lpVtbl->GetColorPaletteCount(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace3_GetPaletteEntryCount(IDWriteFontFace3* This) {
    return This->lpVtbl->GetPaletteEntryCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace3_GetFontFaceReference(IDWriteFontFace3* This,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,reference);
}
static __WIDL_INLINE void IDWriteFontFace3_GetPanose(IDWriteFontFace3* This,DWRITE_PANOSE *panose) {
    This->lpVtbl->GetPanose(This,panose);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteFontFace3_GetWeight(IDWriteFontFace3* This) {
    return This->lpVtbl->GetWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteFontFace3_GetStretch(IDWriteFontFace3* This) {
    return This->lpVtbl->GetStretch(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteFontFace3_GetStyle(IDWriteFontFace3* This) {
    return This->lpVtbl->GetStyle(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace3_GetFamilyNames(IDWriteFontFace3* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFamilyNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace3_GetFaceNames(IDWriteFontFace3* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFaceNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace3_GetInformationalStrings(IDWriteFontFace3* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace3_HasCharacter(IDWriteFontFace3* This,UINT32 character) {
    return This->lpVtbl->HasCharacter(This,character);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontFace3_IsCharacterLocal(IDWriteFontFace3* This,UINT32 character) {
    return This->lpVtbl->IsCharacterLocal(This,character);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace3_IsGlyphLocal(IDWriteFontFace3* This,UINT16 glyph) {
    return This->lpVtbl->IsGlyphLocal(This,glyph);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextFormat2_QueryInterface(IDWriteTextFormat2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteTextFormat2_AddRef(IDWriteTextFormat2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteTextFormat2_Release(IDWriteTextFormat2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteTextFormat methods ***/
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetTextAlignment(IDWriteTextFormat2* This,DWRITE_TEXT_ALIGNMENT alignment) {
    return This->lpVtbl->SetTextAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetParagraphAlignment(IDWriteTextFormat2* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
    return This->lpVtbl->SetParagraphAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetWordWrapping(IDWriteTextFormat2* This,DWRITE_WORD_WRAPPING wrapping) {
    return This->lpVtbl->SetWordWrapping(This,wrapping);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetReadingDirection(IDWriteTextFormat2* This,DWRITE_READING_DIRECTION direction) {
    return This->lpVtbl->SetReadingDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetFlowDirection(IDWriteTextFormat2* This,DWRITE_FLOW_DIRECTION direction) {
    return This->lpVtbl->SetFlowDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetIncrementalTabStop(IDWriteTextFormat2* This,FLOAT tabstop) {
    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetTrimming(IDWriteTextFormat2* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
}
static __WIDL_INLINE DWRITE_TEXT_ALIGNMENT IDWriteTextFormat2_GetTextAlignment(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetTextAlignment(This);
}
static __WIDL_INLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextFormat2_GetParagraphAlignment(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetParagraphAlignment(This);
}
static __WIDL_INLINE DWRITE_WORD_WRAPPING IDWriteTextFormat2_GetWordWrapping(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetWordWrapping(This);
}
static __WIDL_INLINE DWRITE_READING_DIRECTION IDWriteTextFormat2_GetReadingDirection(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetReadingDirection(This);
}
static __WIDL_INLINE DWRITE_FLOW_DIRECTION IDWriteTextFormat2_GetFlowDirection(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetFlowDirection(This);
}
static __WIDL_INLINE FLOAT IDWriteTextFormat2_GetIncrementalTabStop(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetIncrementalTabStop(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_GetTrimming(IDWriteTextFormat2* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_GetFontCollection(IDWriteTextFormat2* This,IDWriteFontCollection **collection) {
    return This->lpVtbl->GetFontCollection(This,collection);
}
static __WIDL_INLINE UINT32 IDWriteTextFormat2_GetFontFamilyNameLength(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetFontFamilyNameLength(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_GetFontFamilyName(IDWriteTextFormat2* This,WCHAR *name,UINT32 size) {
    return This->lpVtbl->GetFontFamilyName(This,name,size);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteTextFormat2_GetFontWeight(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetFontWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteTextFormat2_GetFontStyle(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetFontStyle(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteTextFormat2_GetFontStretch(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetFontStretch(This);
}
static __WIDL_INLINE FLOAT IDWriteTextFormat2_GetFontSize(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetFontSize(This);
}
static __WIDL_INLINE UINT32 IDWriteTextFormat2_GetLocaleNameLength(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetLocaleNameLength(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_GetLocaleName(IDWriteTextFormat2* This,WCHAR *name,UINT32 size) {
    return This->lpVtbl->GetLocaleName(This,name,size);
}
/*** IDWriteTextFormat1 methods ***/
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetVerticalGlyphOrientation(IDWriteTextFormat2* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
}
static __WIDL_INLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextFormat2_GetVerticalGlyphOrientation(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetVerticalGlyphOrientation(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetLastLineWrapping(IDWriteTextFormat2* This,WINBOOL lastline_wrapping_enabled) {
    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
}
static __WIDL_INLINE WINBOOL IDWriteTextFormat2_GetLastLineWrapping(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetLastLineWrapping(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetOpticalAlignment(IDWriteTextFormat2* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
    return This->lpVtbl->SetOpticalAlignment(This,alignment);
}
static __WIDL_INLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextFormat2_GetOpticalAlignment(IDWriteTextFormat2* This) {
    return This->lpVtbl->GetOpticalAlignment(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetFontFallback(IDWriteTextFormat2* This,IDWriteFontFallback *fallback) {
    return This->lpVtbl->SetFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat2_GetFontFallback(IDWriteTextFormat2* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetFontFallback(This,fallback);
}
/*** IDWriteTextFormat2 methods ***/
static __WIDL_INLINE HRESULT IDWriteTextFormat2_SetLineSpacing(IDWriteTextFormat2* This,const DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextFormat2_SetLineSpacing(This,spacing);
}
static __WIDL_INLINE 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(
        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,
        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 __WIDL_INLINE HRESULT IDWriteTextFormat3_QueryInterface(IDWriteTextFormat3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteTextFormat3_AddRef(IDWriteTextFormat3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteTextFormat3_Release(IDWriteTextFormat3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteTextFormat methods ***/
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetTextAlignment(IDWriteTextFormat3* This,DWRITE_TEXT_ALIGNMENT alignment) {
    return This->lpVtbl->SetTextAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetParagraphAlignment(IDWriteTextFormat3* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
    return This->lpVtbl->SetParagraphAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetWordWrapping(IDWriteTextFormat3* This,DWRITE_WORD_WRAPPING wrapping) {
    return This->lpVtbl->SetWordWrapping(This,wrapping);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetReadingDirection(IDWriteTextFormat3* This,DWRITE_READING_DIRECTION direction) {
    return This->lpVtbl->SetReadingDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetFlowDirection(IDWriteTextFormat3* This,DWRITE_FLOW_DIRECTION direction) {
    return This->lpVtbl->SetFlowDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetIncrementalTabStop(IDWriteTextFormat3* This,FLOAT tabstop) {
    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetTrimming(IDWriteTextFormat3* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
}
static __WIDL_INLINE DWRITE_TEXT_ALIGNMENT IDWriteTextFormat3_GetTextAlignment(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetTextAlignment(This);
}
static __WIDL_INLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextFormat3_GetParagraphAlignment(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetParagraphAlignment(This);
}
static __WIDL_INLINE DWRITE_WORD_WRAPPING IDWriteTextFormat3_GetWordWrapping(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetWordWrapping(This);
}
static __WIDL_INLINE DWRITE_READING_DIRECTION IDWriteTextFormat3_GetReadingDirection(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetReadingDirection(This);
}
static __WIDL_INLINE DWRITE_FLOW_DIRECTION IDWriteTextFormat3_GetFlowDirection(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFlowDirection(This);
}
static __WIDL_INLINE FLOAT IDWriteTextFormat3_GetIncrementalTabStop(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetIncrementalTabStop(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetTrimming(IDWriteTextFormat3* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetFontCollection(IDWriteTextFormat3* This,IDWriteFontCollection **collection) {
    return This->lpVtbl->GetFontCollection(This,collection);
}
static __WIDL_INLINE UINT32 IDWriteTextFormat3_GetFontFamilyNameLength(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFontFamilyNameLength(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetFontFamilyName(IDWriteTextFormat3* This,WCHAR *name,UINT32 size) {
    return This->lpVtbl->GetFontFamilyName(This,name,size);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteTextFormat3_GetFontWeight(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFontWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteTextFormat3_GetFontStyle(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFontStyle(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteTextFormat3_GetFontStretch(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFontStretch(This);
}
static __WIDL_INLINE FLOAT IDWriteTextFormat3_GetFontSize(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFontSize(This);
}
static __WIDL_INLINE UINT32 IDWriteTextFormat3_GetLocaleNameLength(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetLocaleNameLength(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetLocaleName(IDWriteTextFormat3* This,WCHAR *name,UINT32 size) {
    return This->lpVtbl->GetLocaleName(This,name,size);
}
/*** IDWriteTextFormat1 methods ***/
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetVerticalGlyphOrientation(IDWriteTextFormat3* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
}
static __WIDL_INLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextFormat3_GetVerticalGlyphOrientation(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetVerticalGlyphOrientation(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetLastLineWrapping(IDWriteTextFormat3* This,WINBOOL lastline_wrapping_enabled) {
    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
}
static __WIDL_INLINE WINBOOL IDWriteTextFormat3_GetLastLineWrapping(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetLastLineWrapping(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetOpticalAlignment(IDWriteTextFormat3* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
    return This->lpVtbl->SetOpticalAlignment(This,alignment);
}
static __WIDL_INLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextFormat3_GetOpticalAlignment(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetOpticalAlignment(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetFontFallback(IDWriteTextFormat3* This,IDWriteFontFallback *fallback) {
    return This->lpVtbl->SetFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetFontFallback(IDWriteTextFormat3* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetFontFallback(This,fallback);
}
/*** IDWriteTextFormat2 methods ***/
static __WIDL_INLINE HRESULT IDWriteTextFormat3_SetLineSpacing(IDWriteTextFormat3* This,const DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextFormat2_SetLineSpacing(This,spacing);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetLineSpacing(IDWriteTextFormat3* This,DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextFormat2_GetLineSpacing(This,spacing);
}
/*** IDWriteTextFormat3 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE UINT32 IDWriteTextFormat3_GetFontAxisValueCount(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetFontAxisValueCount(This);
}
static __WIDL_INLINE HRESULT IDWriteTextFormat3_GetFontAxisValues(IDWriteTextFormat3* This,DWRITE_FONT_AXIS_VALUE *axis_values,UINT32 num_values) {
    return This->lpVtbl->GetFontAxisValues(This,axis_values,num_values);
}
static __WIDL_INLINE DWRITE_AUTOMATIC_FONT_AXES IDWriteTextFormat3_GetAutomaticFontAxes(IDWriteTextFormat3* This) {
    return This->lpVtbl->GetAutomaticFontAxes(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout3_QueryInterface(IDWriteTextLayout3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteTextLayout3_AddRef(IDWriteTextLayout3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteTextLayout3_Release(IDWriteTextLayout3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteTextFormat methods ***/
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetTextAlignment(IDWriteTextLayout3* This,DWRITE_TEXT_ALIGNMENT alignment) {
    return This->lpVtbl->SetTextAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetParagraphAlignment(IDWriteTextLayout3* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
    return This->lpVtbl->SetParagraphAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetWordWrapping(IDWriteTextLayout3* This,DWRITE_WORD_WRAPPING wrapping) {
    return This->lpVtbl->SetWordWrapping(This,wrapping);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetReadingDirection(IDWriteTextLayout3* This,DWRITE_READING_DIRECTION direction) {
    return This->lpVtbl->SetReadingDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFlowDirection(IDWriteTextLayout3* This,DWRITE_FLOW_DIRECTION direction) {
    return This->lpVtbl->SetFlowDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetIncrementalTabStop(IDWriteTextLayout3* This,FLOAT tabstop) {
    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetTrimming(IDWriteTextLayout3* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
}
static __WIDL_INLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout3_GetTextAlignment(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetTextAlignment(This);
}
static __WIDL_INLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout3_GetParagraphAlignment(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetParagraphAlignment(This);
}
static __WIDL_INLINE DWRITE_WORD_WRAPPING IDWriteTextLayout3_GetWordWrapping(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetWordWrapping(This);
}
static __WIDL_INLINE DWRITE_READING_DIRECTION IDWriteTextLayout3_GetReadingDirection(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetReadingDirection(This);
}
static __WIDL_INLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout3_GetFlowDirection(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetFlowDirection(This);
}
static __WIDL_INLINE FLOAT IDWriteTextLayout3_GetIncrementalTabStop(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetIncrementalTabStop(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetTrimming(IDWriteTextLayout3* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
}
/*** IDWriteTextLayout methods ***/
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetMaxWidth(IDWriteTextLayout3* This,FLOAT maxWidth) {
    return This->lpVtbl->SetMaxWidth(This,maxWidth);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetMaxHeight(IDWriteTextLayout3* This,FLOAT maxHeight) {
    return This->lpVtbl->SetMaxHeight(This,maxHeight);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontCollection(IDWriteTextLayout3* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontCollection(This,collection,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontFamilyName(IDWriteTextLayout3* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontFamilyName(This,name,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontWeight(IDWriteTextLayout3* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontWeight(This,weight,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontStyle(IDWriteTextLayout3* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontStyle(This,style,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontStretch(IDWriteTextLayout3* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontStretch(This,stretch,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontSize(IDWriteTextLayout3* This,FLOAT size,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontSize(This,size,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetUnderline(IDWriteTextLayout3* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetUnderline(This,underline,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetStrikethrough(IDWriteTextLayout3* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetDrawingEffect(IDWriteTextLayout3* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetDrawingEffect(This,effect,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetInlineObject(IDWriteTextLayout3* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetInlineObject(This,object,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetTypography(IDWriteTextLayout3* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetTypography(This,typography,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetLocaleName(IDWriteTextLayout3* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetLocaleName(This,locale,range);
}
static __WIDL_INLINE FLOAT IDWriteTextLayout3_GetMaxWidth(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetMaxWidth(This);
}
static __WIDL_INLINE FLOAT IDWriteTextLayout3_GetMaxHeight(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetMaxHeight(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetFontCollection(IDWriteTextLayout3* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetFontFamilyNameLength(IDWriteTextLayout3* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout3_GetFontSize(IDWriteTextLayout3* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetUnderline(IDWriteTextLayout3* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetStrikethrough(IDWriteTextLayout3* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetDrawingEffect(IDWriteTextLayout3* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetInlineObject(IDWriteTextLayout3* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetInlineObject(This,position,object,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetTypography(IDWriteTextLayout3* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetTypography(This,position,typography,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetLocaleNameLength(IDWriteTextLayout3* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout3_Draw(IDWriteTextLayout3* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetOverhangMetrics(IDWriteTextLayout3* This,DWRITE_OVERHANG_METRICS *overhangs) {
    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout3_DetermineMinWidth(IDWriteTextLayout3* This,FLOAT *min_width) {
    return This->lpVtbl->DetermineMinWidth(This,min_width);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout3_SetPairKerning(IDWriteTextLayout3* This,WINBOOL is_pairkerning_enabled,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout3_GetMetrics(IDWriteTextLayout3* This,DWRITE_TEXT_METRICS1 *metrics) {
    return This->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetVerticalGlyphOrientation(IDWriteTextLayout3* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
}
static __WIDL_INLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextLayout3_GetVerticalGlyphOrientation(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetVerticalGlyphOrientation(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetLastLineWrapping(IDWriteTextLayout3* This,WINBOOL lastline_wrapping_enabled) {
    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
}
static __WIDL_INLINE WINBOOL IDWriteTextLayout3_GetLastLineWrapping(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetLastLineWrapping(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetOpticalAlignment(IDWriteTextLayout3* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
    return This->lpVtbl->SetOpticalAlignment(This,alignment);
}
static __WIDL_INLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextLayout3_GetOpticalAlignment(IDWriteTextLayout3* This) {
    return This->lpVtbl->GetOpticalAlignment(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetFontFallback(IDWriteTextLayout3* This,IDWriteFontFallback *fallback) {
    return This->lpVtbl->SetFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetFontFallback(IDWriteTextLayout3* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetFontFallback(This,fallback);
}
/*** IDWriteTextLayout3 methods ***/
static __WIDL_INLINE HRESULT IDWriteTextLayout3_InvalidateLayout(IDWriteTextLayout3* This) {
    return This->lpVtbl->InvalidateLayout(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_SetLineSpacing(IDWriteTextLayout3* This,const DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextLayout3_SetLineSpacing(This,spacing);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout3_GetLineSpacing(IDWriteTextLayout3* This,DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextLayout3_GetLineSpacing(This,spacing);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout4_QueryInterface(IDWriteTextLayout4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteTextLayout4_AddRef(IDWriteTextLayout4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteTextLayout4_Release(IDWriteTextLayout4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteTextFormat methods ***/
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetTextAlignment(IDWriteTextLayout4* This,DWRITE_TEXT_ALIGNMENT alignment) {
    return This->lpVtbl->SetTextAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetParagraphAlignment(IDWriteTextLayout4* This,DWRITE_PARAGRAPH_ALIGNMENT alignment) {
    return This->lpVtbl->SetParagraphAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetWordWrapping(IDWriteTextLayout4* This,DWRITE_WORD_WRAPPING wrapping) {
    return This->lpVtbl->SetWordWrapping(This,wrapping);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetReadingDirection(IDWriteTextLayout4* This,DWRITE_READING_DIRECTION direction) {
    return This->lpVtbl->SetReadingDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFlowDirection(IDWriteTextLayout4* This,DWRITE_FLOW_DIRECTION direction) {
    return This->lpVtbl->SetFlowDirection(This,direction);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetIncrementalTabStop(IDWriteTextLayout4* This,FLOAT tabstop) {
    return This->lpVtbl->SetIncrementalTabStop(This,tabstop);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetTrimming(IDWriteTextLayout4* This,const DWRITE_TRIMMING *trimming,IDWriteInlineObject *trimming_sign) {
    return This->lpVtbl->SetTrimming(This,trimming,trimming_sign);
}
static __WIDL_INLINE DWRITE_TEXT_ALIGNMENT IDWriteTextLayout4_GetTextAlignment(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetTextAlignment(This);
}
static __WIDL_INLINE DWRITE_PARAGRAPH_ALIGNMENT IDWriteTextLayout4_GetParagraphAlignment(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetParagraphAlignment(This);
}
static __WIDL_INLINE DWRITE_WORD_WRAPPING IDWriteTextLayout4_GetWordWrapping(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetWordWrapping(This);
}
static __WIDL_INLINE DWRITE_READING_DIRECTION IDWriteTextLayout4_GetReadingDirection(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetReadingDirection(This);
}
static __WIDL_INLINE DWRITE_FLOW_DIRECTION IDWriteTextLayout4_GetFlowDirection(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetFlowDirection(This);
}
static __WIDL_INLINE FLOAT IDWriteTextLayout4_GetIncrementalTabStop(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetIncrementalTabStop(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetTrimming(IDWriteTextLayout4* This,DWRITE_TRIMMING *options,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->GetTrimming(This,options,trimming_sign);
}
/*** IDWriteTextLayout methods ***/
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetMaxWidth(IDWriteTextLayout4* This,FLOAT maxWidth) {
    return This->lpVtbl->SetMaxWidth(This,maxWidth);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetMaxHeight(IDWriteTextLayout4* This,FLOAT maxHeight) {
    return This->lpVtbl->SetMaxHeight(This,maxHeight);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontCollection(IDWriteTextLayout4* This,IDWriteFontCollection *collection,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontCollection(This,collection,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontFamilyName(IDWriteTextLayout4* This,const WCHAR *name,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontFamilyName(This,name,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontWeight(IDWriteTextLayout4* This,DWRITE_FONT_WEIGHT weight,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontWeight(This,weight,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontStyle(IDWriteTextLayout4* This,DWRITE_FONT_STYLE style,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontStyle(This,style,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontStretch(IDWriteTextLayout4* This,DWRITE_FONT_STRETCH stretch,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontStretch(This,stretch,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontSize(IDWriteTextLayout4* This,FLOAT size,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetFontSize(This,size,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetUnderline(IDWriteTextLayout4* This,WINBOOL underline,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetUnderline(This,underline,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetStrikethrough(IDWriteTextLayout4* This,WINBOOL strikethrough,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetStrikethrough(This,strikethrough,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetDrawingEffect(IDWriteTextLayout4* This,IUnknown *effect,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetDrawingEffect(This,effect,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetInlineObject(IDWriteTextLayout4* This,IDWriteInlineObject *object,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetInlineObject(This,object,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetTypography(IDWriteTextLayout4* This,IDWriteTypography *typography,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetTypography(This,typography,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetLocaleName(IDWriteTextLayout4* This,const WCHAR *locale,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetLocaleName(This,locale,range);
}
static __WIDL_INLINE FLOAT IDWriteTextLayout4_GetMaxWidth(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetMaxWidth(This);
}
static __WIDL_INLINE FLOAT IDWriteTextLayout4_GetMaxHeight(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetMaxHeight(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetFontCollection(IDWriteTextLayout4* This,UINT32 pos,IDWriteFontCollection **collection,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetFontCollection(This,pos,collection,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetFontFamilyNameLength(IDWriteTextLayout4* This,UINT32 pos,UINT32 *len,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetFontFamilyNameLength(This,pos,len,range);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout4_GetFontSize(IDWriteTextLayout4* This,UINT32 position,FLOAT *size,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetFontSize(This,position,size,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetUnderline(IDWriteTextLayout4* This,UINT32 position,WINBOOL *has_underline,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetUnderline(This,position,has_underline,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetStrikethrough(IDWriteTextLayout4* This,UINT32 position,WINBOOL *has_strikethrough,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetStrikethrough(This,position,has_strikethrough,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetDrawingEffect(IDWriteTextLayout4* This,UINT32 position,IUnknown **effect,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetDrawingEffect(This,position,effect,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetInlineObject(IDWriteTextLayout4* This,UINT32 position,IDWriteInlineObject **object,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetInlineObject(This,position,object,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetTypography(IDWriteTextLayout4* This,UINT32 position,IDWriteTypography **typography,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->GetTypography(This,position,typography,range);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetLocaleNameLength(IDWriteTextLayout4* This,UINT32 position,UINT32 *length,DWRITE_TEXT_RANGE *range) {
    return This->lpVtbl->IDWriteTextLayout_GetLocaleNameLength(This,position,length,range);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout4_Draw(IDWriteTextLayout4* This,void *context,IDWriteTextRenderer *renderer,FLOAT originX,FLOAT originY) {
    return This->lpVtbl->Draw(This,context,renderer,originX,originY);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetOverhangMetrics(IDWriteTextLayout4* This,DWRITE_OVERHANG_METRICS *overhangs) {
    return This->lpVtbl->GetOverhangMetrics(This,overhangs);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout4_DetermineMinWidth(IDWriteTextLayout4* This,FLOAT *min_width) {
    return This->lpVtbl->DetermineMinWidth(This,min_width);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout4_SetPairKerning(IDWriteTextLayout4* This,WINBOOL is_pairkerning_enabled,DWRITE_TEXT_RANGE range) {
    return This->lpVtbl->SetPairKerning(This,is_pairkerning_enabled,range);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteTextLayout4_GetMetrics(IDWriteTextLayout4* This,DWRITE_TEXT_METRICS1 *metrics) {
    return This->lpVtbl->IDWriteTextLayout2_GetMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetVerticalGlyphOrientation(IDWriteTextLayout4* This,DWRITE_VERTICAL_GLYPH_ORIENTATION orientation) {
    return This->lpVtbl->SetVerticalGlyphOrientation(This,orientation);
}
static __WIDL_INLINE DWRITE_VERTICAL_GLYPH_ORIENTATION IDWriteTextLayout4_GetVerticalGlyphOrientation(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetVerticalGlyphOrientation(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetLastLineWrapping(IDWriteTextLayout4* This,WINBOOL lastline_wrapping_enabled) {
    return This->lpVtbl->SetLastLineWrapping(This,lastline_wrapping_enabled);
}
static __WIDL_INLINE WINBOOL IDWriteTextLayout4_GetLastLineWrapping(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetLastLineWrapping(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetOpticalAlignment(IDWriteTextLayout4* This,DWRITE_OPTICAL_ALIGNMENT alignment) {
    return This->lpVtbl->SetOpticalAlignment(This,alignment);
}
static __WIDL_INLINE DWRITE_OPTICAL_ALIGNMENT IDWriteTextLayout4_GetOpticalAlignment(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetOpticalAlignment(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetFontFallback(IDWriteTextLayout4* This,IDWriteFontFallback *fallback) {
    return This->lpVtbl->SetFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetFontFallback(IDWriteTextLayout4* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetFontFallback(This,fallback);
}
/*** IDWriteTextLayout3 methods ***/
static __WIDL_INLINE HRESULT IDWriteTextLayout4_InvalidateLayout(IDWriteTextLayout4* This) {
    return This->lpVtbl->InvalidateLayout(This);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_SetLineSpacing(IDWriteTextLayout4* This,const DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextLayout3_SetLineSpacing(This,spacing);
}
static __WIDL_INLINE HRESULT IDWriteTextLayout4_GetLineSpacing(IDWriteTextLayout4* This,DWRITE_LINE_SPACING *spacing) {
    return This->lpVtbl->IDWriteTextLayout3_GetLineSpacing(This,spacing);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE UINT32 IDWriteTextLayout4_GetFontAxisValueCount(IDWriteTextLayout4* This,UINT32 pos) {
    return This->lpVtbl->GetFontAxisValueCount(This,pos);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_AUTOMATIC_FONT_AXES IDWriteTextLayout4_GetAutomaticFontAxes(IDWriteTextLayout4* This) {
    return This->lpVtbl->GetAutomaticFontAxes(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFallback1_QueryInterface(IDWriteFontFallback1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFallback1_AddRef(IDWriteFontFallback1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFallback1_Release(IDWriteFontFallback1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFallback methods ***/
/*** IDWriteFontFallback1 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteGdiInterop1_QueryInterface(IDWriteGdiInterop1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteGdiInterop1_AddRef(IDWriteGdiInterop1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteGdiInterop1_Release(IDWriteGdiInterop1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteGdiInterop methods ***/
static __WIDL_INLINE HRESULT IDWriteGdiInterop1_ConvertFontToLOGFONT(IDWriteGdiInterop1* This,IDWriteFont *font,LOGFONTW *logfont,WINBOOL *is_systemfont) {
    return This->lpVtbl->ConvertFontToLOGFONT(This,font,logfont,is_systemfont);
}
static __WIDL_INLINE HRESULT IDWriteGdiInterop1_ConvertFontFaceToLOGFONT(IDWriteGdiInterop1* This,IDWriteFontFace *font,LOGFONTW *logfont) {
    return This->lpVtbl->ConvertFontFaceToLOGFONT(This,font,logfont);
}
static __WIDL_INLINE HRESULT IDWriteGdiInterop1_CreateFontFaceFromHdc(IDWriteGdiInterop1* This,HDC hdc,IDWriteFontFace **fontface) {
    return This->lpVtbl->CreateFontFaceFromHdc(This,hdc,fontface);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteGdiInterop1_CreateFontFromLOGFONT(IDWriteGdiInterop1* This,const LOGFONTW *logfont,IDWriteFontCollection *collection,IDWriteFont **font) {
    return This->lpVtbl->IDWriteGdiInterop1_CreateFontFromLOGFONT(This,logfont,collection,font);
}
static __WIDL_INLINE HRESULT IDWriteGdiInterop1_GetFontSignature_(IDWriteGdiInterop1* This,IDWriteFontFace *fontface,FONTSIGNATURE *fontsig) {
    return This->lpVtbl->GetFontSignature_(This,fontface,fontsig);
}
static __WIDL_INLINE HRESULT IDWriteGdiInterop1_GetFontSignature(IDWriteGdiInterop1* This,IDWriteFont *font,FONTSIGNATURE *fontsig) {
    return This->lpVtbl->GetFontSignature(This,font,fontsig);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSetBuilder_QueryInterface(IDWriteFontSetBuilder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSetBuilder_AddRef(IDWriteFontSetBuilder* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSetBuilder_Release(IDWriteFontSetBuilder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSetBuilder methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSetBuilder_AddFontFaceReference(IDWriteFontSetBuilder* This,IDWriteFontFaceReference *ref) {
    return This->lpVtbl->AddFontFaceReference(This,ref);
}
static __WIDL_INLINE HRESULT IDWriteFontSetBuilder_AddFontSet(IDWriteFontSetBuilder* This,IDWriteFontSet *fontset) {
    return This->lpVtbl->AddFontSet(This,fontset);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSetBuilder1_QueryInterface(IDWriteFontSetBuilder1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSetBuilder1_AddRef(IDWriteFontSetBuilder1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSetBuilder1_Release(IDWriteFontSetBuilder1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSetBuilder methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSetBuilder1_AddFontFaceReference(IDWriteFontSetBuilder1* This,IDWriteFontFaceReference *ref) {
    return This->lpVtbl->AddFontFaceReference(This,ref);
}
static __WIDL_INLINE HRESULT IDWriteFontSetBuilder1_AddFontSet(IDWriteFontSetBuilder1* This,IDWriteFontSet *fontset) {
    return This->lpVtbl->AddFontSet(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSetBuilder1_CreateFontSet(IDWriteFontSetBuilder1* This,IDWriteFontSet **fontset) {
    return This->lpVtbl->CreateFontSet(This,fontset);
}
/*** IDWriteFontSetBuilder1 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSetBuilder2_QueryInterface(IDWriteFontSetBuilder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontSetBuilder2_AddRef(IDWriteFontSetBuilder2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontSetBuilder2_Release(IDWriteFontSetBuilder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontSetBuilder methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontSetBuilder2_AddFontFaceReference(IDWriteFontSetBuilder2* This,IDWriteFontFaceReference *ref) {
    return This->lpVtbl->AddFontFaceReference(This,ref);
}
static __WIDL_INLINE HRESULT IDWriteFontSetBuilder2_AddFontSet(IDWriteFontSetBuilder2* This,IDWriteFontSet *fontset) {
    return This->lpVtbl->AddFontSet(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFontSetBuilder2_CreateFontSet(IDWriteFontSetBuilder2* This,IDWriteFontSet **fontset) {
    return This->lpVtbl->CreateFontSet(This,fontset);
}
/*** IDWriteFontSetBuilder1 methods ***/
/*** IDWriteFontSetBuilder2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_QueryInterface(IDWriteFactory3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFactory3_AddRef(IDWriteFactory3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFactory3_Release(IDWriteFactory3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_RegisterFontCollectionLoader(IDWriteFactory3* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_UnregisterFontCollectionLoader(IDWriteFactory3* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_CreateFontFileReference(IDWriteFactory3* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_CreateRenderingParams(IDWriteFactory3* This,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateRenderingParams(This,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_CreateMonitorRenderingParams(IDWriteFactory3* This,HMONITOR monitor,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_RegisterFontFileLoader(IDWriteFactory3* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->RegisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_UnregisterFontFileLoader(IDWriteFactory3* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_CreateTypography(IDWriteFactory3* This,IDWriteTypography **typography) {
    return This->lpVtbl->CreateTypography(This,typography);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_GetGdiInterop(IDWriteFactory3* This,IDWriteGdiInterop **gdi_interop) {
    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_CreateEllipsisTrimmingSign(IDWriteFactory3* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_CreateTextAnalyzer(IDWriteFactory3* This,IDWriteTextAnalyzer **analyzer) {
    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_GetEudcFontCollection(IDWriteFactory3* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
}
/*** IDWriteFactory2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFactory3_GetSystemFontFallback(IDWriteFactory3* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetSystemFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_CreateFontFallbackBuilder(IDWriteFactory3* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory3_GetSystemFontSet(IDWriteFactory3* This,IDWriteFontSet **fontset) {
    return This->lpVtbl->GetSystemFontSet(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_CreateFontSetBuilder(IDWriteFactory3* This,IDWriteFontSetBuilder **builder) {
    return This->lpVtbl->CreateFontSetBuilder(This,builder);
}
static __WIDL_INLINE HRESULT IDWriteFactory3_CreateFontCollectionFromFontSet(IDWriteFactory3* This,IDWriteFontSet *fontset,IDWriteFontCollection1 **collection) {
    return This->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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;
    D2D1_SIZE_U pixelSize;
    D2D1_POINT_2L horizontalLeftOrigin;
    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__

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

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDWriteFontFace4 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDWriteFontFace4 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDWriteFontFace4 *This);

    /*** IDWriteFontFace methods ***/
    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
        IDWriteFontFace4 *This);

    HRESULT (STDMETHODCALLTYPE *GetFiles)(
        IDWriteFontFace4 *This,
        UINT32 *number_of_files,
        IDWriteFontFile **fontfiles);

    UINT32 (STDMETHODCALLTYPE *GetIndex)(
        IDWriteFontFace4 *This);

    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
        IDWriteFontFace4 *This);

    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
        IDWriteFontFace4 *This);

    void (STDMETHODCALLTYPE *GetMetrics)(
        IDWriteFontFace4 *This,
        DWRITE_FONT_METRICS *metrics);

    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
        IDWriteFontFace4 *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,
        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)(
        IDWriteFontFace4 *This,
        FLOAT emSize,
        FLOAT pixels_per_dip,
        DWRITE_MEASURING_MODE mode,
        IDWriteRenderingParams *params,
        DWRITE_RENDERING_MODE *rendering_mode);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
        IDWriteFontFace4 *This,
        FLOAT emSize,
        FLOAT pixels_per_dip,
        const DWRITE_MATRIX *transform,
        DWRITE_FONT_METRICS *metrics);

    HRESULT (STDMETHODCALLTYPE *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);

    /*** IDWriteFontFace1 methods ***/
    void (STDMETHODCALLTYPE *IDWriteFontFace1_GetMetrics)(
        IDWriteFontFace4 *This,
        DWRITE_FONT_METRICS1 *metrics);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
        IDWriteFontFace4 *This,
        FLOAT em_size,
        FLOAT pixels_per_dip,
        const DWRITE_MATRIX *transform,
        DWRITE_FONT_METRICS1 *metrics);

    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,
        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 __WIDL_INLINE HRESULT IDWriteFontFace4_QueryInterface(IDWriteFontFace4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFace4_AddRef(IDWriteFontFace4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFace4_Release(IDWriteFontFace4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFace methods ***/
static __WIDL_INLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace4_GetType(IDWriteFontFace4* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace4_GetFiles(IDWriteFontFace4* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
}
static __WIDL_INLINE UINT32 IDWriteFontFace4_GetIndex(IDWriteFontFace4* This) {
    return This->lpVtbl->GetIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace4_GetSimulations(IDWriteFontFace4* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace4_IsSymbolFont(IDWriteFontFace4* This) {
    return This->lpVtbl->IsSymbolFont(This);
}
static __WIDL_INLINE UINT16 IDWriteFontFace4_GetGlyphCount(IDWriteFontFace4* This) {
    return This->lpVtbl->GetGlyphCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace4_GetGlyphIndices(IDWriteFontFace4* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace4_ReleaseFontTable(IDWriteFontFace4* This,void *table_context) {
    This->lpVtbl->ReleaseFontTable(This,table_context);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace4_GetMetrics(IDWriteFontFace4* This,DWRITE_FONT_METRICS1 *metrics) {
    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace4_GetCaretMetrics(IDWriteFontFace4* This,DWRITE_CARET_METRICS *metrics) {
    This->lpVtbl->GetCaretMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace4_GetUnicodeRanges(IDWriteFontFace4* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace4_IsMonospacedFont(IDWriteFontFace4* This) {
    return This->lpVtbl->IsMonospacedFont(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace4_GetKerningPairAdjustments(IDWriteFontFace4* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace4_HasKerningPairs(IDWriteFontFace4* This) {
    return This->lpVtbl->HasKerningPairs(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontFace4_HasVerticalGlyphVariants(IDWriteFontFace4* This) {
    return This->lpVtbl->HasVerticalGlyphVariants(This);
}
/*** IDWriteFontFace2 methods ***/
static __WIDL_INLINE WINBOOL IDWriteFontFace4_IsColorFont(IDWriteFontFace4* This) {
    return This->lpVtbl->IsColorFont(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace4_GetColorPaletteCount(IDWriteFontFace4* This) {
    return This->lpVtbl->GetColorPaletteCount(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace4_GetPaletteEntryCount(IDWriteFontFace4* This) {
    return This->lpVtbl->GetPaletteEntryCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace4_GetFontFaceReference(IDWriteFontFace4* This,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,reference);
}
static __WIDL_INLINE void IDWriteFontFace4_GetPanose(IDWriteFontFace4* This,DWRITE_PANOSE *panose) {
    This->lpVtbl->GetPanose(This,panose);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteFontFace4_GetWeight(IDWriteFontFace4* This) {
    return This->lpVtbl->GetWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteFontFace4_GetStretch(IDWriteFontFace4* This) {
    return This->lpVtbl->GetStretch(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteFontFace4_GetStyle(IDWriteFontFace4* This) {
    return This->lpVtbl->GetStyle(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace4_GetFamilyNames(IDWriteFontFace4* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFamilyNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace4_GetFaceNames(IDWriteFontFace4* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFaceNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace4_GetInformationalStrings(IDWriteFontFace4* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace4_HasCharacter(IDWriteFontFace4* This,UINT32 character) {
    return This->lpVtbl->HasCharacter(This,character);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontFace4_IsCharacterLocal(IDWriteFontFace4* This,UINT32 character) {
    return This->lpVtbl->IsCharacterLocal(This,character);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace4_IsGlyphLocal(IDWriteFontFace4* This,UINT16 glyph) {
    return This->lpVtbl->IsGlyphLocal(This,glyph);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace4_GetGlyphImageFormats(IDWriteFontFace4* This) {
    return This->lpVtbl->GetGlyphImageFormats(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace4_ReleaseGlyphImageData(IDWriteFontFace4* This,void *context) {
    This->lpVtbl->ReleaseGlyphImageData(This,context);
}
#endif
#endif

#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 __WIDL_INLINE HRESULT IDWriteFontFace5_QueryInterface(IDWriteFontFace5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFace5_AddRef(IDWriteFontFace5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFace5_Release(IDWriteFontFace5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFace methods ***/
static __WIDL_INLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace5_GetType(IDWriteFontFace5* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetFiles(IDWriteFontFace5* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
}
static __WIDL_INLINE UINT32 IDWriteFontFace5_GetIndex(IDWriteFontFace5* This) {
    return This->lpVtbl->GetIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace5_GetSimulations(IDWriteFontFace5* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_IsSymbolFont(IDWriteFontFace5* This) {
    return This->lpVtbl->IsSymbolFont(This);
}
static __WIDL_INLINE UINT16 IDWriteFontFace5_GetGlyphCount(IDWriteFontFace5* This) {
    return This->lpVtbl->GetGlyphCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace5_GetGlyphIndices(IDWriteFontFace5* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace5_ReleaseFontTable(IDWriteFontFace5* This,void *table_context) {
    This->lpVtbl->ReleaseFontTable(This,table_context);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace5_GetMetrics(IDWriteFontFace5* This,DWRITE_FONT_METRICS1 *metrics) {
    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace5_GetCaretMetrics(IDWriteFontFace5* This,DWRITE_CARET_METRICS *metrics) {
    This->lpVtbl->GetCaretMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetUnicodeRanges(IDWriteFontFace5* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_IsMonospacedFont(IDWriteFontFace5* This) {
    return This->lpVtbl->IsMonospacedFont(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace5_GetKerningPairAdjustments(IDWriteFontFace5* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_HasKerningPairs(IDWriteFontFace5* This) {
    return This->lpVtbl->HasKerningPairs(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontFace5_HasVerticalGlyphVariants(IDWriteFontFace5* This) {
    return This->lpVtbl->HasVerticalGlyphVariants(This);
}
/*** IDWriteFontFace2 methods ***/
static __WIDL_INLINE WINBOOL IDWriteFontFace5_IsColorFont(IDWriteFontFace5* This) {
    return This->lpVtbl->IsColorFont(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace5_GetColorPaletteCount(IDWriteFontFace5* This) {
    return This->lpVtbl->GetColorPaletteCount(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace5_GetPaletteEntryCount(IDWriteFontFace5* This) {
    return This->lpVtbl->GetPaletteEntryCount(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFontFace5_GetFontFaceReference(IDWriteFontFace5* This,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,reference);
}
static __WIDL_INLINE void IDWriteFontFace5_GetPanose(IDWriteFontFace5* This,DWRITE_PANOSE *panose) {
    This->lpVtbl->GetPanose(This,panose);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteFontFace5_GetWeight(IDWriteFontFace5* This) {
    return This->lpVtbl->GetWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteFontFace5_GetStretch(IDWriteFontFace5* This) {
    return This->lpVtbl->GetStretch(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteFontFace5_GetStyle(IDWriteFontFace5* This) {
    return This->lpVtbl->GetStyle(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetFamilyNames(IDWriteFontFace5* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFamilyNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetFaceNames(IDWriteFontFace5* This,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->GetFaceNames(This,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetInformationalStrings(IDWriteFontFace5* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_HasCharacter(IDWriteFontFace5* This,UINT32 character) {
    return This->lpVtbl->HasCharacter(This,character);
}
static __WIDL_INLINE 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 __WIDL_INLINE WINBOOL IDWriteFontFace5_IsCharacterLocal(IDWriteFontFace5* This,UINT32 character) {
    return This->lpVtbl->IsCharacterLocal(This,character);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_IsGlyphLocal(IDWriteFontFace5* This,UINT16 glyph) {
    return This->lpVtbl->IsGlyphLocal(This,glyph);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace5_GetGlyphImageFormats(IDWriteFontFace5* This) {
    return This->lpVtbl->GetGlyphImageFormats(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteFontFace5_ReleaseGlyphImageData(IDWriteFontFace5* This,void *context) {
    This->lpVtbl->ReleaseGlyphImageData(This,context);
}
/*** IDWriteFontFace5 methods ***/
static __WIDL_INLINE UINT32 IDWriteFontFace5_GetFontAxisValueCount(IDWriteFontFace5* This) {
    return This->lpVtbl->GetFontAxisValueCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetFontAxisValues(IDWriteFontFace5* This,DWRITE_FONT_AXIS_VALUE *values,UINT32 value_count) {
    return This->lpVtbl->GetFontAxisValues(This,values,value_count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_HasVariations(IDWriteFontFace5* This) {
    return This->lpVtbl->HasVariations(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace5_GetFontResource(IDWriteFontFace5* This,IDWriteFontResource **resource) {
    return This->lpVtbl->GetFontResource(This,resource);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace5_Equals(IDWriteFontFace5* This,IDWriteFontFace *fontface) {
    return This->lpVtbl->Equals(This,fontface);
}
#endif
#endif

#endif


#endif  /* __IDWriteFontFace5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDWriteFontFace6 interface
 */
#ifndef __IDWriteFontFace6_INTERFACE_DEFINED__
#define __IDWriteFontFace6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDWriteFontFace6, 0xc4b1fe1b, 0x6e84, 0x47d5, 0xb5,0x4c, 0xa5,0x97,0x98,0x1b,0x06,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c4b1fe1b-6e84-47d5-b54c-a597981b06ad")
IDWriteFontFace6 : public IDWriteFontFace5
{
    virtual HRESULT STDMETHODCALLTYPE GetFamilyNames(
        DWRITE_FONT_FAMILY_MODEL font_family_model,
        IDWriteLocalizedStrings **names) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFaceNames(
        DWRITE_FONT_FAMILY_MODEL font_family_model,
        IDWriteLocalizedStrings **names) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDWriteFontFace6, 0xc4b1fe1b, 0x6e84, 0x47d5, 0xb5,0x4c, 0xa5,0x97,0x98,0x1b,0x06,0xad)
#endif
#else
typedef struct IDWriteFontFace6Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDWriteFontFace6 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDWriteFontFace6 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDWriteFontFace6 *This);

    /*** IDWriteFontFace methods ***/
    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetFiles)(
        IDWriteFontFace6 *This,
        UINT32 *number_of_files,
        IDWriteFontFile **fontfiles);

    UINT32 (STDMETHODCALLTYPE *GetIndex)(
        IDWriteFontFace6 *This);

    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
        IDWriteFontFace6 *This);

    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
        IDWriteFontFace6 *This);

    void (STDMETHODCALLTYPE *GetMetrics)(
        IDWriteFontFace6 *This,
        DWRITE_FONT_METRICS *metrics);

    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
        IDWriteFontFace6 *This,
        const UINT16 *glyph_indices,
        UINT32 glyph_count,
        DWRITE_GLYPH_METRICS *metrics,
        WINBOOL is_sideways);

    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
        IDWriteFontFace6 *This,
        const UINT32 *codepoints,
        UINT32 count,
        UINT16 *glyph_indices);

    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
        IDWriteFontFace6 *This,
        UINT32 table_tag,
        const void **table_data,
        UINT32 *table_size,
        void **context,
        WINBOOL *exists);

    void (STDMETHODCALLTYPE *ReleaseFontTable)(
        IDWriteFontFace6 *This,
        void *table_context);

    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
        IDWriteFontFace6 *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)(
        IDWriteFontFace6 *This,
        FLOAT emSize,
        FLOAT pixels_per_dip,
        DWRITE_MEASURING_MODE mode,
        IDWriteRenderingParams *params,
        DWRITE_RENDERING_MODE *rendering_mode);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
        IDWriteFontFace6 *This,
        FLOAT emSize,
        FLOAT pixels_per_dip,
        const DWRITE_MATRIX *transform,
        DWRITE_FONT_METRICS *metrics);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
        IDWriteFontFace6 *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)(
        IDWriteFontFace6 *This,
        DWRITE_FONT_METRICS1 *metrics);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
        IDWriteFontFace6 *This,
        FLOAT em_size,
        FLOAT pixels_per_dip,
        const DWRITE_MATRIX *transform,
        DWRITE_FONT_METRICS1 *metrics);

    void (STDMETHODCALLTYPE *GetCaretMetrics)(
        IDWriteFontFace6 *This,
        DWRITE_CARET_METRICS *metrics);

    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
        IDWriteFontFace6 *This,
        UINT32 max_count,
        DWRITE_UNICODE_RANGE *ranges,
        UINT32 *count);

    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
        IDWriteFontFace6 *This,
        UINT32 glyph_count,
        const UINT16 *indices,
        INT32 *advances,
        WINBOOL is_sideways);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
        IDWriteFontFace6 *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)(
        IDWriteFontFace6 *This,
        UINT32 glyph_count,
        const UINT16 *indices,
        INT32 *adjustments);

    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
        IDWriteFontFace6 *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)(
        IDWriteFontFace6 *This,
        UINT32 glyph_count,
        const UINT16 *nominal_indices,
        UINT16 *vertical_indices);

    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
        IDWriteFontFace6 *This);

    /*** IDWriteFontFace2 methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
        IDWriteFontFace6 *This);

    UINT32 (STDMETHODCALLTYPE *GetColorPaletteCount)(
        IDWriteFontFace6 *This);

    UINT32 (STDMETHODCALLTYPE *GetPaletteEntryCount)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetPaletteEntries)(
        IDWriteFontFace6 *This,
        UINT32 palette_index,
        UINT32 first_entry_index,
        UINT32 entry_count,
        DWRITE_COLOR_F *entries);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace2_GetRecommendedRenderingMode)(
        IDWriteFontFace6 *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)(
        IDWriteFontFace6 *This,
        IDWriteFontFaceReference **reference);

    void (STDMETHODCALLTYPE *GetPanose)(
        IDWriteFontFace6 *This,
        DWRITE_PANOSE *panose);

    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
        IDWriteFontFace6 *This);

    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
        IDWriteFontFace6 *This);

    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
        IDWriteFontFace6 *This,
        IDWriteLocalizedStrings **names);

    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
        IDWriteFontFace6 *This,
        IDWriteLocalizedStrings **names);

    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
        IDWriteFontFace6 *This,
        DWRITE_INFORMATIONAL_STRING_ID stringid,
        IDWriteLocalizedStrings **strings,
        WINBOOL *exists);

    WINBOOL (STDMETHODCALLTYPE *HasCharacter)(
        IDWriteFontFace6 *This,
        UINT32 character);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace3_GetRecommendedRenderingMode)(
        IDWriteFontFace6 *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)(
        IDWriteFontFace6 *This,
        UINT32 character);

    WINBOOL (STDMETHODCALLTYPE *IsGlyphLocal)(
        IDWriteFontFace6 *This,
        UINT16 glyph);

    HRESULT (STDMETHODCALLTYPE *AreCharactersLocal)(
        IDWriteFontFace6 *This,
        const WCHAR *characters,
        UINT32 count,
        WINBOOL enqueue_if_not,
        WINBOOL *are_local);

    HRESULT (STDMETHODCALLTYPE *AreGlyphsLocal)(
        IDWriteFontFace6 *This,
        const UINT16 *glyphs,
        UINT32 count,
        WINBOOL enqueue_if_not,
        WINBOOL *are_local);

    /*** IDWriteFontFace4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)(
        IDWriteFontFace6 *This,
        UINT16 glyph,
        UINT32 ppem_first,
        UINT32 ppem_last,
        DWRITE_GLYPH_IMAGE_FORMATS *formats);

    DWRITE_GLYPH_IMAGE_FORMATS (STDMETHODCALLTYPE *GetGlyphImageFormats)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetGlyphImageData)(
        IDWriteFontFace6 *This,
        UINT16 glyph,
        UINT32 ppem,
        DWRITE_GLYPH_IMAGE_FORMATS format,
        DWRITE_GLYPH_IMAGE_DATA *data,
        void **context);

    void (STDMETHODCALLTYPE *ReleaseGlyphImageData)(
        IDWriteFontFace6 *This,
        void *context);

    /*** IDWriteFontFace5 methods ***/
    UINT32 (STDMETHODCALLTYPE *GetFontAxisValueCount)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetFontAxisValues)(
        IDWriteFontFace6 *This,
        DWRITE_FONT_AXIS_VALUE *values,
        UINT32 value_count);

    WINBOOL (STDMETHODCALLTYPE *HasVariations)(
        IDWriteFontFace6 *This);

    HRESULT (STDMETHODCALLTYPE *GetFontResource)(
        IDWriteFontFace6 *This,
        IDWriteFontResource **resource);

    WINBOOL (STDMETHODCALLTYPE *Equals)(
        IDWriteFontFace6 *This,
        IDWriteFontFace *fontface);

    /*** IDWriteFontFace6 methods ***/
    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace6_GetFamilyNames)(
        IDWriteFontFace6 *This,
        DWRITE_FONT_FAMILY_MODEL font_family_model,
        IDWriteLocalizedStrings **names);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace6_GetFaceNames)(
        IDWriteFontFace6 *This,
        DWRITE_FONT_FAMILY_MODEL font_family_model,
        IDWriteLocalizedStrings **names);

    END_INTERFACE
} IDWriteFontFace6Vtbl;

interface IDWriteFontFace6 {
    CONST_VTBL IDWriteFontFace6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDWriteFontFace6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDWriteFontFace6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDWriteFontFace6_Release(This) (This)->lpVtbl->Release(This)
/*** IDWriteFontFace methods ***/
#define IDWriteFontFace6_GetType(This) (This)->lpVtbl->GetType(This)
#define IDWriteFontFace6_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
#define IDWriteFontFace6_GetIndex(This) (This)->lpVtbl->GetIndex(This)
#define IDWriteFontFace6_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
#define IDWriteFontFace6_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
#define IDWriteFontFace6_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
#define IDWriteFontFace6_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
#define IDWriteFontFace6_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
#define IDWriteFontFace6_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
#define IDWriteFontFace6_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
#define IDWriteFontFace6_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 IDWriteFontFace6_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 IDWriteFontFace6_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
#define IDWriteFontFace6_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
#define IDWriteFontFace6_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
#define IDWriteFontFace6_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
#define IDWriteFontFace6_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
#define IDWriteFontFace6_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
#define IDWriteFontFace6_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 IDWriteFontFace6_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
#define IDWriteFontFace6_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
#define IDWriteFontFace6_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
#define IDWriteFontFace6_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
/*** IDWriteFontFace2 methods ***/
#define IDWriteFontFace6_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
#define IDWriteFontFace6_GetColorPaletteCount(This) (This)->lpVtbl->GetColorPaletteCount(This)
#define IDWriteFontFace6_GetPaletteEntryCount(This) (This)->lpVtbl->GetPaletteEntryCount(This)
#define IDWriteFontFace6_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 IDWriteFontFace6_GetFontFaceReference(This,reference) (This)->lpVtbl->GetFontFaceReference(This,reference)
#define IDWriteFontFace6_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
#define IDWriteFontFace6_GetWeight(This) (This)->lpVtbl->GetWeight(This)
#define IDWriteFontFace6_GetStretch(This) (This)->lpVtbl->GetStretch(This)
#define IDWriteFontFace6_GetStyle(This) (This)->lpVtbl->GetStyle(This)
#define IDWriteFontFace6_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
#define IDWriteFontFace6_HasCharacter(This,character) (This)->lpVtbl->HasCharacter(This,character)
#define IDWriteFontFace6_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 IDWriteFontFace6_IsCharacterLocal(This,character) (This)->lpVtbl->IsCharacterLocal(This,character)
#define IDWriteFontFace6_IsGlyphLocal(This,glyph) (This)->lpVtbl->IsGlyphLocal(This,glyph)
#define IDWriteFontFace6_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
#define IDWriteFontFace6_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
/*** IDWriteFontFace4 methods ***/
#define IDWriteFontFace6_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats)
#define IDWriteFontFace6_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This)
#define IDWriteFontFace6_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context)
#define IDWriteFontFace6_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context)
/*** IDWriteFontFace5 methods ***/
#define IDWriteFontFace6_GetFontAxisValueCount(This) (This)->lpVtbl->GetFontAxisValueCount(This)
#define IDWriteFontFace6_GetFontAxisValues(This,values,value_count) (This)->lpVtbl->GetFontAxisValues(This,values,value_count)
#define IDWriteFontFace6_HasVariations(This) (This)->lpVtbl->HasVariations(This)
#define IDWriteFontFace6_GetFontResource(This,resource) (This)->lpVtbl->GetFontResource(This,resource)
#define IDWriteFontFace6_Equals(This,fontface) (This)->lpVtbl->Equals(This,fontface)
/*** IDWriteFontFace6 methods ***/
#define IDWriteFontFace6_GetFamilyNames(This,font_family_model,names) (This)->lpVtbl->IDWriteFontFace6_GetFamilyNames(This,font_family_model,names)
#define IDWriteFontFace6_GetFaceNames(This,font_family_model,names) (This)->lpVtbl->IDWriteFontFace6_GetFaceNames(This,font_family_model,names)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFace6_QueryInterface(IDWriteFontFace6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFace6_AddRef(IDWriteFontFace6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFace6_Release(IDWriteFontFace6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFace methods ***/
static __WIDL_INLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace6_GetType(IDWriteFontFace6* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetFiles(IDWriteFontFace6* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
}
static __WIDL_INLINE UINT32 IDWriteFontFace6_GetIndex(IDWriteFontFace6* This) {
    return This->lpVtbl->GetIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace6_GetSimulations(IDWriteFontFace6* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_IsSymbolFont(IDWriteFontFace6* This) {
    return This->lpVtbl->IsSymbolFont(This);
}
static __WIDL_INLINE UINT16 IDWriteFontFace6_GetGlyphCount(IDWriteFontFace6* This) {
    return This->lpVtbl->GetGlyphCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetDesignGlyphMetrics(IDWriteFontFace6* 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 __WIDL_INLINE HRESULT IDWriteFontFace6_GetGlyphIndices(IDWriteFontFace6* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_TryGetFontTable(IDWriteFontFace6* 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 __WIDL_INLINE void IDWriteFontFace6_ReleaseFontTable(IDWriteFontFace6* This,void *table_context) {
    This->lpVtbl->ReleaseFontTable(This,table_context);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetGlyphRunOutline(IDWriteFontFace6* 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 __WIDL_INLINE HRESULT IDWriteFontFace6_GetGdiCompatibleGlyphMetrics(IDWriteFontFace6* 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 __WIDL_INLINE void IDWriteFontFace6_GetMetrics(IDWriteFontFace6* This,DWRITE_FONT_METRICS1 *metrics) {
    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetGdiCompatibleMetrics(IDWriteFontFace6* 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 __WIDL_INLINE void IDWriteFontFace6_GetCaretMetrics(IDWriteFontFace6* This,DWRITE_CARET_METRICS *metrics) {
    This->lpVtbl->GetCaretMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetUnicodeRanges(IDWriteFontFace6* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_IsMonospacedFont(IDWriteFontFace6* This) {
    return This->lpVtbl->IsMonospacedFont(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetDesignGlyphAdvances(IDWriteFontFace6* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetGdiCompatibleGlyphAdvances(IDWriteFontFace6* 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 __WIDL_INLINE HRESULT IDWriteFontFace6_GetKerningPairAdjustments(IDWriteFontFace6* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_HasKerningPairs(IDWriteFontFace6* This) {
    return This->lpVtbl->HasKerningPairs(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetVerticalGlyphVariants(IDWriteFontFace6* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_HasVerticalGlyphVariants(IDWriteFontFace6* This) {
    return This->lpVtbl->HasVerticalGlyphVariants(This);
}
/*** IDWriteFontFace2 methods ***/
static __WIDL_INLINE WINBOOL IDWriteFontFace6_IsColorFont(IDWriteFontFace6* This) {
    return This->lpVtbl->IsColorFont(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace6_GetColorPaletteCount(IDWriteFontFace6* This) {
    return This->lpVtbl->GetColorPaletteCount(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace6_GetPaletteEntryCount(IDWriteFontFace6* This) {
    return This->lpVtbl->GetPaletteEntryCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetPaletteEntries(IDWriteFontFace6* 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 __WIDL_INLINE HRESULT IDWriteFontFace6_GetFontFaceReference(IDWriteFontFace6* This,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,reference);
}
static __WIDL_INLINE void IDWriteFontFace6_GetPanose(IDWriteFontFace6* This,DWRITE_PANOSE *panose) {
    This->lpVtbl->GetPanose(This,panose);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteFontFace6_GetWeight(IDWriteFontFace6* This) {
    return This->lpVtbl->GetWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteFontFace6_GetStretch(IDWriteFontFace6* This) {
    return This->lpVtbl->GetStretch(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteFontFace6_GetStyle(IDWriteFontFace6* This) {
    return This->lpVtbl->GetStyle(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetInformationalStrings(IDWriteFontFace6* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_HasCharacter(IDWriteFontFace6* This,UINT32 character) {
    return This->lpVtbl->HasCharacter(This,character);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetRecommendedRenderingMode(IDWriteFontFace6* 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 __WIDL_INLINE WINBOOL IDWriteFontFace6_IsCharacterLocal(IDWriteFontFace6* This,UINT32 character) {
    return This->lpVtbl->IsCharacterLocal(This,character);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_IsGlyphLocal(IDWriteFontFace6* This,UINT16 glyph) {
    return This->lpVtbl->IsGlyphLocal(This,glyph);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_AreCharactersLocal(IDWriteFontFace6* 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 __WIDL_INLINE HRESULT IDWriteFontFace6_AreGlyphsLocal(IDWriteFontFace6* 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 __WIDL_INLINE HRESULT IDWriteFontFace6_GetGlyphImageFormats_(IDWriteFontFace6* 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 __WIDL_INLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace6_GetGlyphImageFormats(IDWriteFontFace6* This) {
    return This->lpVtbl->GetGlyphImageFormats(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetGlyphImageData(IDWriteFontFace6* 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 __WIDL_INLINE void IDWriteFontFace6_ReleaseGlyphImageData(IDWriteFontFace6* This,void *context) {
    This->lpVtbl->ReleaseGlyphImageData(This,context);
}
/*** IDWriteFontFace5 methods ***/
static __WIDL_INLINE UINT32 IDWriteFontFace6_GetFontAxisValueCount(IDWriteFontFace6* This) {
    return This->lpVtbl->GetFontAxisValueCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetFontAxisValues(IDWriteFontFace6* This,DWRITE_FONT_AXIS_VALUE *values,UINT32 value_count) {
    return This->lpVtbl->GetFontAxisValues(This,values,value_count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_HasVariations(IDWriteFontFace6* This) {
    return This->lpVtbl->HasVariations(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetFontResource(IDWriteFontFace6* This,IDWriteFontResource **resource) {
    return This->lpVtbl->GetFontResource(This,resource);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace6_Equals(IDWriteFontFace6* This,IDWriteFontFace *fontface) {
    return This->lpVtbl->Equals(This,fontface);
}
/*** IDWriteFontFace6 methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetFamilyNames(IDWriteFontFace6* This,DWRITE_FONT_FAMILY_MODEL font_family_model,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->IDWriteFontFace6_GetFamilyNames(This,font_family_model,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace6_GetFaceNames(IDWriteFontFace6* This,DWRITE_FONT_FAMILY_MODEL font_family_model,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->IDWriteFontFace6_GetFaceNames(This,font_family_model,names);
}
#endif
#endif

#endif


#endif  /* __IDWriteFontFace6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDWritePaintReader interface
 */
#ifndef __IDWritePaintReader_INTERFACE_DEFINED__
#define __IDWritePaintReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDWritePaintReader, 0x8128e912, 0x3b97, 0x42a5, 0xab,0x6c, 0x24,0xaa,0xd3,0xa8,0x6e,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8128e912-3b97-42a5-ab6c-24aad3a86e54")
IDWritePaintReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetCurrentGlyph(
        UINT32 glyph_index,
        DWRITE_PAINT_ELEMENT *paint_element,
        UINT32 struct_size,
        D2D_RECT_F *clip_box,
        DWRITE_PAINT_ATTRIBUTES *glyph_attributes = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTextColor(
        const DWRITE_COLOR_F *text_color) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColorPaletteIndex(
        UINT32 color_palette_index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCustomColorPalette(
        const DWRITE_COLOR_F *palette_entries,
        UINT32 palette_entry_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToFirstChild(
        DWRITE_PAINT_ELEMENT *paint_element,
        UINT32 struct_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToNextSibling(
        DWRITE_PAINT_ELEMENT *paint_element,
        UINT32 struct_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToParent(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGradientStops(
        UINT32 first_gradient_stop_index,
        UINT32 gradient_stop_count,
        D2D1_GRADIENT_STOP *gradient_stops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGradientStopColors(
        UINT32 first_gradient_stop_index,
        UINT32 gradient_stop_count,
        DWRITE_PAINT_COLOR *gradient_stop_colors) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDWritePaintReader, 0x8128e912, 0x3b97, 0x42a5, 0xab,0x6c, 0x24,0xaa,0xd3,0xa8,0x6e,0x54)
#endif
#else
typedef struct IDWritePaintReaderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDWritePaintReader *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDWritePaintReader *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDWritePaintReader *This);

    /*** IDWritePaintReader methods ***/
    HRESULT (STDMETHODCALLTYPE *SetCurrentGlyph)(
        IDWritePaintReader *This,
        UINT32 glyph_index,
        DWRITE_PAINT_ELEMENT *paint_element,
        UINT32 struct_size,
        D2D_RECT_F *clip_box,
        DWRITE_PAINT_ATTRIBUTES *glyph_attributes);

    HRESULT (STDMETHODCALLTYPE *SetTextColor)(
        IDWritePaintReader *This,
        const DWRITE_COLOR_F *text_color);

    HRESULT (STDMETHODCALLTYPE *SetColorPaletteIndex)(
        IDWritePaintReader *This,
        UINT32 color_palette_index);

    HRESULT (STDMETHODCALLTYPE *SetCustomColorPalette)(
        IDWritePaintReader *This,
        const DWRITE_COLOR_F *palette_entries,
        UINT32 palette_entry_count);

    HRESULT (STDMETHODCALLTYPE *MoveToFirstChild)(
        IDWritePaintReader *This,
        DWRITE_PAINT_ELEMENT *paint_element,
        UINT32 struct_size);

    HRESULT (STDMETHODCALLTYPE *MoveToNextSibling)(
        IDWritePaintReader *This,
        DWRITE_PAINT_ELEMENT *paint_element,
        UINT32 struct_size);

    HRESULT (STDMETHODCALLTYPE *MoveToParent)(
        IDWritePaintReader *This);

    HRESULT (STDMETHODCALLTYPE *GetGradientStops)(
        IDWritePaintReader *This,
        UINT32 first_gradient_stop_index,
        UINT32 gradient_stop_count,
        D2D1_GRADIENT_STOP *gradient_stops);

    HRESULT (STDMETHODCALLTYPE *GetGradientStopColors)(
        IDWritePaintReader *This,
        UINT32 first_gradient_stop_index,
        UINT32 gradient_stop_count,
        DWRITE_PAINT_COLOR *gradient_stop_colors);

    END_INTERFACE
} IDWritePaintReaderVtbl;

interface IDWritePaintReader {
    CONST_VTBL IDWritePaintReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDWritePaintReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDWritePaintReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDWritePaintReader_Release(This) (This)->lpVtbl->Release(This)
/*** IDWritePaintReader methods ***/
#define IDWritePaintReader_SetCurrentGlyph(This,glyph_index,paint_element,struct_size,clip_box,glyph_attributes) (This)->lpVtbl->SetCurrentGlyph(This,glyph_index,paint_element,struct_size,clip_box,glyph_attributes)
#define IDWritePaintReader_SetTextColor(This,text_color) (This)->lpVtbl->SetTextColor(This,text_color)
#define IDWritePaintReader_SetColorPaletteIndex(This,color_palette_index) (This)->lpVtbl->SetColorPaletteIndex(This,color_palette_index)
#define IDWritePaintReader_SetCustomColorPalette(This,palette_entries,palette_entry_count) (This)->lpVtbl->SetCustomColorPalette(This,palette_entries,palette_entry_count)
#define IDWritePaintReader_MoveToFirstChild(This,paint_element,struct_size) (This)->lpVtbl->MoveToFirstChild(This,paint_element,struct_size)
#define IDWritePaintReader_MoveToNextSibling(This,paint_element,struct_size) (This)->lpVtbl->MoveToNextSibling(This,paint_element,struct_size)
#define IDWritePaintReader_MoveToParent(This) (This)->lpVtbl->MoveToParent(This)
#define IDWritePaintReader_GetGradientStops(This,first_gradient_stop_index,gradient_stop_count,gradient_stops) (This)->lpVtbl->GetGradientStops(This,first_gradient_stop_index,gradient_stop_count,gradient_stops)
#define IDWritePaintReader_GetGradientStopColors(This,first_gradient_stop_index,gradient_stop_count,gradient_stop_colors) (This)->lpVtbl->GetGradientStopColors(This,first_gradient_stop_index,gradient_stop_count,gradient_stop_colors)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDWritePaintReader_QueryInterface(IDWritePaintReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWritePaintReader_AddRef(IDWritePaintReader* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWritePaintReader_Release(IDWritePaintReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWritePaintReader methods ***/
static __WIDL_INLINE HRESULT IDWritePaintReader_SetCurrentGlyph(IDWritePaintReader* This,UINT32 glyph_index,DWRITE_PAINT_ELEMENT *paint_element,UINT32 struct_size,D2D_RECT_F *clip_box,DWRITE_PAINT_ATTRIBUTES *glyph_attributes) {
    return This->lpVtbl->SetCurrentGlyph(This,glyph_index,paint_element,struct_size,clip_box,glyph_attributes);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_SetTextColor(IDWritePaintReader* This,const DWRITE_COLOR_F *text_color) {
    return This->lpVtbl->SetTextColor(This,text_color);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_SetColorPaletteIndex(IDWritePaintReader* This,UINT32 color_palette_index) {
    return This->lpVtbl->SetColorPaletteIndex(This,color_palette_index);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_SetCustomColorPalette(IDWritePaintReader* This,const DWRITE_COLOR_F *palette_entries,UINT32 palette_entry_count) {
    return This->lpVtbl->SetCustomColorPalette(This,palette_entries,palette_entry_count);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_MoveToFirstChild(IDWritePaintReader* This,DWRITE_PAINT_ELEMENT *paint_element,UINT32 struct_size) {
    return This->lpVtbl->MoveToFirstChild(This,paint_element,struct_size);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_MoveToNextSibling(IDWritePaintReader* This,DWRITE_PAINT_ELEMENT *paint_element,UINT32 struct_size) {
    return This->lpVtbl->MoveToNextSibling(This,paint_element,struct_size);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_MoveToParent(IDWritePaintReader* This) {
    return This->lpVtbl->MoveToParent(This);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_GetGradientStops(IDWritePaintReader* This,UINT32 first_gradient_stop_index,UINT32 gradient_stop_count,D2D1_GRADIENT_STOP *gradient_stops) {
    return This->lpVtbl->GetGradientStops(This,first_gradient_stop_index,gradient_stop_count,gradient_stops);
}
static __WIDL_INLINE HRESULT IDWritePaintReader_GetGradientStopColors(IDWritePaintReader* This,UINT32 first_gradient_stop_index,UINT32 gradient_stop_count,DWRITE_PAINT_COLOR *gradient_stop_colors) {
    return This->lpVtbl->GetGradientStopColors(This,first_gradient_stop_index,gradient_stop_count,gradient_stop_colors);
}
#endif
#endif

#endif


#endif  /* __IDWritePaintReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDWriteFontFace7 interface
 */
#ifndef __IDWriteFontFace7_INTERFACE_DEFINED__
#define __IDWriteFontFace7_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDWriteFontFace7, 0x3945b85b, 0xbc95, 0x40f7, 0xb7,0x2c, 0x8b,0x73,0xbf,0xc7,0xe1,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3945b85b-bc95-40f7-b72c-8b73bfc7e13b")
IDWriteFontFace7 : public IDWriteFontFace6
{
    virtual DWRITE_PAINT_FEATURE_LEVEL STDMETHODCALLTYPE GetPaintFeatureLevel(
        DWRITE_GLYPH_IMAGE_FORMATS glyph_image_format) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePaintReader(
        DWRITE_GLYPH_IMAGE_FORMATS glyph_image_format,
        DWRITE_PAINT_FEATURE_LEVEL paint_feature_level,
        IDWritePaintReader **paint_reader) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDWriteFontFace7, 0x3945b85b, 0xbc95, 0x40f7, 0xb7,0x2c, 0x8b,0x73,0xbf,0xc7,0xe1,0x3b)
#endif
#else
typedef struct IDWriteFontFace7Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDWriteFontFace7 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDWriteFontFace7 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDWriteFontFace7 *This);

    /*** IDWriteFontFace methods ***/
    DWRITE_FONT_FACE_TYPE (STDMETHODCALLTYPE *GetType)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetFiles)(
        IDWriteFontFace7 *This,
        UINT32 *number_of_files,
        IDWriteFontFile **fontfiles);

    UINT32 (STDMETHODCALLTYPE *GetIndex)(
        IDWriteFontFace7 *This);

    DWRITE_FONT_SIMULATIONS (STDMETHODCALLTYPE *GetSimulations)(
        IDWriteFontFace7 *This);

    WINBOOL (STDMETHODCALLTYPE *IsSymbolFont)(
        IDWriteFontFace7 *This);

    void (STDMETHODCALLTYPE *GetMetrics)(
        IDWriteFontFace7 *This,
        DWRITE_FONT_METRICS *metrics);

    UINT16 (STDMETHODCALLTYPE *GetGlyphCount)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphMetrics)(
        IDWriteFontFace7 *This,
        const UINT16 *glyph_indices,
        UINT32 glyph_count,
        DWRITE_GLYPH_METRICS *metrics,
        WINBOOL is_sideways);

    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
        IDWriteFontFace7 *This,
        const UINT32 *codepoints,
        UINT32 count,
        UINT16 *glyph_indices);

    HRESULT (STDMETHODCALLTYPE *TryGetFontTable)(
        IDWriteFontFace7 *This,
        UINT32 table_tag,
        const void **table_data,
        UINT32 *table_size,
        void **context,
        WINBOOL *exists);

    void (STDMETHODCALLTYPE *ReleaseFontTable)(
        IDWriteFontFace7 *This,
        void *table_context);

    HRESULT (STDMETHODCALLTYPE *GetGlyphRunOutline)(
        IDWriteFontFace7 *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)(
        IDWriteFontFace7 *This,
        FLOAT emSize,
        FLOAT pixels_per_dip,
        DWRITE_MEASURING_MODE mode,
        IDWriteRenderingParams *params,
        DWRITE_RENDERING_MODE *rendering_mode);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleMetrics)(
        IDWriteFontFace7 *This,
        FLOAT emSize,
        FLOAT pixels_per_dip,
        const DWRITE_MATRIX *transform,
        DWRITE_FONT_METRICS *metrics);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphMetrics)(
        IDWriteFontFace7 *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)(
        IDWriteFontFace7 *This,
        DWRITE_FONT_METRICS1 *metrics);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetGdiCompatibleMetrics)(
        IDWriteFontFace7 *This,
        FLOAT em_size,
        FLOAT pixels_per_dip,
        const DWRITE_MATRIX *transform,
        DWRITE_FONT_METRICS1 *metrics);

    void (STDMETHODCALLTYPE *GetCaretMetrics)(
        IDWriteFontFace7 *This,
        DWRITE_CARET_METRICS *metrics);

    HRESULT (STDMETHODCALLTYPE *GetUnicodeRanges)(
        IDWriteFontFace7 *This,
        UINT32 max_count,
        DWRITE_UNICODE_RANGE *ranges,
        UINT32 *count);

    WINBOOL (STDMETHODCALLTYPE *IsMonospacedFont)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetDesignGlyphAdvances)(
        IDWriteFontFace7 *This,
        UINT32 glyph_count,
        const UINT16 *indices,
        INT32 *advances,
        WINBOOL is_sideways);

    HRESULT (STDMETHODCALLTYPE *GetGdiCompatibleGlyphAdvances)(
        IDWriteFontFace7 *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)(
        IDWriteFontFace7 *This,
        UINT32 glyph_count,
        const UINT16 *indices,
        INT32 *adjustments);

    WINBOOL (STDMETHODCALLTYPE *HasKerningPairs)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace1_GetRecommendedRenderingMode)(
        IDWriteFontFace7 *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)(
        IDWriteFontFace7 *This,
        UINT32 glyph_count,
        const UINT16 *nominal_indices,
        UINT16 *vertical_indices);

    WINBOOL (STDMETHODCALLTYPE *HasVerticalGlyphVariants)(
        IDWriteFontFace7 *This);

    /*** IDWriteFontFace2 methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsColorFont)(
        IDWriteFontFace7 *This);

    UINT32 (STDMETHODCALLTYPE *GetColorPaletteCount)(
        IDWriteFontFace7 *This);

    UINT32 (STDMETHODCALLTYPE *GetPaletteEntryCount)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetPaletteEntries)(
        IDWriteFontFace7 *This,
        UINT32 palette_index,
        UINT32 first_entry_index,
        UINT32 entry_count,
        DWRITE_COLOR_F *entries);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace2_GetRecommendedRenderingMode)(
        IDWriteFontFace7 *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)(
        IDWriteFontFace7 *This,
        IDWriteFontFaceReference **reference);

    void (STDMETHODCALLTYPE *GetPanose)(
        IDWriteFontFace7 *This,
        DWRITE_PANOSE *panose);

    DWRITE_FONT_WEIGHT (STDMETHODCALLTYPE *GetWeight)(
        IDWriteFontFace7 *This);

    DWRITE_FONT_STRETCH (STDMETHODCALLTYPE *GetStretch)(
        IDWriteFontFace7 *This);

    DWRITE_FONT_STYLE (STDMETHODCALLTYPE *GetStyle)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetFamilyNames)(
        IDWriteFontFace7 *This,
        IDWriteLocalizedStrings **names);

    HRESULT (STDMETHODCALLTYPE *GetFaceNames)(
        IDWriteFontFace7 *This,
        IDWriteLocalizedStrings **names);

    HRESULT (STDMETHODCALLTYPE *GetInformationalStrings)(
        IDWriteFontFace7 *This,
        DWRITE_INFORMATIONAL_STRING_ID stringid,
        IDWriteLocalizedStrings **strings,
        WINBOOL *exists);

    WINBOOL (STDMETHODCALLTYPE *HasCharacter)(
        IDWriteFontFace7 *This,
        UINT32 character);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace3_GetRecommendedRenderingMode)(
        IDWriteFontFace7 *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)(
        IDWriteFontFace7 *This,
        UINT32 character);

    WINBOOL (STDMETHODCALLTYPE *IsGlyphLocal)(
        IDWriteFontFace7 *This,
        UINT16 glyph);

    HRESULT (STDMETHODCALLTYPE *AreCharactersLocal)(
        IDWriteFontFace7 *This,
        const WCHAR *characters,
        UINT32 count,
        WINBOOL enqueue_if_not,
        WINBOOL *are_local);

    HRESULT (STDMETHODCALLTYPE *AreGlyphsLocal)(
        IDWriteFontFace7 *This,
        const UINT16 *glyphs,
        UINT32 count,
        WINBOOL enqueue_if_not,
        WINBOOL *are_local);

    /*** IDWriteFontFace4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)(
        IDWriteFontFace7 *This,
        UINT16 glyph,
        UINT32 ppem_first,
        UINT32 ppem_last,
        DWRITE_GLYPH_IMAGE_FORMATS *formats);

    DWRITE_GLYPH_IMAGE_FORMATS (STDMETHODCALLTYPE *GetGlyphImageFormats)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetGlyphImageData)(
        IDWriteFontFace7 *This,
        UINT16 glyph,
        UINT32 ppem,
        DWRITE_GLYPH_IMAGE_FORMATS format,
        DWRITE_GLYPH_IMAGE_DATA *data,
        void **context);

    void (STDMETHODCALLTYPE *ReleaseGlyphImageData)(
        IDWriteFontFace7 *This,
        void *context);

    /*** IDWriteFontFace5 methods ***/
    UINT32 (STDMETHODCALLTYPE *GetFontAxisValueCount)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetFontAxisValues)(
        IDWriteFontFace7 *This,
        DWRITE_FONT_AXIS_VALUE *values,
        UINT32 value_count);

    WINBOOL (STDMETHODCALLTYPE *HasVariations)(
        IDWriteFontFace7 *This);

    HRESULT (STDMETHODCALLTYPE *GetFontResource)(
        IDWriteFontFace7 *This,
        IDWriteFontResource **resource);

    WINBOOL (STDMETHODCALLTYPE *Equals)(
        IDWriteFontFace7 *This,
        IDWriteFontFace *fontface);

    /*** IDWriteFontFace6 methods ***/
    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace6_GetFamilyNames)(
        IDWriteFontFace7 *This,
        DWRITE_FONT_FAMILY_MODEL font_family_model,
        IDWriteLocalizedStrings **names);

    HRESULT (STDMETHODCALLTYPE *IDWriteFontFace6_GetFaceNames)(
        IDWriteFontFace7 *This,
        DWRITE_FONT_FAMILY_MODEL font_family_model,
        IDWriteLocalizedStrings **names);

    /*** IDWriteFontFace7 methods ***/
    DWRITE_PAINT_FEATURE_LEVEL (STDMETHODCALLTYPE *GetPaintFeatureLevel)(
        IDWriteFontFace7 *This,
        DWRITE_GLYPH_IMAGE_FORMATS glyph_image_format);

    HRESULT (STDMETHODCALLTYPE *CreatePaintReader)(
        IDWriteFontFace7 *This,
        DWRITE_GLYPH_IMAGE_FORMATS glyph_image_format,
        DWRITE_PAINT_FEATURE_LEVEL paint_feature_level,
        IDWritePaintReader **paint_reader);

    END_INTERFACE
} IDWriteFontFace7Vtbl;

interface IDWriteFontFace7 {
    CONST_VTBL IDWriteFontFace7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDWriteFontFace7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDWriteFontFace7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDWriteFontFace7_Release(This) (This)->lpVtbl->Release(This)
/*** IDWriteFontFace methods ***/
#define IDWriteFontFace7_GetType(This) (This)->lpVtbl->GetType(This)
#define IDWriteFontFace7_GetFiles(This,number_of_files,fontfiles) (This)->lpVtbl->GetFiles(This,number_of_files,fontfiles)
#define IDWriteFontFace7_GetIndex(This) (This)->lpVtbl->GetIndex(This)
#define IDWriteFontFace7_GetSimulations(This) (This)->lpVtbl->GetSimulations(This)
#define IDWriteFontFace7_IsSymbolFont(This) (This)->lpVtbl->IsSymbolFont(This)
#define IDWriteFontFace7_GetGlyphCount(This) (This)->lpVtbl->GetGlyphCount(This)
#define IDWriteFontFace7_GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways) (This)->lpVtbl->GetDesignGlyphMetrics(This,glyph_indices,glyph_count,metrics,is_sideways)
#define IDWriteFontFace7_GetGlyphIndices(This,codepoints,count,glyph_indices) (This)->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices)
#define IDWriteFontFace7_TryGetFontTable(This,table_tag,table_data,table_size,context,exists) (This)->lpVtbl->TryGetFontTable(This,table_tag,table_data,table_size,context,exists)
#define IDWriteFontFace7_ReleaseFontTable(This,table_context) (This)->lpVtbl->ReleaseFontTable(This,table_context)
#define IDWriteFontFace7_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 IDWriteFontFace7_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 IDWriteFontFace7_GetMetrics(This,metrics) (This)->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics)
#define IDWriteFontFace7_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics) (This)->lpVtbl->IDWriteFontFace1_GetGdiCompatibleMetrics(This,em_size,pixels_per_dip,transform,metrics)
#define IDWriteFontFace7_GetCaretMetrics(This,metrics) (This)->lpVtbl->GetCaretMetrics(This,metrics)
#define IDWriteFontFace7_GetUnicodeRanges(This,max_count,ranges,count) (This)->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count)
#define IDWriteFontFace7_IsMonospacedFont(This) (This)->lpVtbl->IsMonospacedFont(This)
#define IDWriteFontFace7_GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways) (This)->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways)
#define IDWriteFontFace7_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 IDWriteFontFace7_GetKerningPairAdjustments(This,glyph_count,indices,adjustments) (This)->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments)
#define IDWriteFontFace7_HasKerningPairs(This) (This)->lpVtbl->HasKerningPairs(This)
#define IDWriteFontFace7_GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices) (This)->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices)
#define IDWriteFontFace7_HasVerticalGlyphVariants(This) (This)->lpVtbl->HasVerticalGlyphVariants(This)
/*** IDWriteFontFace2 methods ***/
#define IDWriteFontFace7_IsColorFont(This) (This)->lpVtbl->IsColorFont(This)
#define IDWriteFontFace7_GetColorPaletteCount(This) (This)->lpVtbl->GetColorPaletteCount(This)
#define IDWriteFontFace7_GetPaletteEntryCount(This) (This)->lpVtbl->GetPaletteEntryCount(This)
#define IDWriteFontFace7_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 IDWriteFontFace7_GetFontFaceReference(This,reference) (This)->lpVtbl->GetFontFaceReference(This,reference)
#define IDWriteFontFace7_GetPanose(This,panose) (This)->lpVtbl->GetPanose(This,panose)
#define IDWriteFontFace7_GetWeight(This) (This)->lpVtbl->GetWeight(This)
#define IDWriteFontFace7_GetStretch(This) (This)->lpVtbl->GetStretch(This)
#define IDWriteFontFace7_GetStyle(This) (This)->lpVtbl->GetStyle(This)
#define IDWriteFontFace7_GetInformationalStrings(This,stringid,strings,exists) (This)->lpVtbl->GetInformationalStrings(This,stringid,strings,exists)
#define IDWriteFontFace7_HasCharacter(This,character) (This)->lpVtbl->HasCharacter(This,character)
#define IDWriteFontFace7_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 IDWriteFontFace7_IsCharacterLocal(This,character) (This)->lpVtbl->IsCharacterLocal(This,character)
#define IDWriteFontFace7_IsGlyphLocal(This,glyph) (This)->lpVtbl->IsGlyphLocal(This,glyph)
#define IDWriteFontFace7_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
#define IDWriteFontFace7_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
/*** IDWriteFontFace4 methods ***/
#define IDWriteFontFace7_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats)
#define IDWriteFontFace7_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This)
#define IDWriteFontFace7_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context)
#define IDWriteFontFace7_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context)
/*** IDWriteFontFace5 methods ***/
#define IDWriteFontFace7_GetFontAxisValueCount(This) (This)->lpVtbl->GetFontAxisValueCount(This)
#define IDWriteFontFace7_GetFontAxisValues(This,values,value_count) (This)->lpVtbl->GetFontAxisValues(This,values,value_count)
#define IDWriteFontFace7_HasVariations(This) (This)->lpVtbl->HasVariations(This)
#define IDWriteFontFace7_GetFontResource(This,resource) (This)->lpVtbl->GetFontResource(This,resource)
#define IDWriteFontFace7_Equals(This,fontface) (This)->lpVtbl->Equals(This,fontface)
/*** IDWriteFontFace6 methods ***/
#define IDWriteFontFace7_GetFamilyNames(This,font_family_model,names) (This)->lpVtbl->IDWriteFontFace6_GetFamilyNames(This,font_family_model,names)
#define IDWriteFontFace7_GetFaceNames(This,font_family_model,names) (This)->lpVtbl->IDWriteFontFace6_GetFaceNames(This,font_family_model,names)
/*** IDWriteFontFace7 methods ***/
#define IDWriteFontFace7_GetPaintFeatureLevel(This,glyph_image_format) (This)->lpVtbl->GetPaintFeatureLevel(This,glyph_image_format)
#define IDWriteFontFace7_CreatePaintReader(This,glyph_image_format,paint_feature_level,paint_reader) (This)->lpVtbl->CreatePaintReader(This,glyph_image_format,paint_feature_level,paint_reader)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFace7_QueryInterface(IDWriteFontFace7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFontFace7_AddRef(IDWriteFontFace7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFontFace7_Release(IDWriteFontFace7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFace methods ***/
static __WIDL_INLINE DWRITE_FONT_FACE_TYPE IDWriteFontFace7_GetType(IDWriteFontFace7* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetFiles(IDWriteFontFace7* This,UINT32 *number_of_files,IDWriteFontFile **fontfiles) {
    return This->lpVtbl->GetFiles(This,number_of_files,fontfiles);
}
static __WIDL_INLINE UINT32 IDWriteFontFace7_GetIndex(IDWriteFontFace7* This) {
    return This->lpVtbl->GetIndex(This);
}
static __WIDL_INLINE DWRITE_FONT_SIMULATIONS IDWriteFontFace7_GetSimulations(IDWriteFontFace7* This) {
    return This->lpVtbl->GetSimulations(This);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_IsSymbolFont(IDWriteFontFace7* This) {
    return This->lpVtbl->IsSymbolFont(This);
}
static __WIDL_INLINE UINT16 IDWriteFontFace7_GetGlyphCount(IDWriteFontFace7* This) {
    return This->lpVtbl->GetGlyphCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetDesignGlyphMetrics(IDWriteFontFace7* 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 __WIDL_INLINE HRESULT IDWriteFontFace7_GetGlyphIndices(IDWriteFontFace7* This,const UINT32 *codepoints,UINT32 count,UINT16 *glyph_indices) {
    return This->lpVtbl->GetGlyphIndices(This,codepoints,count,glyph_indices);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_TryGetFontTable(IDWriteFontFace7* 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 __WIDL_INLINE void IDWriteFontFace7_ReleaseFontTable(IDWriteFontFace7* This,void *table_context) {
    This->lpVtbl->ReleaseFontTable(This,table_context);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetGlyphRunOutline(IDWriteFontFace7* 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 __WIDL_INLINE HRESULT IDWriteFontFace7_GetGdiCompatibleGlyphMetrics(IDWriteFontFace7* 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 __WIDL_INLINE void IDWriteFontFace7_GetMetrics(IDWriteFontFace7* This,DWRITE_FONT_METRICS1 *metrics) {
    This->lpVtbl->IDWriteFontFace1_GetMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetGdiCompatibleMetrics(IDWriteFontFace7* 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 __WIDL_INLINE void IDWriteFontFace7_GetCaretMetrics(IDWriteFontFace7* This,DWRITE_CARET_METRICS *metrics) {
    This->lpVtbl->GetCaretMetrics(This,metrics);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetUnicodeRanges(IDWriteFontFace7* This,UINT32 max_count,DWRITE_UNICODE_RANGE *ranges,UINT32 *count) {
    return This->lpVtbl->GetUnicodeRanges(This,max_count,ranges,count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_IsMonospacedFont(IDWriteFontFace7* This) {
    return This->lpVtbl->IsMonospacedFont(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetDesignGlyphAdvances(IDWriteFontFace7* This,UINT32 glyph_count,const UINT16 *indices,INT32 *advances,WINBOOL is_sideways) {
    return This->lpVtbl->GetDesignGlyphAdvances(This,glyph_count,indices,advances,is_sideways);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetGdiCompatibleGlyphAdvances(IDWriteFontFace7* 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 __WIDL_INLINE HRESULT IDWriteFontFace7_GetKerningPairAdjustments(IDWriteFontFace7* This,UINT32 glyph_count,const UINT16 *indices,INT32 *adjustments) {
    return This->lpVtbl->GetKerningPairAdjustments(This,glyph_count,indices,adjustments);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_HasKerningPairs(IDWriteFontFace7* This) {
    return This->lpVtbl->HasKerningPairs(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetVerticalGlyphVariants(IDWriteFontFace7* This,UINT32 glyph_count,const UINT16 *nominal_indices,UINT16 *vertical_indices) {
    return This->lpVtbl->GetVerticalGlyphVariants(This,glyph_count,nominal_indices,vertical_indices);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_HasVerticalGlyphVariants(IDWriteFontFace7* This) {
    return This->lpVtbl->HasVerticalGlyphVariants(This);
}
/*** IDWriteFontFace2 methods ***/
static __WIDL_INLINE WINBOOL IDWriteFontFace7_IsColorFont(IDWriteFontFace7* This) {
    return This->lpVtbl->IsColorFont(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace7_GetColorPaletteCount(IDWriteFontFace7* This) {
    return This->lpVtbl->GetColorPaletteCount(This);
}
static __WIDL_INLINE UINT32 IDWriteFontFace7_GetPaletteEntryCount(IDWriteFontFace7* This) {
    return This->lpVtbl->GetPaletteEntryCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetPaletteEntries(IDWriteFontFace7* 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 __WIDL_INLINE HRESULT IDWriteFontFace7_GetFontFaceReference(IDWriteFontFace7* This,IDWriteFontFaceReference **reference) {
    return This->lpVtbl->GetFontFaceReference(This,reference);
}
static __WIDL_INLINE void IDWriteFontFace7_GetPanose(IDWriteFontFace7* This,DWRITE_PANOSE *panose) {
    This->lpVtbl->GetPanose(This,panose);
}
static __WIDL_INLINE DWRITE_FONT_WEIGHT IDWriteFontFace7_GetWeight(IDWriteFontFace7* This) {
    return This->lpVtbl->GetWeight(This);
}
static __WIDL_INLINE DWRITE_FONT_STRETCH IDWriteFontFace7_GetStretch(IDWriteFontFace7* This) {
    return This->lpVtbl->GetStretch(This);
}
static __WIDL_INLINE DWRITE_FONT_STYLE IDWriteFontFace7_GetStyle(IDWriteFontFace7* This) {
    return This->lpVtbl->GetStyle(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetInformationalStrings(IDWriteFontFace7* This,DWRITE_INFORMATIONAL_STRING_ID stringid,IDWriteLocalizedStrings **strings,WINBOOL *exists) {
    return This->lpVtbl->GetInformationalStrings(This,stringid,strings,exists);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_HasCharacter(IDWriteFontFace7* This,UINT32 character) {
    return This->lpVtbl->HasCharacter(This,character);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetRecommendedRenderingMode(IDWriteFontFace7* 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 __WIDL_INLINE WINBOOL IDWriteFontFace7_IsCharacterLocal(IDWriteFontFace7* This,UINT32 character) {
    return This->lpVtbl->IsCharacterLocal(This,character);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_IsGlyphLocal(IDWriteFontFace7* This,UINT16 glyph) {
    return This->lpVtbl->IsGlyphLocal(This,glyph);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_AreCharactersLocal(IDWriteFontFace7* 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 __WIDL_INLINE HRESULT IDWriteFontFace7_AreGlyphsLocal(IDWriteFontFace7* 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 __WIDL_INLINE HRESULT IDWriteFontFace7_GetGlyphImageFormats_(IDWriteFontFace7* 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 __WIDL_INLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace7_GetGlyphImageFormats(IDWriteFontFace7* This) {
    return This->lpVtbl->GetGlyphImageFormats(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetGlyphImageData(IDWriteFontFace7* 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 __WIDL_INLINE void IDWriteFontFace7_ReleaseGlyphImageData(IDWriteFontFace7* This,void *context) {
    This->lpVtbl->ReleaseGlyphImageData(This,context);
}
/*** IDWriteFontFace5 methods ***/
static __WIDL_INLINE UINT32 IDWriteFontFace7_GetFontAxisValueCount(IDWriteFontFace7* This) {
    return This->lpVtbl->GetFontAxisValueCount(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetFontAxisValues(IDWriteFontFace7* This,DWRITE_FONT_AXIS_VALUE *values,UINT32 value_count) {
    return This->lpVtbl->GetFontAxisValues(This,values,value_count);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_HasVariations(IDWriteFontFace7* This) {
    return This->lpVtbl->HasVariations(This);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetFontResource(IDWriteFontFace7* This,IDWriteFontResource **resource) {
    return This->lpVtbl->GetFontResource(This,resource);
}
static __WIDL_INLINE WINBOOL IDWriteFontFace7_Equals(IDWriteFontFace7* This,IDWriteFontFace *fontface) {
    return This->lpVtbl->Equals(This,fontface);
}
/*** IDWriteFontFace6 methods ***/
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetFamilyNames(IDWriteFontFace7* This,DWRITE_FONT_FAMILY_MODEL font_family_model,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->IDWriteFontFace6_GetFamilyNames(This,font_family_model,names);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_GetFaceNames(IDWriteFontFace7* This,DWRITE_FONT_FAMILY_MODEL font_family_model,IDWriteLocalizedStrings **names) {
    return This->lpVtbl->IDWriteFontFace6_GetFaceNames(This,font_family_model,names);
}
/*** IDWriteFontFace7 methods ***/
static __WIDL_INLINE DWRITE_PAINT_FEATURE_LEVEL IDWriteFontFace7_GetPaintFeatureLevel(IDWriteFontFace7* This,DWRITE_GLYPH_IMAGE_FORMATS glyph_image_format) {
    return This->lpVtbl->GetPaintFeatureLevel(This,glyph_image_format);
}
static __WIDL_INLINE HRESULT IDWriteFontFace7_CreatePaintReader(IDWriteFontFace7* This,DWRITE_GLYPH_IMAGE_FORMATS glyph_image_format,DWRITE_PAINT_FEATURE_LEVEL paint_feature_level,IDWritePaintReader **paint_reader) {
    return This->lpVtbl->CreatePaintReader(This,glyph_image_format,paint_feature_level,paint_reader);
}
#endif
#endif

#endif


#endif  /* __IDWriteFontFace7_INTERFACE_DEFINED__ */

typedef struct DWRITE_COLOR_GLYPH_RUN1 DWRITE_COLOR_GLYPH_RUN1;
struct DWRITE_COLOR_GLYPH_RUN1
{
    DWRITE_GLYPH_RUN glyphRun;
    DWRITE_GLYPH_RUN_DESCRIPTION *glyphRunDescription;
    FLOAT baselineOriginX;
    FLOAT baselineOriginY;
    DWRITE_COLOR_F runColor;
    UINT16 paletteIndex;
#ifdef _WIN64
    UINT32 _pad;
#endif
    DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat;
    DWRITE_MEASURING_MODE measuringMode;
};
/*****************************************************************************
 * 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 __WIDL_INLINE HRESULT IDWriteColorGlyphRunEnumerator1_QueryInterface(IDWriteColorGlyphRunEnumerator1* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteColorGlyphRunEnumerator1_AddRef(IDWriteColorGlyphRunEnumerator1* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteColorGlyphRunEnumerator1_Release(IDWriteColorGlyphRunEnumerator1* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteColorGlyphRunEnumerator methods ***/
static __WIDL_INLINE HRESULT IDWriteColorGlyphRunEnumerator1_MoveNext(IDWriteColorGlyphRunEnumerator1* This,WINBOOL *hasRun) {
    return This->lpVtbl->MoveNext(This,hasRun);
}
/*** IDWriteColorGlyphRunEnumerator1 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_QueryInterface(IDWriteFactory4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFactory4_AddRef(IDWriteFactory4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFactory4_Release(IDWriteFactory4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_RegisterFontCollectionLoader(IDWriteFactory4* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_UnregisterFontCollectionLoader(IDWriteFactory4* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_CreateFontFileReference(IDWriteFactory4* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_CreateRenderingParams(IDWriteFactory4* This,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateRenderingParams(This,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_CreateMonitorRenderingParams(IDWriteFactory4* This,HMONITOR monitor,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_RegisterFontFileLoader(IDWriteFactory4* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->RegisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_UnregisterFontFileLoader(IDWriteFactory4* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_CreateTypography(IDWriteFactory4* This,IDWriteTypography **typography) {
    return This->lpVtbl->CreateTypography(This,typography);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_GetGdiInterop(IDWriteFactory4* This,IDWriteGdiInterop **gdi_interop) {
    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_CreateEllipsisTrimmingSign(IDWriteFactory4* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_CreateTextAnalyzer(IDWriteFactory4* This,IDWriteTextAnalyzer **analyzer) {
    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_GetEudcFontCollection(IDWriteFactory4* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
}
/*** IDWriteFactory2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFactory4_GetSystemFontFallback(IDWriteFactory4* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetSystemFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_CreateFontFallbackBuilder(IDWriteFactory4* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
}
/*** IDWriteFactory3 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_GetSystemFontSet(IDWriteFactory4* This,IDWriteFontSet **fontset) {
    return This->lpVtbl->GetSystemFontSet(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_CreateFontSetBuilder(IDWriteFactory4* This,IDWriteFontSetBuilder **builder) {
    return This->lpVtbl->CreateFontSetBuilder(This,builder);
}
static __WIDL_INLINE HRESULT IDWriteFactory4_CreateFontCollectionFromFontSet(IDWriteFactory4* This,IDWriteFontSet *fontset,IDWriteFontCollection1 **collection) {
    return This->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory4_GetFontDownloadQueue(IDWriteFactory4* This,IDWriteFontDownloadQueue **queue) {
    return This->lpVtbl->GetFontDownloadQueue(This,queue);
}
/*** IDWriteFactory4 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteAsyncResult_QueryInterface(IDWriteAsyncResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteAsyncResult_AddRef(IDWriteAsyncResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteAsyncResult_Release(IDWriteAsyncResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteAsyncResult methods ***/
static __WIDL_INLINE HANDLE IDWriteAsyncResult_GetWaitHandle(IDWriteAsyncResult* This) {
    return This->lpVtbl->GetWaitHandle(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteRemoteFontFileStream_QueryInterface(IDWriteRemoteFontFileStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteRemoteFontFileStream_AddRef(IDWriteRemoteFontFileStream* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteRemoteFontFileStream_Release(IDWriteRemoteFontFileStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFileStream methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE void IDWriteRemoteFontFileStream_ReleaseFileFragment(IDWriteRemoteFontFileStream* This,void *fragment_context) {
    This->lpVtbl->ReleaseFileFragment(This,fragment_context);
}
static __WIDL_INLINE HRESULT IDWriteRemoteFontFileStream_GetFileSize(IDWriteRemoteFontFileStream* This,UINT64 *size) {
    return This->lpVtbl->GetFileSize(This,size);
}
static __WIDL_INLINE HRESULT IDWriteRemoteFontFileStream_GetLastWriteTime(IDWriteRemoteFontFileStream* This,UINT64 *last_writetime) {
    return This->lpVtbl->GetLastWriteTime(This,last_writetime);
}
/*** IDWriteRemoteFontFileStream methods ***/
static __WIDL_INLINE HRESULT IDWriteRemoteFontFileStream_GetLocalFileSize(IDWriteRemoteFontFileStream* This,UINT64 *size) {
    return This->lpVtbl->GetLocalFileSize(This,size);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_LOCALITY IDWriteRemoteFontFileStream_GetLocality(IDWriteRemoteFontFileStream* This) {
    return This->lpVtbl->GetLocality(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteRemoteFontFileLoader_QueryInterface(IDWriteRemoteFontFileLoader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteRemoteFontFileLoader_AddRef(IDWriteRemoteFontFileLoader* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteRemoteFontFileLoader_Release(IDWriteRemoteFontFileLoader* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFileLoader methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteRemoteFontFileLoader_CreateRemoteStreamFromKey(IDWriteRemoteFontFileLoader* This,const void *key,UINT32 key_size,IDWriteRemoteFontFileStream **stream) {
    return This->lpVtbl->CreateRemoteStreamFromKey(This,key,key_size,stream);
}
static __WIDL_INLINE HRESULT IDWriteRemoteFontFileLoader_GetLocalityFromKey(IDWriteRemoteFontFileLoader* This,const void *key,UINT32 key_size,DWRITE_LOCALITY *locality) {
    return This->lpVtbl->GetLocalityFromKey(This,key,key_size,locality);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteInMemoryFontFileLoader_QueryInterface(IDWriteInMemoryFontFileLoader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteInMemoryFontFileLoader_AddRef(IDWriteInMemoryFontFileLoader* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteInMemoryFontFileLoader_Release(IDWriteInMemoryFontFileLoader* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFontFileLoader methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_QueryInterface(IDWriteFactory5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFactory5_AddRef(IDWriteFactory5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFactory5_Release(IDWriteFactory5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_RegisterFontCollectionLoader(IDWriteFactory5* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_UnregisterFontCollectionLoader(IDWriteFactory5* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_CreateFontFileReference(IDWriteFactory5* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_CreateRenderingParams(IDWriteFactory5* This,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateRenderingParams(This,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_CreateMonitorRenderingParams(IDWriteFactory5* This,HMONITOR monitor,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_RegisterFontFileLoader(IDWriteFactory5* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->RegisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_UnregisterFontFileLoader(IDWriteFactory5* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_CreateTypography(IDWriteFactory5* This,IDWriteTypography **typography) {
    return This->lpVtbl->CreateTypography(This,typography);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_GetGdiInterop(IDWriteFactory5* This,IDWriteGdiInterop **gdi_interop) {
    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_CreateEllipsisTrimmingSign(IDWriteFactory5* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_CreateTextAnalyzer(IDWriteFactory5* This,IDWriteTextAnalyzer **analyzer) {
    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_GetEudcFontCollection(IDWriteFactory5* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
}
/*** IDWriteFactory2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFactory5_GetSystemFontFallback(IDWriteFactory5* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetSystemFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_CreateFontFallbackBuilder(IDWriteFactory5* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
}
/*** IDWriteFactory3 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_GetSystemFontSet(IDWriteFactory5* This,IDWriteFontSet **fontset) {
    return This->lpVtbl->GetSystemFontSet(This,fontset);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_CreateFontCollectionFromFontSet(IDWriteFactory5* This,IDWriteFontSet *fontset,IDWriteFontCollection1 **collection) {
    return This->lpVtbl->CreateFontCollectionFromFontSet(This,fontset,collection);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_GetFontDownloadQueue(IDWriteFactory5* This,IDWriteFontDownloadQueue **queue) {
    return This->lpVtbl->GetFontDownloadQueue(This,queue);
}
/*** IDWriteFactory4 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory5_CreateFontSetBuilder(IDWriteFactory5* This,IDWriteFontSetBuilder1 **fontset_builder) {
    return This->lpVtbl->IDWriteFactory5_CreateFontSetBuilder(This,fontset_builder);
}
static __WIDL_INLINE HRESULT IDWriteFactory5_CreateInMemoryFontFileLoader(IDWriteFactory5* This,IDWriteInMemoryFontFileLoader **loader) {
    return This->lpVtbl->CreateInMemoryFontFileLoader(This,loader);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_CONTAINER_TYPE IDWriteFactory5_AnalyzeContainerType(IDWriteFactory5* This,const void *data,UINT32 data_size) {
    return This->lpVtbl->AnalyzeContainerType(This,data,data_size);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_QueryInterface(IDWriteFactory6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFactory6_AddRef(IDWriteFactory6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFactory6_Release(IDWriteFactory6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_RegisterFontCollectionLoader(IDWriteFactory6* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_UnregisterFontCollectionLoader(IDWriteFactory6* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_CreateFontFileReference(IDWriteFactory6* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_CreateRenderingParams(IDWriteFactory6* This,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateRenderingParams(This,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_CreateMonitorRenderingParams(IDWriteFactory6* This,HMONITOR monitor,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_RegisterFontFileLoader(IDWriteFactory6* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->RegisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_UnregisterFontFileLoader(IDWriteFactory6* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_CreateTypography(IDWriteFactory6* This,IDWriteTypography **typography) {
    return This->lpVtbl->CreateTypography(This,typography);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_GetGdiInterop(IDWriteFactory6* This,IDWriteGdiInterop **gdi_interop) {
    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_CreateEllipsisTrimmingSign(IDWriteFactory6* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_CreateTextAnalyzer(IDWriteFactory6* This,IDWriteTextAnalyzer **analyzer) {
    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_GetEudcFontCollection(IDWriteFactory6* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
}
/*** IDWriteFactory2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFactory6_GetSystemFontFallback(IDWriteFactory6* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetSystemFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_CreateFontFallbackBuilder(IDWriteFactory6* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
}
/*** IDWriteFactory3 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_GetFontDownloadQueue(IDWriteFactory6* This,IDWriteFontDownloadQueue **queue) {
    return This->lpVtbl->GetFontDownloadQueue(This,queue);
}
/*** IDWriteFactory4 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_CreateInMemoryFontFileLoader(IDWriteFactory6* This,IDWriteInMemoryFontFileLoader **loader) {
    return This->lpVtbl->CreateInMemoryFontFileLoader(This,loader);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_CONTAINER_TYPE IDWriteFactory6_AnalyzeContainerType(IDWriteFactory6* This,const void *data,UINT32 data_size) {
    return This->lpVtbl->AnalyzeContainerType(This,data,data_size);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_CreateFontResource(IDWriteFactory6* This,IDWriteFontFile *file,UINT32 face_index,IDWriteFontResource **resource) {
    return This->lpVtbl->CreateFontResource(This,file,face_index,resource);
}
static __WIDL_INLINE HRESULT IDWriteFactory6_GetSystemFontSet(IDWriteFactory6* This,WINBOOL include_downloadable,IDWriteFontSet1 **fontset) {
    return This->lpVtbl->IDWriteFactory6_GetSystemFontSet(This,include_downloadable,fontset);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory6_CreateFontSetBuilder(IDWriteFactory6* This,IDWriteFontSetBuilder2 **builder) {
    return This->lpVtbl->IDWriteFactory6_CreateFontSetBuilder(This,builder);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_QueryInterface(IDWriteFactory7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDWriteFactory7_AddRef(IDWriteFactory7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDWriteFactory7_Release(IDWriteFactory7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDWriteFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_RegisterFontCollectionLoader(IDWriteFactory7* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->RegisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_UnregisterFontCollectionLoader(IDWriteFactory7* This,IDWriteFontCollectionLoader *loader) {
    return This->lpVtbl->UnregisterFontCollectionLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_CreateFontFileReference(IDWriteFactory7* This,const WCHAR *path,const FILETIME *writetime,IDWriteFontFile **font_file) {
    return This->lpVtbl->CreateFontFileReference(This,path,writetime,font_file);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_CreateRenderingParams(IDWriteFactory7* This,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateRenderingParams(This,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_CreateMonitorRenderingParams(IDWriteFactory7* This,HMONITOR monitor,IDWriteRenderingParams **params) {
    return This->lpVtbl->CreateMonitorRenderingParams(This,monitor,params);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_RegisterFontFileLoader(IDWriteFactory7* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->RegisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_UnregisterFontFileLoader(IDWriteFactory7* This,IDWriteFontFileLoader *loader) {
    return This->lpVtbl->UnregisterFontFileLoader(This,loader);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_CreateTypography(IDWriteFactory7* This,IDWriteTypography **typography) {
    return This->lpVtbl->CreateTypography(This,typography);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_GetGdiInterop(IDWriteFactory7* This,IDWriteGdiInterop **gdi_interop) {
    return This->lpVtbl->GetGdiInterop(This,gdi_interop);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_CreateEllipsisTrimmingSign(IDWriteFactory7* This,IDWriteTextFormat *format,IDWriteInlineObject **trimming_sign) {
    return This->lpVtbl->CreateEllipsisTrimmingSign(This,format,trimming_sign);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_CreateTextAnalyzer(IDWriteFactory7* This,IDWriteTextAnalyzer **analyzer) {
    return This->lpVtbl->CreateTextAnalyzer(This,analyzer);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_GetEudcFontCollection(IDWriteFactory7* This,IDWriteFontCollection **collection,WINBOOL check_for_updates) {
    return This->lpVtbl->GetEudcFontCollection(This,collection,check_for_updates);
}
/*** IDWriteFactory2 methods ***/
static __WIDL_INLINE HRESULT IDWriteFactory7_GetSystemFontFallback(IDWriteFactory7* This,IDWriteFontFallback **fallback) {
    return This->lpVtbl->GetSystemFontFallback(This,fallback);
}
static __WIDL_INLINE HRESULT IDWriteFactory7_CreateFontFallbackBuilder(IDWriteFactory7* This,IDWriteFontFallbackBuilder **fallbackbuilder) {
    return This->lpVtbl->CreateFontFallbackBuilder(This,fallbackbuilder);
}
/*** IDWriteFactory3 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_GetFontDownloadQueue(IDWriteFactory7* This,IDWriteFontDownloadQueue **queue) {
    return This->lpVtbl->GetFontDownloadQueue(This,queue);
}
/*** IDWriteFactory4 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_CreateInMemoryFontFileLoader(IDWriteFactory7* This,IDWriteInMemoryFontFileLoader **loader) {
    return This->lpVtbl->CreateInMemoryFontFileLoader(This,loader);
}
static __WIDL_INLINE 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 __WIDL_INLINE DWRITE_CONTAINER_TYPE IDWriteFactory7_AnalyzeContainerType(IDWriteFactory7* This,const void *data,UINT32 data_size) {
    return This->lpVtbl->AnalyzeContainerType(This,data,data_size);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_CreateFontResource(IDWriteFactory7* This,IDWriteFontFile *file,UINT32 face_index,IDWriteFontResource **resource) {
    return This->lpVtbl->CreateFontResource(This,file,face_index,resource);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_CreateFontSetBuilder(IDWriteFactory7* This,IDWriteFontSetBuilder2 **builder) {
    return This->lpVtbl->IDWriteFactory6_CreateFontSetBuilder(This,builder);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDWriteFactory7_GetSystemFontSet(IDWriteFactory7* This,WINBOOL include_downloadable,IDWriteFontSet2 **fontset) {
    return This->lpVtbl->IDWriteFactory7_GetSystemFontSet(This,include_downloadable,fontset);
}
static __WIDL_INLINE 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
}
#endif

#endif /* __dwrite_3_h__ */
