/*** Autogenerated by WIDL 8.21 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 __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 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;
/*****************************************************************************
 * 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, 0x1257, 0x47ca, 0x8b,0x85, 0x31,0xbf,0xcf,0x3f,0x2d,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cfee3140-1257-47ca-8b85-31bfcf3f2d0e")
IDWriteStringList : public IUnknown
{
    virtual UINT32 STDMETHODCALLTYPE GetCount(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLocaleNameLength(
        UINT32 index,
        UINT32 *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLocaleName(
        UINT32 index,
        WCHAR *name,
        UINT32 size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringLength(
        UINT32 index,
        UINT32 *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetString(
        UINT32 index,
        WCHAR *string,
        UINT32 size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDWriteStringList, 0xcfee3140, 0x1257, 0x47ca, 0x8b,0x85, 0x31,0xbf,0xcf,0x3f,0x2d,0x0e)
#endif
#else
typedef struct IDWriteStringListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDWriteStringList methods ***/
    UINT32 (STDMETHODCALLTYPE *GetCount)(
        IDWriteStringList *This);

    HRESULT (STDMETHODCALLTYPE *GetLocaleNameLength)(
        IDWriteStringList *This,
        UINT32 index,
        UINT32 *length);

    HRESULT (STDMETHODCALLTYPE *GetLocaleName)(
        IDWriteStringList *This,
        UINT32 index,
        WCHAR *name,
        UINT32 size);

    HRESULT (STDMETHODCALLTYPE *GetStringLength)(
        IDWriteStringList *This,
        UINT32 index,
        UINT32 *length);

    HRESULT (STDMETHODCALLTYPE *GetString)(
        IDWriteStringList *This,
        UINT32 index,
        WCHAR *string,
        UINT32 size);

    END_INTERFACE
} IDWriteStringListVtbl;

interface IDWriteStringList {
    CONST_VTBL IDWriteStringListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDWriteStringList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDWriteStringList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDWriteStringList_Release(This) (This)->lpVtbl->Release(This)
/*** IDWriteStringList methods ***/
#define IDWriteStringList_GetCount(This) (This)->lpVtbl->GetCount(This)
#define IDWriteStringList_GetLocaleNameLength(This,index,length) (This)->lpVtbl->GetLocaleNameLength(This,index,length)
#define IDWriteStringList_GetLocaleName(This,index,name,size) (This)->lpVtbl->GetLocaleName(This,index,name,size)
#define IDWriteStringList_GetStringLength(This,index,length) (This)->lpVtbl->GetStringLength(This,index,length)
#define IDWriteStringList_GetString(This,index,string,size) (This)->lpVtbl->GetString(This,index,string,size)
#else
/*** IUnknown methods ***/
static __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__ */

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__ */
