/*** Autogenerated by WIDL 9.18 from include/windows.graphics.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 __windows_graphics_h__
#define __windows_graphics_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 ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CIGeometrySource2D __x_ABI_CWindows_CGraphics_CIGeometrySource2D;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D ABI::Windows::Graphics::IGeometrySource2D
namespace ABI {
    namespace Windows {
        namespace Graphics {
            interface IGeometrySource2D;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_RectInt32_FWD_DEFINED__
#define ____FIIterable_1_RectInt32_FWD_DEFINED__
typedef interface __FIIterable_1_RectInt32 __FIIterable_1_RectInt32;
#ifdef __cplusplus
#define __FIIterable_1_RectInt32 ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Graphics::RectInt32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_RectInt32_FWD_DEFINED__
#define ____FIIterator_1_RectInt32_FWD_DEFINED__
typedef interface __FIIterator_1_RectInt32 __FIIterator_1_RectInt32;
#ifdef __cplusplus
#define __FIIterator_1_RectInt32 ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Graphics::RectInt32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_RectInt32_FWD_DEFINED__
#define ____FIVectorView_1_RectInt32_FWD_DEFINED__
typedef interface __FIVectorView_1_RectInt32 __FIVectorView_1_RectInt32;
#ifdef __cplusplus
#define __FIVectorView_1_RectInt32 ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::RectInt32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SizeInt32_FWD_DEFINED__
#define ____FIReference_1_SizeInt32_FWD_DEFINED__
typedef interface __FIReference_1_SizeInt32 __FIReference_1_SizeInt32;
#ifdef __cplusplus
#define __FIReference_1_SizeInt32 ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::SizeInt32 >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CDisplayAdapterId __x_ABI_CWindows_CGraphics_CDisplayAdapterId;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            typedef struct DisplayAdapterId DisplayAdapterId;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CDisplayId __x_ABI_CWindows_CGraphics_CDisplayId;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            typedef struct DisplayId DisplayId;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CPointInt32 __x_ABI_CWindows_CGraphics_CPointInt32;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            typedef struct PointInt32 PointInt32;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CRectInt32 __x_ABI_CWindows_CGraphics_CRectInt32;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            typedef struct RectInt32 RectInt32;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CSizeInt32 __x_ABI_CWindows_CGraphics_CSizeInt32;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            typedef struct SizeInt32 SizeInt32;
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CIGeometrySource2D __x_ABI_CWindows_CGraphics_CIGeometrySource2D;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D ABI::Windows::Graphics::IGeometrySource2D
namespace ABI {
    namespace Windows {
        namespace Graphics {
            interface IGeometrySource2D;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_RectInt32_FWD_DEFINED__
#define ____FIIterable_1_RectInt32_FWD_DEFINED__
typedef interface __FIIterable_1_RectInt32 __FIIterable_1_RectInt32;
#ifdef __cplusplus
#define __FIIterable_1_RectInt32 ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Graphics::RectInt32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_RectInt32_FWD_DEFINED__
#define ____FIIterator_1_RectInt32_FWD_DEFINED__
typedef interface __FIIterator_1_RectInt32 __FIIterator_1_RectInt32;
#ifdef __cplusplus
#define __FIIterator_1_RectInt32 ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Graphics::RectInt32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_RectInt32_FWD_DEFINED__
#define ____FIVectorView_1_RectInt32_FWD_DEFINED__
typedef interface __FIVectorView_1_RectInt32 __FIVectorView_1_RectInt32;
#ifdef __cplusplus
#define __FIVectorView_1_RectInt32 ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::RectInt32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SizeInt32_FWD_DEFINED__
#define ____FIReference_1_SizeInt32_FWD_DEFINED__
typedef interface __FIReference_1_SizeInt32 __FIReference_1_SizeInt32;
#ifdef __cplusplus
#define __FIReference_1_SizeInt32 ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::SizeInt32 >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            struct DisplayAdapterId {
                UINT32 LowPart;
                INT32 HighPart;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CDisplayAdapterId {
    UINT32 LowPart;
    INT32 HighPart;
};
#ifdef WIDL_using_Windows_Graphics
#define DisplayAdapterId __x_ABI_CWindows_CGraphics_CDisplayAdapterId
#endif /* WIDL_using_Windows_Graphics */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xc0000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            struct DisplayId {
                UINT64 Value;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CDisplayId {
    UINT64 Value;
};
#ifdef WIDL_using_Windows_Graphics
#define DisplayId __x_ABI_CWindows_CGraphics_CDisplayId
#endif /* WIDL_using_Windows_Graphics */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xc0000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            struct PointInt32 {
                INT32 X;
                INT32 Y;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CPointInt32 {
    INT32 X;
    INT32 Y;
};
#ifdef WIDL_using_Windows_Graphics
#define PointInt32 __x_ABI_CWindows_CGraphics_CPointInt32
#endif /* WIDL_using_Windows_Graphics */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            struct RectInt32 {
                INT32 X;
                INT32 Y;
                INT32 Width;
                INT32 Height;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CRectInt32 {
    INT32 X;
    INT32 Y;
    INT32 Width;
    INT32 Height;
};
#ifdef WIDL_using_Windows_Graphics
#define RectInt32 __x_ABI_CWindows_CGraphics_CRectInt32
#endif /* WIDL_using_Windows_Graphics */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            struct SizeInt32 {
                INT32 Width;
                INT32 Height;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CSizeInt32 {
    INT32 Width;
    INT32 Height;
};
#ifdef WIDL_using_Windows_Graphics
#define SizeInt32 __x_ABI_CWindows_CGraphics_CSizeInt32
#endif /* WIDL_using_Windows_Graphics */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
/*****************************************************************************
 * IGeometrySource2D interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CIGeometrySource2D, 0xcaff7902, 0x670c, 0x4181, 0xa6,0x24, 0xda,0x97,0x72,0x03,0xb8,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            MIDL_INTERFACE("caff7902-670c-4181-a624-da977203b845")
            IGeometrySource2D : public IInspectable
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CIGeometrySource2D, 0xcaff7902, 0x670c, 0x4181, 0xa6,0x24, 0xda,0x97,0x72,0x03,0xb8,0x45)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CIGeometrySource2DVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGraphics_CIGeometrySource2D *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGraphics_CIGeometrySource2D *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGraphics_CIGeometrySource2D *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CIGeometrySource2DVtbl;

interface __x_ABI_CWindows_CGraphics_CIGeometrySource2D {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CIGeometrySource2DVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CIGeometrySource2D_QueryInterface(__x_ABI_CWindows_CGraphics_CIGeometrySource2D* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CIGeometrySource2D_AddRef(__x_ABI_CWindows_CGraphics_CIGeometrySource2D* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CIGeometrySource2D_Release(__x_ABI_CWindows_CGraphics_CIGeometrySource2D* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetIids(__x_ABI_CWindows_CGraphics_CIGeometrySource2D* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CIGeometrySource2D* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetTrustLevel(__x_ABI_CWindows_CGraphics_CIGeometrySource2D* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Graphics
#define IID_IGeometrySource2D IID___x_ABI_CWindows_CGraphics_CIGeometrySource2D
#define IGeometrySource2DVtbl __x_ABI_CWindows_CGraphics_CIGeometrySource2DVtbl
#define IGeometrySource2D __x_ABI_CWindows_CGraphics_CIGeometrySource2D
#define IGeometrySource2D_QueryInterface __x_ABI_CWindows_CGraphics_CIGeometrySource2D_QueryInterface
#define IGeometrySource2D_AddRef __x_ABI_CWindows_CGraphics_CIGeometrySource2D_AddRef
#define IGeometrySource2D_Release __x_ABI_CWindows_CGraphics_CIGeometrySource2D_Release
#define IGeometrySource2D_GetIids __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetIids
#define IGeometrySource2D_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetRuntimeClassName
#define IGeometrySource2D_GetTrustLevel __x_ABI_CWindows_CGraphics_CIGeometrySource2D_GetTrustLevel
#endif /* WIDL_using_Windows_Graphics */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CIGeometrySource2D_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Graphics::RectInt32 > interface
 */
#ifndef ____FIIterable_1_RectInt32_INTERFACE_DEFINED__
#define ____FIIterable_1_RectInt32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_RectInt32, 0xd6222360, 0xb82e, 0x5eed, 0x9e,0xab, 0x2e,0x27,0x5b,0x36,0xe4,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("d6222360-b82e-5eed-9eab-2e275b36e47e")
                IIterable<ABI::Windows::Graphics::RectInt32 > : IIterable_impl<ABI::Windows::Graphics::RectInt32 >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_RectInt32, 0xd6222360, 0xb82e, 0x5eed, 0x9e,0xab, 0x2e,0x27,0x5b,0x36,0xe4,0x7e)
#endif
#else
typedef struct __FIIterable_1_RectInt32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_RectInt32 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_RectInt32 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_RectInt32 *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Graphics::RectInt32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_RectInt32 *This,
        __FIIterator_1_RectInt32 **value);

    END_INTERFACE
} __FIIterable_1_RectInt32Vtbl;

interface __FIIterable_1_RectInt32 {
    CONST_VTBL __FIIterable_1_RectInt32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_RectInt32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_RectInt32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_RectInt32_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_RectInt32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_RectInt32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_RectInt32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Graphics::RectInt32 > methods ***/
#define __FIIterable_1_RectInt32_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_RectInt32_QueryInterface(__FIIterable_1_RectInt32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_RectInt32_AddRef(__FIIterable_1_RectInt32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_RectInt32_Release(__FIIterable_1_RectInt32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_RectInt32_GetIids(__FIIterable_1_RectInt32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_RectInt32_GetRuntimeClassName(__FIIterable_1_RectInt32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_RectInt32_GetTrustLevel(__FIIterable_1_RectInt32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Graphics::RectInt32 > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_RectInt32_First(__FIIterable_1_RectInt32* This,__FIIterator_1_RectInt32 **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_RectInt32 IID___FIIterable_1_RectInt32
#define IIterable_RectInt32Vtbl __FIIterable_1_RectInt32Vtbl
#define IIterable_RectInt32 __FIIterable_1_RectInt32
#define IIterable_RectInt32_QueryInterface __FIIterable_1_RectInt32_QueryInterface
#define IIterable_RectInt32_AddRef __FIIterable_1_RectInt32_AddRef
#define IIterable_RectInt32_Release __FIIterable_1_RectInt32_Release
#define IIterable_RectInt32_GetIids __FIIterable_1_RectInt32_GetIids
#define IIterable_RectInt32_GetRuntimeClassName __FIIterable_1_RectInt32_GetRuntimeClassName
#define IIterable_RectInt32_GetTrustLevel __FIIterable_1_RectInt32_GetTrustLevel
#define IIterable_RectInt32_First __FIIterable_1_RectInt32_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_RectInt32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Graphics::RectInt32 > interface
 */
#ifndef ____FIIterator_1_RectInt32_INTERFACE_DEFINED__
#define ____FIIterator_1_RectInt32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_RectInt32, 0x1abdf3f6, 0x23f1, 0x55ad, 0xba,0xbd, 0xf4,0xcd,0x90,0x84,0x06,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1abdf3f6-23f1-55ad-babd-f4cd908406e7")
                IIterator<ABI::Windows::Graphics::RectInt32 > : IIterator_impl<ABI::Windows::Graphics::RectInt32 >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_RectInt32, 0x1abdf3f6, 0x23f1, 0x55ad, 0xba,0xbd, 0xf4,0xcd,0x90,0x84,0x06,0xe7)
#endif
#else
typedef struct __FIIterator_1_RectInt32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_RectInt32 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_RectInt32 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_RectInt32 *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Graphics::RectInt32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_RectInt32 *This,
        __x_ABI_CWindows_CGraphics_CRectInt32 *value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_RectInt32 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_RectInt32 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_RectInt32 *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CRectInt32 *items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_RectInt32Vtbl;

interface __FIIterator_1_RectInt32 {
    CONST_VTBL __FIIterator_1_RectInt32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_RectInt32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_RectInt32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_RectInt32_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_RectInt32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_RectInt32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_RectInt32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Graphics::RectInt32 > methods ***/
#define __FIIterator_1_RectInt32_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_RectInt32_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_RectInt32_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_RectInt32_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_QueryInterface(__FIIterator_1_RectInt32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_RectInt32_AddRef(__FIIterator_1_RectInt32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_RectInt32_Release(__FIIterator_1_RectInt32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_GetIids(__FIIterator_1_RectInt32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_GetRuntimeClassName(__FIIterator_1_RectInt32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_GetTrustLevel(__FIIterator_1_RectInt32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Graphics::RectInt32 > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_get_Current(__FIIterator_1_RectInt32* This,__x_ABI_CWindows_CGraphics_CRectInt32 *value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_get_HasCurrent(__FIIterator_1_RectInt32* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_MoveNext(__FIIterator_1_RectInt32* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_RectInt32_GetMany(__FIIterator_1_RectInt32* This,UINT32 items_size,__x_ABI_CWindows_CGraphics_CRectInt32 *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_RectInt32 IID___FIIterator_1_RectInt32
#define IIterator_RectInt32Vtbl __FIIterator_1_RectInt32Vtbl
#define IIterator_RectInt32 __FIIterator_1_RectInt32
#define IIterator_RectInt32_QueryInterface __FIIterator_1_RectInt32_QueryInterface
#define IIterator_RectInt32_AddRef __FIIterator_1_RectInt32_AddRef
#define IIterator_RectInt32_Release __FIIterator_1_RectInt32_Release
#define IIterator_RectInt32_GetIids __FIIterator_1_RectInt32_GetIids
#define IIterator_RectInt32_GetRuntimeClassName __FIIterator_1_RectInt32_GetRuntimeClassName
#define IIterator_RectInt32_GetTrustLevel __FIIterator_1_RectInt32_GetTrustLevel
#define IIterator_RectInt32_get_Current __FIIterator_1_RectInt32_get_Current
#define IIterator_RectInt32_get_HasCurrent __FIIterator_1_RectInt32_get_HasCurrent
#define IIterator_RectInt32_MoveNext __FIIterator_1_RectInt32_MoveNext
#define IIterator_RectInt32_GetMany __FIIterator_1_RectInt32_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_RectInt32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Graphics::RectInt32 > interface
 */
#ifndef ____FIVectorView_1_RectInt32_INTERFACE_DEFINED__
#define ____FIVectorView_1_RectInt32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_RectInt32, 0x4f5e243f, 0x3812, 0x5200, 0xb7,0x0c, 0x30,0xdc,0xfc,0x61,0x71,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4f5e243f-3812-5200-b70c-30dcfc61717b")
                IVectorView<ABI::Windows::Graphics::RectInt32 > : IVectorView_impl<ABI::Windows::Graphics::RectInt32 >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_RectInt32, 0x4f5e243f, 0x3812, 0x5200, 0xb7,0x0c, 0x30,0xdc,0xfc,0x61,0x71,0x7b)
#endif
#else
typedef struct __FIVectorView_1_RectInt32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_RectInt32 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_RectInt32 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_RectInt32 *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::Graphics::RectInt32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_RectInt32 *This,
        UINT32 index,
        __x_ABI_CWindows_CGraphics_CRectInt32 *value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_RectInt32 *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_RectInt32 *This,
        __x_ABI_CWindows_CGraphics_CRectInt32 element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_RectInt32 *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CRectInt32 *items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_RectInt32Vtbl;

interface __FIVectorView_1_RectInt32 {
    CONST_VTBL __FIVectorView_1_RectInt32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_RectInt32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_RectInt32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_RectInt32_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_RectInt32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_RectInt32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_RectInt32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Graphics::RectInt32 > methods ***/
#define __FIVectorView_1_RectInt32_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_RectInt32_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_RectInt32_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_RectInt32_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_QueryInterface(__FIVectorView_1_RectInt32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_RectInt32_AddRef(__FIVectorView_1_RectInt32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_RectInt32_Release(__FIVectorView_1_RectInt32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_GetIids(__FIVectorView_1_RectInt32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_GetRuntimeClassName(__FIVectorView_1_RectInt32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_GetTrustLevel(__FIVectorView_1_RectInt32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Graphics::RectInt32 > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_GetAt(__FIVectorView_1_RectInt32* This,UINT32 index,__x_ABI_CWindows_CGraphics_CRectInt32 *value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_get_Size(__FIVectorView_1_RectInt32* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_IndexOf(__FIVectorView_1_RectInt32* This,__x_ABI_CWindows_CGraphics_CRectInt32 element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_RectInt32_GetMany(__FIVectorView_1_RectInt32* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGraphics_CRectInt32 *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_RectInt32 IID___FIVectorView_1_RectInt32
#define IVectorView_RectInt32Vtbl __FIVectorView_1_RectInt32Vtbl
#define IVectorView_RectInt32 __FIVectorView_1_RectInt32
#define IVectorView_RectInt32_QueryInterface __FIVectorView_1_RectInt32_QueryInterface
#define IVectorView_RectInt32_AddRef __FIVectorView_1_RectInt32_AddRef
#define IVectorView_RectInt32_Release __FIVectorView_1_RectInt32_Release
#define IVectorView_RectInt32_GetIids __FIVectorView_1_RectInt32_GetIids
#define IVectorView_RectInt32_GetRuntimeClassName __FIVectorView_1_RectInt32_GetRuntimeClassName
#define IVectorView_RectInt32_GetTrustLevel __FIVectorView_1_RectInt32_GetTrustLevel
#define IVectorView_RectInt32_GetAt __FIVectorView_1_RectInt32_GetAt
#define IVectorView_RectInt32_get_Size __FIVectorView_1_RectInt32_get_Size
#define IVectorView_RectInt32_IndexOf __FIVectorView_1_RectInt32_IndexOf
#define IVectorView_RectInt32_GetMany __FIVectorView_1_RectInt32_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_RectInt32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Graphics::SizeInt32 > interface
 */
#ifndef ____FIReference_1_SizeInt32_INTERFACE_DEFINED__
#define ____FIReference_1_SizeInt32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SizeInt32, 0xb77aa86d, 0x2d6e, 0x55f1, 0x8f,0x99, 0x64,0xac,0x5c,0x05,0x32,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b77aa86d-2d6e-55f1-8f99-64ac5c05328b")
            IReference<ABI::Windows::Graphics::SizeInt32 > : IReference_impl<ABI::Windows::Graphics::SizeInt32 >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SizeInt32, 0xb77aa86d, 0x2d6e, 0x55f1, 0x8f,0x99, 0x64,0xac,0x5c,0x05,0x32,0x8b)
#endif
#else
typedef struct __FIReference_1_SizeInt32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SizeInt32 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SizeInt32 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SizeInt32 *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Graphics::SizeInt32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SizeInt32 *This,
        __x_ABI_CWindows_CGraphics_CSizeInt32 *value);

    END_INTERFACE
} __FIReference_1_SizeInt32Vtbl;

interface __FIReference_1_SizeInt32 {
    CONST_VTBL __FIReference_1_SizeInt32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SizeInt32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SizeInt32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SizeInt32_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SizeInt32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SizeInt32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SizeInt32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Graphics::SizeInt32 > methods ***/
#define __FIReference_1_SizeInt32_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SizeInt32_QueryInterface(__FIReference_1_SizeInt32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIReference_1_SizeInt32_AddRef(__FIReference_1_SizeInt32* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIReference_1_SizeInt32_Release(__FIReference_1_SizeInt32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SizeInt32_GetIids(__FIReference_1_SizeInt32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIReference_1_SizeInt32_GetRuntimeClassName(__FIReference_1_SizeInt32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIReference_1_SizeInt32_GetTrustLevel(__FIReference_1_SizeInt32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Graphics::SizeInt32 > methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SizeInt32_get_Value(__FIReference_1_SizeInt32* This,__x_ABI_CWindows_CGraphics_CSizeInt32 *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SizeInt32 IID___FIReference_1_SizeInt32
#define IReference_SizeInt32Vtbl __FIReference_1_SizeInt32Vtbl
#define IReference_SizeInt32 __FIReference_1_SizeInt32
#define IReference_SizeInt32_QueryInterface __FIReference_1_SizeInt32_QueryInterface
#define IReference_SizeInt32_AddRef __FIReference_1_SizeInt32_AddRef
#define IReference_SizeInt32_Release __FIReference_1_SizeInt32_Release
#define IReference_SizeInt32_GetIids __FIReference_1_SizeInt32_GetIids
#define IReference_SizeInt32_GetRuntimeClassName __FIReference_1_SizeInt32_GetRuntimeClassName
#define IReference_SizeInt32_GetTrustLevel __FIReference_1_SizeInt32_GetTrustLevel
#define IReference_SizeInt32_get_Value __FIReference_1_SizeInt32_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SizeInt32_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_graphics_h__ */
