/*** Autogenerated by WIDL 9.11 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,
        struct __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,
        struct __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,struct __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,struct __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,
        struct __x_ABI_CWindows_CGraphics_CRectInt32 *value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_RectInt32 *This,
        UINT32 start_index,
        UINT32 items_size,
        struct __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,struct __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,struct __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,struct __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,
        struct __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,struct __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__ */
