/*** Autogenerated by WIDL 9.18 from include/windows.graphics.imaging.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_imaging_h__
#define __windows_graphics_imaging_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_CImaging_CIBitmapBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer ABI::Windows::Graphics::Imaging::IBitmapBuffer
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface IBitmapBuffer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap ABI::Windows::Graphics::Imaging::ISoftwareBitmap
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface ISoftwareBitmap;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory ABI::Windows::Graphics::Imaging::ISoftwareBitmapFactory
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface ISoftwareBitmapFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics ABI::Windows::Graphics::Imaging::ISoftwareBitmapStatics
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface ISoftwareBitmapStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CBitmapBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CBitmapBuffer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                class BitmapBuffer;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapBuffer __x_ABI_CWindows_CGraphics_CImaging_CBitmapBuffer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CImaging_CBitmapBuffer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CSoftwareBitmap_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CSoftwareBitmap_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                class SoftwareBitmap;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CSoftwareBitmap __x_ABI_CWindows_CGraphics_CImaging_CSoftwareBitmap;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CImaging_CSoftwareBitmap_FWD_DEFINED__ */

#ifndef ____FIIterable_1_BitmapPixelFormat_FWD_DEFINED__
#define ____FIIterable_1_BitmapPixelFormat_FWD_DEFINED__
typedef interface __FIIterable_1_BitmapPixelFormat __FIIterable_1_BitmapPixelFormat;
#ifdef __cplusplus
#define __FIIterable_1_BitmapPixelFormat ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_BitmapPixelFormat_FWD_DEFINED__
#define ____FIIterator_1_BitmapPixelFormat_FWD_DEFINED__
typedef interface __FIIterator_1_BitmapPixelFormat __FIIterator_1_BitmapPixelFormat;
#ifdef __cplusplus
#define __FIIterator_1_BitmapPixelFormat ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_BitmapPixelFormat_FWD_DEFINED__
#define ____FIVectorView_1_BitmapPixelFormat_FWD_DEFINED__
typedef interface __FIVectorView_1_BitmapPixelFormat __FIVectorView_1_BitmapPixelFormat;
#ifdef __cplusplus
#define __FIVectorView_1_BitmapPixelFormat ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_BitmapBounds_FWD_DEFINED__
#define ____FIReference_1_BitmapBounds_FWD_DEFINED__
typedef interface __FIReference_1_BitmapBounds __FIReference_1_BitmapBounds;
#ifdef __cplusplus
#define __FIReference_1_BitmapBounds ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::Imaging::BitmapBounds >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.graphics.directx.direct3d11.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapBufferAccessMode __x_ABI_CWindows_CGraphics_CImaging_CBitmapBufferAccessMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                typedef struct BitmapBounds BitmapBounds;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapPlaneDescription __x_ABI_CWindows_CGraphics_CImaging_CBitmapPlaneDescription;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                typedef struct BitmapPlaneDescription BitmapPlaneDescription;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                typedef struct BitmapSize BitmapSize;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer ABI::Windows::Graphics::Imaging::IBitmapBuffer
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface IBitmapBuffer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap ABI::Windows::Graphics::Imaging::ISoftwareBitmap
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface ISoftwareBitmap;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory ABI::Windows::Graphics::Imaging::ISoftwareBitmapFactory
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface ISoftwareBitmapFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics ABI::Windows::Graphics::Imaging::ISoftwareBitmapStatics
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                interface ISoftwareBitmapStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_BitmapPixelFormat_FWD_DEFINED__
#define ____FIIterable_1_BitmapPixelFormat_FWD_DEFINED__
typedef interface __FIIterable_1_BitmapPixelFormat __FIIterable_1_BitmapPixelFormat;
#ifdef __cplusplus
#define __FIIterable_1_BitmapPixelFormat ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_BitmapPixelFormat_FWD_DEFINED__
#define ____FIIterator_1_BitmapPixelFormat_FWD_DEFINED__
typedef interface __FIIterator_1_BitmapPixelFormat __FIIterator_1_BitmapPixelFormat;
#ifdef __cplusplus
#define __FIIterator_1_BitmapPixelFormat ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_BitmapPixelFormat_FWD_DEFINED__
#define ____FIVectorView_1_BitmapPixelFormat_FWD_DEFINED__
typedef interface __FIVectorView_1_BitmapPixelFormat __FIVectorView_1_BitmapPixelFormat;
#ifdef __cplusplus
#define __FIVectorView_1_BitmapPixelFormat ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_BitmapBounds_FWD_DEFINED__
#define ____FIReference_1_BitmapBounds_FWD_DEFINED__
typedef interface __FIReference_1_BitmapBounds __FIReference_1_BitmapBounds;
#ifdef __cplusplus
#define __FIReference_1_BitmapBounds ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::Imaging::BitmapBounds >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                enum BitmapAlphaMode {
                    BitmapAlphaMode_Premultiplied = 0,
                    BitmapAlphaMode_Straight = 1,
                    BitmapAlphaMode_Ignore = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode {
    BitmapAlphaMode_Premultiplied = 0,
    BitmapAlphaMode_Straight = 1,
    BitmapAlphaMode_Ignore = 2
};
#ifdef WIDL_using_Windows_Graphics_Imaging
#define BitmapAlphaMode __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                enum BitmapBufferAccessMode {
                    BitmapBufferAccessMode_Read = 0,
                    BitmapBufferAccessMode_ReadWrite = 1,
                    BitmapBufferAccessMode_Write = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapBufferAccessMode {
    BitmapBufferAccessMode_Read = 0,
    BitmapBufferAccessMode_ReadWrite = 1,
    BitmapBufferAccessMode_Write = 2
};
#ifdef WIDL_using_Windows_Graphics_Imaging
#define BitmapBufferAccessMode __x_ABI_CWindows_CGraphics_CImaging_CBitmapBufferAccessMode
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                enum BitmapPixelFormat {
                    BitmapPixelFormat_Unknown = 0,
                    BitmapPixelFormat_Rgba16 = 12,
                    BitmapPixelFormat_Rgba8 = 30,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BitmapPixelFormat_Gray16 = 57,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BitmapPixelFormat_Gray8 = 62,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                    BitmapPixelFormat_Bgra8 = 87,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BitmapPixelFormat_Nv12 = 103,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
                    BitmapPixelFormat_P010 = 104,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    BitmapPixelFormat_Yuy2 = 107
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat {
    BitmapPixelFormat_Unknown = 0,
    BitmapPixelFormat_Rgba16 = 12,
    BitmapPixelFormat_Rgba8 = 30,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BitmapPixelFormat_Gray16 = 57,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BitmapPixelFormat_Gray8 = 62,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
    BitmapPixelFormat_Bgra8 = 87,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BitmapPixelFormat_Nv12 = 103,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
    BitmapPixelFormat_P010 = 104,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    BitmapPixelFormat_Yuy2 = 107
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_Graphics_Imaging
#define BitmapPixelFormat __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                struct BitmapBounds {
                    UINT32 X;
                    UINT32 Y;
                    UINT32 Width;
                    UINT32 Height;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds {
    UINT32 X;
    UINT32 Y;
    UINT32 Width;
    UINT32 Height;
};
#ifdef WIDL_using_Windows_Graphics_Imaging
#define BitmapBounds __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                struct BitmapPlaneDescription {
                    INT32 StartIndex;
                    INT32 Width;
                    INT32 Height;
                    INT32 Stride;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapPlaneDescription {
    INT32 StartIndex;
    INT32 Width;
    INT32 Height;
    INT32 Stride;
};
#ifdef WIDL_using_Windows_Graphics_Imaging
#define BitmapPlaneDescription __x_ABI_CWindows_CGraphics_CImaging_CBitmapPlaneDescription
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                struct BitmapSize {
                    UINT32 Width;
                    UINT32 Height;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize {
    UINT32 Width;
    UINT32 Height;
};
#ifdef WIDL_using_Windows_Graphics_Imaging
#define BitmapSize __x_ABI_CWindows_CGraphics_CImaging_CBitmapSize
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IBitmapBuffer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer, 0xa53e04c4, 0x399c, 0x438c, 0xb2,0x8f, 0xa6,0x3a,0x6b,0x83,0xd1,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                MIDL_INTERFACE("a53e04c4-399c-438c-b28f-a63a6b83d1a1")
                IBitmapBuffer : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetPlaneCount(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetPlaneDescription(
                        INT32 index,
                        ABI::Windows::Graphics::Imaging::BitmapPlaneDescription *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer, 0xa53e04c4, 0x399c, 0x438c, 0xb2,0x8f, 0xa6,0x3a,0x6b,0x83,0xd1,0xa1)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBufferVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBitmapBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPlaneCount)(
        __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetPlaneDescription)(
        __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer *This,
        INT32 index,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPlaneDescription *value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBufferVtbl;

interface __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBitmapBuffer methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetPlaneCount(This,value) (This)->lpVtbl->GetPlaneCount(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetPlaneDescription(This,index,value) (This)->lpVtbl->GetPlaneDescription(This,index,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_QueryInterface(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_AddRef(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_Release(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetIids(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetTrustLevel(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBitmapBuffer methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetPlaneCount(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This,INT32 *value) {
    return This->lpVtbl->GetPlaneCount(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetPlaneDescription(__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer* This,INT32 index,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPlaneDescription *value) {
    return This->lpVtbl->GetPlaneDescription(This,index,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Imaging
#define IID_IBitmapBuffer IID___x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer
#define IBitmapBufferVtbl __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBufferVtbl
#define IBitmapBuffer __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer
#define IBitmapBuffer_QueryInterface __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_QueryInterface
#define IBitmapBuffer_AddRef __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_AddRef
#define IBitmapBuffer_Release __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_Release
#define IBitmapBuffer_GetIids __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetIids
#define IBitmapBuffer_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetRuntimeClassName
#define IBitmapBuffer_GetTrustLevel __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetTrustLevel
#define IBitmapBuffer_GetPlaneCount __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetPlaneCount
#define IBitmapBuffer_GetPlaneDescription __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_GetPlaneDescription
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ISoftwareBitmap interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap, 0x689e0708, 0x7eef, 0x483f, 0x96,0x3f, 0xda,0x93,0x88,0x18,0xe0,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                MIDL_INTERFACE("689e0708-7eef-483f-963f-da938818e073")
                ISoftwareBitmap : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_BitmapPixelFormat(
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BitmapAlphaMode(
                        ABI::Windows::Graphics::Imaging::BitmapAlphaMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PixelWidth(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PixelHeight(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsReadOnly(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_DpiX(
                        DOUBLE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DpiX(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_DpiY(
                        DOUBLE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DpiY(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE LockBuffer(
                        ABI::Windows::Graphics::Imaging::BitmapBufferAccessMode mode,
                        ABI::Windows::Graphics::Imaging::IBitmapBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CopyTo(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap *bitmap) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CopyFromBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CopyToBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetReadOnlyView(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap, 0x689e0708, 0x7eef, 0x483f, 0x96,0x3f, 0xda,0x93,0x88,0x18,0xe0,0x73)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISoftwareBitmap methods ***/
    HRESULT (STDMETHODCALLTYPE *get_BitmapPixelFormat)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value);

    HRESULT (STDMETHODCALLTYPE *get_BitmapAlphaMode)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode *value);

    HRESULT (STDMETHODCALLTYPE *get_PixelWidth)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_PixelHeight)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_IsReadOnly)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_DpiX)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_DpiX)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *put_DpiY)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_DpiY)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *LockBuffer)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapBufferAccessMode mode,
        __x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer **value);

    HRESULT (STDMETHODCALLTYPE *CopyTo)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *bitmap);

    HRESULT (STDMETHODCALLTYPE *CopyFromBuffer)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);

    HRESULT (STDMETHODCALLTYPE *CopyToBuffer)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);

    HRESULT (STDMETHODCALLTYPE *GetReadOnlyView)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapVtbl;

interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISoftwareBitmap methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_BitmapPixelFormat(This,value) (This)->lpVtbl->get_BitmapPixelFormat(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_BitmapAlphaMode(This,value) (This)->lpVtbl->get_BitmapAlphaMode(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_PixelWidth(This,value) (This)->lpVtbl->get_PixelWidth(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_PixelHeight(This,value) (This)->lpVtbl->get_PixelHeight(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_IsReadOnly(This,value) (This)->lpVtbl->get_IsReadOnly(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_put_DpiX(This,value) (This)->lpVtbl->put_DpiX(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_DpiX(This,value) (This)->lpVtbl->get_DpiX(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_put_DpiY(This,value) (This)->lpVtbl->put_DpiY(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_DpiY(This,value) (This)->lpVtbl->get_DpiY(This,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_LockBuffer(This,mode,value) (This)->lpVtbl->LockBuffer(This,mode,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyTo(This,bitmap) (This)->lpVtbl->CopyTo(This,bitmap)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyFromBuffer(This,buffer) (This)->lpVtbl->CopyFromBuffer(This,buffer)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyToBuffer(This,buffer) (This)->lpVtbl->CopyToBuffer(This,buffer)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetReadOnlyView(This,value) (This)->lpVtbl->GetReadOnlyView(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_QueryInterface(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_AddRef(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_Release(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetIids(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetTrustLevel(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISoftwareBitmap methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_BitmapPixelFormat(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value) {
    return This->lpVtbl->get_BitmapPixelFormat(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_BitmapAlphaMode(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode *value) {
    return This->lpVtbl->get_BitmapAlphaMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_PixelWidth(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,INT32 *value) {
    return This->lpVtbl->get_PixelWidth(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_PixelHeight(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,INT32 *value) {
    return This->lpVtbl->get_PixelHeight(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_IsReadOnly(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,boolean *value) {
    return This->lpVtbl->get_IsReadOnly(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_put_DpiX(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,DOUBLE value) {
    return This->lpVtbl->put_DpiX(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_DpiX(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,DOUBLE *value) {
    return This->lpVtbl->get_DpiX(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_put_DpiY(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,DOUBLE value) {
    return This->lpVtbl->put_DpiY(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_DpiY(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,DOUBLE *value) {
    return This->lpVtbl->get_DpiY(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_LockBuffer(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapBufferAccessMode mode,__x_ABI_CWindows_CGraphics_CImaging_CIBitmapBuffer **value) {
    return This->lpVtbl->LockBuffer(This,mode,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyTo(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *bitmap) {
    return This->lpVtbl->CopyTo(This,bitmap);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyFromBuffer(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
    return This->lpVtbl->CopyFromBuffer(This,buffer);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyToBuffer(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
    return This->lpVtbl->CopyToBuffer(This,buffer);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetReadOnlyView(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->GetReadOnlyView(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Imaging
#define IID_ISoftwareBitmap IID___x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap
#define ISoftwareBitmapVtbl __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapVtbl
#define ISoftwareBitmap __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap
#define ISoftwareBitmap_QueryInterface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_QueryInterface
#define ISoftwareBitmap_AddRef __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_AddRef
#define ISoftwareBitmap_Release __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_Release
#define ISoftwareBitmap_GetIids __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetIids
#define ISoftwareBitmap_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetRuntimeClassName
#define ISoftwareBitmap_GetTrustLevel __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetTrustLevel
#define ISoftwareBitmap_get_BitmapPixelFormat __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_BitmapPixelFormat
#define ISoftwareBitmap_get_BitmapAlphaMode __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_BitmapAlphaMode
#define ISoftwareBitmap_get_PixelWidth __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_PixelWidth
#define ISoftwareBitmap_get_PixelHeight __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_PixelHeight
#define ISoftwareBitmap_get_IsReadOnly __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_IsReadOnly
#define ISoftwareBitmap_put_DpiX __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_put_DpiX
#define ISoftwareBitmap_get_DpiX __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_DpiX
#define ISoftwareBitmap_put_DpiY __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_put_DpiY
#define ISoftwareBitmap_get_DpiY __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_get_DpiY
#define ISoftwareBitmap_LockBuffer __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_LockBuffer
#define ISoftwareBitmap_CopyTo __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyTo
#define ISoftwareBitmap_CopyFromBuffer __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyFromBuffer
#define ISoftwareBitmap_CopyToBuffer __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_CopyToBuffer
#define ISoftwareBitmap_GetReadOnlyView __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_GetReadOnlyView
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ISoftwareBitmapFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory, 0xc99feb69, 0x2d62, 0x4d47, 0xa6,0xb3, 0x4f,0xdb,0x6a,0x07,0xfd,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                MIDL_INTERFACE("c99feb69-2d62-4d47-a6b3-4fdb6a07fdf8")
                ISoftwareBitmapFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Create(
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithAlpha(
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        ABI::Windows::Graphics::Imaging::BitmapAlphaMode alpha,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory, 0xc99feb69, 0x2d62, 0x4d47, 0xa6,0xb3, 0x4f,0xdb,0x6a,0x07,0xfd,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISoftwareBitmapFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        INT32 width,
        INT32 height,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *CreateWithAlpha)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        INT32 width,
        INT32 height,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactoryVtbl;

interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISoftwareBitmapFactory methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_Create(This,format,width,height,value) (This)->lpVtbl->Create(This,format,width,height,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_CreateWithAlpha(This,format,width,height,alpha,value) (This)->lpVtbl->CreateWithAlpha(This,format,width,height,alpha,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_QueryInterface(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_AddRef(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_Release(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetIids(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetTrustLevel(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISoftwareBitmapFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_Create(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,INT32 width,INT32 height,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->Create(This,format,width,height,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_CreateWithAlpha(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,INT32 width,INT32 height,__x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->CreateWithAlpha(This,format,width,height,alpha,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Imaging
#define IID_ISoftwareBitmapFactory IID___x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory
#define ISoftwareBitmapFactoryVtbl __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactoryVtbl
#define ISoftwareBitmapFactory __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory
#define ISoftwareBitmapFactory_QueryInterface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_QueryInterface
#define ISoftwareBitmapFactory_AddRef __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_AddRef
#define ISoftwareBitmapFactory_Release __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_Release
#define ISoftwareBitmapFactory_GetIids __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetIids
#define ISoftwareBitmapFactory_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetRuntimeClassName
#define ISoftwareBitmapFactory_GetTrustLevel __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_GetTrustLevel
#define ISoftwareBitmapFactory_Create __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_Create
#define ISoftwareBitmapFactory_CreateWithAlpha __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_CreateWithAlpha
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ISoftwareBitmapStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics, 0xdf0385db, 0x672f, 0x4a9d, 0x80,0x6e, 0xc2,0x44,0x2f,0x34,0x3e,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Imaging {
                MIDL_INTERFACE("df0385db-672f-4a9d-806e-c2442f343e86")
                ISoftwareBitmapStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Copy(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap *source,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Convert(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap *source,
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat format,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ConvertWithAlpha(
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap *source,
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat format,
                        ABI::Windows::Graphics::Imaging::BitmapAlphaMode alpha,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateCopyFromBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *source,
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateCopyWithAlphaFromBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *source,
                        ABI::Windows::Graphics::Imaging::BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        ABI::Windows::Graphics::Imaging::BitmapAlphaMode alpha,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateCopyFromSurfaceAsync(
                        ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface *surface,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateCopyWithAlphaFromSurfaceAsync(
                        ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface *surface,
                        ABI::Windows::Graphics::Imaging::BitmapAlphaMode alpha,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics, 0xdf0385db, 0x672f, 0x4a9d, 0x80,0x6e, 0xc2,0x44,0x2f,0x34,0x3e,0x86)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISoftwareBitmapStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *Copy)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *source,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *Convert)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *source,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *ConvertWithAlpha)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *source,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *CreateCopyFromBuffer)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *source,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        INT32 width,
        INT32 height,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *CreateCopyWithAlphaFromBuffer)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *source,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        INT32 width,
        INT32 height,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *CreateCopyFromSurfaceAsync)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DSurface *surface,
        __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap **value);

    HRESULT (STDMETHODCALLTYPE *CreateCopyWithAlphaFromSurfaceAsync)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics *This,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DSurface *surface,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,
        __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStaticsVtbl;

interface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISoftwareBitmapStatics methods ***/
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Copy(This,source,value) (This)->lpVtbl->Copy(This,source,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Convert(This,source,format,value) (This)->lpVtbl->Convert(This,source,format,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_ConvertWithAlpha(This,source,format,alpha,value) (This)->lpVtbl->ConvertWithAlpha(This,source,format,alpha,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyFromBuffer(This,source,format,width,height,value) (This)->lpVtbl->CreateCopyFromBuffer(This,source,format,width,height,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyWithAlphaFromBuffer(This,source,format,width,height,alpha,value) (This)->lpVtbl->CreateCopyWithAlphaFromBuffer(This,source,format,width,height,alpha,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyFromSurfaceAsync(This,surface,value) (This)->lpVtbl->CreateCopyFromSurfaceAsync(This,surface,value)
#define __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyWithAlphaFromSurfaceAsync(This,surface,alpha,value) (This)->lpVtbl->CreateCopyWithAlphaFromSurfaceAsync(This,surface,alpha,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_QueryInterface(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_AddRef(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Release(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetIids(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetTrustLevel(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISoftwareBitmapStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Copy(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *source,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->Copy(This,source,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Convert(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *source,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->Convert(This,source,format,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_ConvertWithAlpha(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *source,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,__x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->ConvertWithAlpha(This,source,format,alpha,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyFromBuffer(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *source,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,INT32 width,INT32 height,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->CreateCopyFromBuffer(This,source,format,width,height,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyWithAlphaFromBuffer(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *source,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,INT32 width,INT32 height,__x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->CreateCopyWithAlphaFromBuffer(This,source,format,width,height,alpha,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyFromSurfaceAsync(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DSurface *surface,__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap **value) {
    return This->lpVtbl->CreateCopyFromSurfaceAsync(This,surface,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyWithAlphaFromSurfaceAsync(__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DSurface *surface,__x_ABI_CWindows_CGraphics_CImaging_CBitmapAlphaMode alpha,__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap **value) {
    return This->lpVtbl->CreateCopyWithAlphaFromSurfaceAsync(This,surface,alpha,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Imaging
#define IID_ISoftwareBitmapStatics IID___x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics
#define ISoftwareBitmapStaticsVtbl __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStaticsVtbl
#define ISoftwareBitmapStatics __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics
#define ISoftwareBitmapStatics_QueryInterface __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_QueryInterface
#define ISoftwareBitmapStatics_AddRef __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_AddRef
#define ISoftwareBitmapStatics_Release __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Release
#define ISoftwareBitmapStatics_GetIids __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetIids
#define ISoftwareBitmapStatics_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetRuntimeClassName
#define ISoftwareBitmapStatics_GetTrustLevel __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_GetTrustLevel
#define ISoftwareBitmapStatics_Copy __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Copy
#define ISoftwareBitmapStatics_Convert __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_Convert
#define ISoftwareBitmapStatics_ConvertWithAlpha __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_ConvertWithAlpha
#define ISoftwareBitmapStatics_CreateCopyFromBuffer __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyFromBuffer
#define ISoftwareBitmapStatics_CreateCopyWithAlphaFromBuffer __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyWithAlphaFromBuffer
#define ISoftwareBitmapStatics_CreateCopyFromSurfaceAsync __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyFromSurfaceAsync
#define ISoftwareBitmapStatics_CreateCopyWithAlphaFromSurfaceAsync __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_CreateCopyWithAlphaFromSurfaceAsync
#endif /* WIDL_using_Windows_Graphics_Imaging */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmapStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Graphics.Imaging.BitmapBuffer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Graphics_Imaging_BitmapBuffer_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Imaging_BitmapBuffer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Imaging_BitmapBuffer[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','I','m','a','g','i','n','g','.','B','i','t','m','a','p','B','u','f','f','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Imaging_BitmapBuffer[] = L"Windows.Graphics.Imaging.BitmapBuffer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Imaging_BitmapBuffer[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','I','m','a','g','i','n','g','.','B','i','t','m','a','p','B','u','f','f','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Imaging_BitmapBuffer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Graphics.Imaging.SoftwareBitmap
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Graphics_Imaging_SoftwareBitmap_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Imaging_SoftwareBitmap_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Imaging_SoftwareBitmap[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','I','m','a','g','i','n','g','.','S','o','f','t','w','a','r','e','B','i','t','m','a','p',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Imaging_SoftwareBitmap[] = L"Windows.Graphics.Imaging.SoftwareBitmap";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Imaging_SoftwareBitmap[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','I','m','a','g','i','n','g','.','S','o','f','t','w','a','r','e','B','i','t','m','a','p',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Imaging_SoftwareBitmap_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > interface
 */
#ifndef ____FIIterable_1_BitmapPixelFormat_INTERFACE_DEFINED__
#define ____FIIterable_1_BitmapPixelFormat_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_BitmapPixelFormat, 0xe924d9ed, 0xa13e, 0x5bdb, 0x9e,0xd8, 0x65,0xa1,0x47,0x4d,0xc2,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e924d9ed-a13e-5bdb-9ed8-65a1474dc274")
                IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > : IIterable_impl<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_BitmapPixelFormat, 0xe924d9ed, 0xa13e, 0x5bdb, 0x9e,0xd8, 0x65,0xa1,0x47,0x4d,0xc2,0x74)
#endif
#else
typedef struct __FIIterable_1_BitmapPixelFormatVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_BitmapPixelFormat *This,
        __FIIterator_1_BitmapPixelFormat **value);

    END_INTERFACE
} __FIIterable_1_BitmapPixelFormatVtbl;

interface __FIIterable_1_BitmapPixelFormat {
    CONST_VTBL __FIIterable_1_BitmapPixelFormatVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_BitmapPixelFormat_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_BitmapPixelFormat_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_BitmapPixelFormat_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_BitmapPixelFormat_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_BitmapPixelFormat_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_BitmapPixelFormat_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
#define __FIIterable_1_BitmapPixelFormat_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_BitmapPixelFormat_QueryInterface(__FIIterable_1_BitmapPixelFormat* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_BitmapPixelFormat_AddRef(__FIIterable_1_BitmapPixelFormat* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_BitmapPixelFormat_Release(__FIIterable_1_BitmapPixelFormat* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_BitmapPixelFormat_GetIids(__FIIterable_1_BitmapPixelFormat* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_BitmapPixelFormat_GetRuntimeClassName(__FIIterable_1_BitmapPixelFormat* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_BitmapPixelFormat_GetTrustLevel(__FIIterable_1_BitmapPixelFormat* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_BitmapPixelFormat_First(__FIIterable_1_BitmapPixelFormat* This,__FIIterator_1_BitmapPixelFormat **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_BitmapPixelFormat IID___FIIterable_1_BitmapPixelFormat
#define IIterable_BitmapPixelFormatVtbl __FIIterable_1_BitmapPixelFormatVtbl
#define IIterable_BitmapPixelFormat __FIIterable_1_BitmapPixelFormat
#define IIterable_BitmapPixelFormat_QueryInterface __FIIterable_1_BitmapPixelFormat_QueryInterface
#define IIterable_BitmapPixelFormat_AddRef __FIIterable_1_BitmapPixelFormat_AddRef
#define IIterable_BitmapPixelFormat_Release __FIIterable_1_BitmapPixelFormat_Release
#define IIterable_BitmapPixelFormat_GetIids __FIIterable_1_BitmapPixelFormat_GetIids
#define IIterable_BitmapPixelFormat_GetRuntimeClassName __FIIterable_1_BitmapPixelFormat_GetRuntimeClassName
#define IIterable_BitmapPixelFormat_GetTrustLevel __FIIterable_1_BitmapPixelFormat_GetTrustLevel
#define IIterable_BitmapPixelFormat_First __FIIterable_1_BitmapPixelFormat_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_BitmapPixelFormat_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > interface
 */
#ifndef ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0x22d3a30f, 0x0898, 0x5e94, 0x99,0xa3, 0xaf,0xa5,0x95,0x1d,0xfc,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("22d3a30f-0898-5e94-99a3-afa5951dfcd4")
                IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Imaging::SoftwareBitmap*, ABI::Windows::Graphics::Imaging::ISoftwareBitmap* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0x22d3a30f, 0x0898, 0x5e94, 0x99,0xa3, 0xaf,0xa5,0x95,0x1d,0xfc,0xd4)
#endif
#else
typedef struct __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl;

interface __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap {
    CONST_VTBL __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
#define __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_First(__FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_SoftwareBitmap IID___FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IIterable_SoftwareBitmapVtbl __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl
#define IIterable_SoftwareBitmap __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IIterable_SoftwareBitmap_QueryInterface __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface
#define IIterable_SoftwareBitmap_AddRef __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef
#define IIterable_SoftwareBitmap_Release __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release
#define IIterable_SoftwareBitmap_GetIids __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids
#define IIterable_SoftwareBitmap_GetRuntimeClassName __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName
#define IIterable_SoftwareBitmap_GetTrustLevel __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel
#define IIterable_SoftwareBitmap_First __FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > interface
 */
#ifndef ____FIIterator_1_BitmapPixelFormat_INTERFACE_DEFINED__
#define ____FIIterator_1_BitmapPixelFormat_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_BitmapPixelFormat, 0x7fc2e293, 0x1084, 0x5d45, 0xb8,0xb8, 0x93,0xe1,0x06,0x92,0xbc,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("7fc2e293-1084-5d45-b8b8-93e10692bcc8")
                IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > : IIterator_impl<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_BitmapPixelFormat, 0x7fc2e293, 0x1084, 0x5d45, 0xb8,0xb8, 0x93,0xe1,0x06,0x92,0xbc,0xc8)
#endif
#else
typedef struct __FIIterator_1_BitmapPixelFormatVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_BitmapPixelFormat *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_BitmapPixelFormat *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_BitmapPixelFormatVtbl;

interface __FIIterator_1_BitmapPixelFormat {
    CONST_VTBL __FIIterator_1_BitmapPixelFormatVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_BitmapPixelFormat_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_BitmapPixelFormat_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_BitmapPixelFormat_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_BitmapPixelFormat_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_BitmapPixelFormat_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_BitmapPixelFormat_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
#define __FIIterator_1_BitmapPixelFormat_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_BitmapPixelFormat_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_BitmapPixelFormat_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_BitmapPixelFormat_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_QueryInterface(__FIIterator_1_BitmapPixelFormat* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_BitmapPixelFormat_AddRef(__FIIterator_1_BitmapPixelFormat* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_BitmapPixelFormat_Release(__FIIterator_1_BitmapPixelFormat* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_GetIids(__FIIterator_1_BitmapPixelFormat* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_GetRuntimeClassName(__FIIterator_1_BitmapPixelFormat* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_GetTrustLevel(__FIIterator_1_BitmapPixelFormat* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_get_Current(__FIIterator_1_BitmapPixelFormat* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_get_HasCurrent(__FIIterator_1_BitmapPixelFormat* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_MoveNext(__FIIterator_1_BitmapPixelFormat* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_BitmapPixelFormat_GetMany(__FIIterator_1_BitmapPixelFormat* This,UINT32 items_size,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_BitmapPixelFormat IID___FIIterator_1_BitmapPixelFormat
#define IIterator_BitmapPixelFormatVtbl __FIIterator_1_BitmapPixelFormatVtbl
#define IIterator_BitmapPixelFormat __FIIterator_1_BitmapPixelFormat
#define IIterator_BitmapPixelFormat_QueryInterface __FIIterator_1_BitmapPixelFormat_QueryInterface
#define IIterator_BitmapPixelFormat_AddRef __FIIterator_1_BitmapPixelFormat_AddRef
#define IIterator_BitmapPixelFormat_Release __FIIterator_1_BitmapPixelFormat_Release
#define IIterator_BitmapPixelFormat_GetIids __FIIterator_1_BitmapPixelFormat_GetIids
#define IIterator_BitmapPixelFormat_GetRuntimeClassName __FIIterator_1_BitmapPixelFormat_GetRuntimeClassName
#define IIterator_BitmapPixelFormat_GetTrustLevel __FIIterator_1_BitmapPixelFormat_GetTrustLevel
#define IIterator_BitmapPixelFormat_get_Current __FIIterator_1_BitmapPixelFormat_get_Current
#define IIterator_BitmapPixelFormat_get_HasCurrent __FIIterator_1_BitmapPixelFormat_get_HasCurrent
#define IIterator_BitmapPixelFormat_MoveNext __FIIterator_1_BitmapPixelFormat_MoveNext
#define IIterator_BitmapPixelFormat_GetMany __FIIterator_1_BitmapPixelFormat_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_BitmapPixelFormat_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > interface
 */
#ifndef ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0xcd12e4c3, 0x8ca8, 0x5be6, 0xb6,0x4b, 0x20,0x4a,0x01,0x4f,0xc6,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("cd12e4c3-8ca8-5be6-b64b-204a014fc620")
                IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Imaging::SoftwareBitmap*, ABI::Windows::Graphics::Imaging::ISoftwareBitmap* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0xcd12e4c3, 0x8ca8, 0x5be6, 0xb6,0x4b, 0x20,0x4a,0x01,0x4f,0xc6,0x20)
#endif
#else
typedef struct __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl;

interface __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap {
    CONST_VTBL __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_Current(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_HasCurrent(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_MoveNext(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetMany(__FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,UINT32 items_size,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_SoftwareBitmap IID___FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IIterator_SoftwareBitmapVtbl __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl
#define IIterator_SoftwareBitmap __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IIterator_SoftwareBitmap_QueryInterface __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface
#define IIterator_SoftwareBitmap_AddRef __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef
#define IIterator_SoftwareBitmap_Release __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release
#define IIterator_SoftwareBitmap_GetIids __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids
#define IIterator_SoftwareBitmap_GetRuntimeClassName __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName
#define IIterator_SoftwareBitmap_GetTrustLevel __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel
#define IIterator_SoftwareBitmap_get_Current __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_Current
#define IIterator_SoftwareBitmap_get_HasCurrent __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_HasCurrent
#define IIterator_SoftwareBitmap_MoveNext __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_MoveNext
#define IIterator_SoftwareBitmap_GetMany __FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > interface
 */
#ifndef ____FIVectorView_1_BitmapPixelFormat_INTERFACE_DEFINED__
#define ____FIVectorView_1_BitmapPixelFormat_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_BitmapPixelFormat, 0x76ac4bc2, 0xc19c, 0x559c, 0xb2,0x87, 0x16,0x94,0xc0,0xdc,0x3a,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("76ac4bc2-c19c-559c-b287-1694c0dc3a0d")
                IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > : IVectorView_impl<ABI::Windows::Graphics::Imaging::BitmapPixelFormat >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_BitmapPixelFormat, 0x76ac4bc2, 0xc19c, 0x559c, 0xb2,0x87, 0x16,0x94,0xc0,0xdc,0x3a,0x0d)
#endif
#else
typedef struct __FIVectorView_1_BitmapPixelFormatVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_BitmapPixelFormat *This,
        UINT32 index,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_BitmapPixelFormat *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_BitmapPixelFormat *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_BitmapPixelFormatVtbl;

interface __FIVectorView_1_BitmapPixelFormat {
    CONST_VTBL __FIVectorView_1_BitmapPixelFormatVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_BitmapPixelFormat_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_BitmapPixelFormat_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_BitmapPixelFormat_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_BitmapPixelFormat_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_BitmapPixelFormat_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_BitmapPixelFormat_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
#define __FIVectorView_1_BitmapPixelFormat_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_BitmapPixelFormat_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_BitmapPixelFormat_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_BitmapPixelFormat_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_BitmapPixelFormat_QueryInterface(__FIVectorView_1_BitmapPixelFormat* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_BitmapPixelFormat_AddRef(__FIVectorView_1_BitmapPixelFormat* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_BitmapPixelFormat_Release(__FIVectorView_1_BitmapPixelFormat* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_GetIids(__FIVectorView_1_BitmapPixelFormat* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_GetRuntimeClassName(__FIVectorView_1_BitmapPixelFormat* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_GetTrustLevel(__FIVectorView_1_BitmapPixelFormat* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Graphics::Imaging::BitmapPixelFormat > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_GetAt(__FIVectorView_1_BitmapPixelFormat* This,UINT32 index,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_get_Size(__FIVectorView_1_BitmapPixelFormat* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_IndexOf(__FIVectorView_1_BitmapPixelFormat* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_BitmapPixelFormat_GetMany(__FIVectorView_1_BitmapPixelFormat* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_BitmapPixelFormat IID___FIVectorView_1_BitmapPixelFormat
#define IVectorView_BitmapPixelFormatVtbl __FIVectorView_1_BitmapPixelFormatVtbl
#define IVectorView_BitmapPixelFormat __FIVectorView_1_BitmapPixelFormat
#define IVectorView_BitmapPixelFormat_QueryInterface __FIVectorView_1_BitmapPixelFormat_QueryInterface
#define IVectorView_BitmapPixelFormat_AddRef __FIVectorView_1_BitmapPixelFormat_AddRef
#define IVectorView_BitmapPixelFormat_Release __FIVectorView_1_BitmapPixelFormat_Release
#define IVectorView_BitmapPixelFormat_GetIids __FIVectorView_1_BitmapPixelFormat_GetIids
#define IVectorView_BitmapPixelFormat_GetRuntimeClassName __FIVectorView_1_BitmapPixelFormat_GetRuntimeClassName
#define IVectorView_BitmapPixelFormat_GetTrustLevel __FIVectorView_1_BitmapPixelFormat_GetTrustLevel
#define IVectorView_BitmapPixelFormat_GetAt __FIVectorView_1_BitmapPixelFormat_GetAt
#define IVectorView_BitmapPixelFormat_get_Size __FIVectorView_1_BitmapPixelFormat_get_Size
#define IVectorView_BitmapPixelFormat_IndexOf __FIVectorView_1_BitmapPixelFormat_IndexOf
#define IVectorView_BitmapPixelFormat_GetMany __FIVectorView_1_BitmapPixelFormat_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_BitmapPixelFormat_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0xc4a10980, 0x714b, 0x5501, 0x8d,0xa2, 0xdb,0xda,0xcc,0xe7,0x0f,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c4a10980-714b-5501-8da2-dbdacce70f73")
            IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Imaging::SoftwareBitmap*, ABI::Windows::Graphics::Imaging::ISoftwareBitmap* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0xc4a10980, 0x714b, 0x5501, 0x8d,0xa2, 0xdb,0xda,0xcc,0xe7,0x0f,0x73)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl;

interface __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap {
    CONST_VTBL __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_put_Completed(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_Completed(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetResults(__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,__x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_SoftwareBitmap IID___FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IAsyncOperation_SoftwareBitmapVtbl __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl
#define IAsyncOperation_SoftwareBitmap __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IAsyncOperation_SoftwareBitmap_QueryInterface __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface
#define IAsyncOperation_SoftwareBitmap_AddRef __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef
#define IAsyncOperation_SoftwareBitmap_Release __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release
#define IAsyncOperation_SoftwareBitmap_GetIids __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetIids
#define IAsyncOperation_SoftwareBitmap_GetRuntimeClassName __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetRuntimeClassName
#define IAsyncOperation_SoftwareBitmap_GetTrustLevel __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetTrustLevel
#define IAsyncOperation_SoftwareBitmap_put_Completed __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_put_Completed
#define IAsyncOperation_SoftwareBitmap_get_Completed __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_get_Completed
#define IAsyncOperation_SoftwareBitmap_GetResults __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0xb699b653, 0x33ed, 0x5e2d, 0xa7,0x5f, 0x02,0xbf,0x90,0xe3,0x26,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b699b653-33ed-5e2d-a75f-02bf90e32619")
            IAsyncOperationCompletedHandler<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Imaging::SoftwareBitmap*, ABI::Windows::Graphics::Imaging::ISoftwareBitmap* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap, 0xb699b653, 0x33ed, 0x5e2d, 0xa7,0x5f, 0x02,0xbf,0x90,0xe3,0x26,0x19)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap *This,
        __FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release(__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Graphics::Imaging::SoftwareBitmap* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap* This,__FIAsyncOperation_1_Windows__CGraphics__CImaging__CSoftwareBitmap *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_SoftwareBitmap IID___FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IAsyncOperationCompletedHandler_SoftwareBitmapVtbl __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmapVtbl
#define IAsyncOperationCompletedHandler_SoftwareBitmap __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap
#define IAsyncOperationCompletedHandler_SoftwareBitmap_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_QueryInterface
#define IAsyncOperationCompletedHandler_SoftwareBitmap_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_AddRef
#define IAsyncOperationCompletedHandler_SoftwareBitmap_Release __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Release
#define IAsyncOperationCompletedHandler_SoftwareBitmap_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CGraphics__CImaging__CSoftwareBitmap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Graphics::Imaging::BitmapBounds > interface
 */
#ifndef ____FIReference_1_BitmapBounds_INTERFACE_DEFINED__
#define ____FIReference_1_BitmapBounds_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_BitmapBounds, 0xaa19da70, 0xdee6, 0x5b42, 0xb5,0x62, 0x2f,0xcd,0x21,0x8c,0x34,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("aa19da70-dee6-5b42-b562-2fcd218c34ca")
            IReference<ABI::Windows::Graphics::Imaging::BitmapBounds > : IReference_impl<ABI::Windows::Graphics::Imaging::BitmapBounds >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_BitmapBounds, 0xaa19da70, 0xdee6, 0x5b42, 0xb5,0x62, 0x2f,0xcd,0x21,0x8c,0x34,0xca)
#endif
#else
typedef struct __FIReference_1_BitmapBoundsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<ABI::Windows::Graphics::Imaging::BitmapBounds > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_BitmapBounds *This,
        __x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds *value);

    END_INTERFACE
} __FIReference_1_BitmapBoundsVtbl;

interface __FIReference_1_BitmapBounds {
    CONST_VTBL __FIReference_1_BitmapBoundsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_BitmapBounds_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_BitmapBounds_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_BitmapBounds_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_BitmapBounds_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_BitmapBounds_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_BitmapBounds_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Graphics::Imaging::BitmapBounds > methods ***/
#define __FIReference_1_BitmapBounds_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_BitmapBounds_QueryInterface(__FIReference_1_BitmapBounds* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIReference_1_BitmapBounds_AddRef(__FIReference_1_BitmapBounds* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIReference_1_BitmapBounds_Release(__FIReference_1_BitmapBounds* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_BitmapBounds_GetIids(__FIReference_1_BitmapBounds* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIReference_1_BitmapBounds_GetRuntimeClassName(__FIReference_1_BitmapBounds* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIReference_1_BitmapBounds_GetTrustLevel(__FIReference_1_BitmapBounds* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Graphics::Imaging::BitmapBounds > methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_BitmapBounds_get_Value(__FIReference_1_BitmapBounds* This,__x_ABI_CWindows_CGraphics_CImaging_CBitmapBounds *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_BitmapBounds IID___FIReference_1_BitmapBounds
#define IReference_BitmapBoundsVtbl __FIReference_1_BitmapBoundsVtbl
#define IReference_BitmapBounds __FIReference_1_BitmapBounds
#define IReference_BitmapBounds_QueryInterface __FIReference_1_BitmapBounds_QueryInterface
#define IReference_BitmapBounds_AddRef __FIReference_1_BitmapBounds_AddRef
#define IReference_BitmapBounds_Release __FIReference_1_BitmapBounds_Release
#define IReference_BitmapBounds_GetIids __FIReference_1_BitmapBounds_GetIids
#define IReference_BitmapBounds_GetRuntimeClassName __FIReference_1_BitmapBounds_GetRuntimeClassName
#define IReference_BitmapBounds_GetTrustLevel __FIReference_1_BitmapBounds_GetTrustLevel
#define IReference_BitmapBounds_get_Value __FIReference_1_BitmapBounds_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_BitmapBounds_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_graphics_imaging_h__ */
