/*** Autogenerated by WIDL 9.8 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,
                        struct 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,
        struct __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,struct __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(
                        enum BitmapPixelFormat *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BitmapAlphaMode(
                        enum 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(
                        enum 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,
        enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value);

    HRESULT (STDMETHODCALLTYPE *get_BitmapAlphaMode)(
        __x_ABI_CWindows_CGraphics_CImaging_CISoftwareBitmap *This,
        enum __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,
        enum __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,enum __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,enum __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,enum __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(
                        enum BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithAlpha(
                        enum BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        enum 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,
        enum __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,
        enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        INT32 width,
        INT32 height,
        enum __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,enum __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,enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,INT32 width,INT32 height,enum __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,
                        enum BitmapPixelFormat format,
                        ABI::Windows::Graphics::Imaging::ISoftwareBitmap **value) = 0;

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

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

                    virtual HRESULT STDMETHODCALLTYPE CreateCopyWithAlphaFromBuffer(
                        ABI::Windows::Storage::Streams::IBuffer *source,
                        enum BitmapPixelFormat format,
                        INT32 width,
                        INT32 height,
                        enum 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,
                        enum 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,
        enum __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,
        enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        enum __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,
        enum __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,
        enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,
        INT32 width,
        INT32 height,
        enum __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,
        enum __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,enum __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,enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,enum __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,enum __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,enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat format,INT32 width,INT32 height,enum __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,enum __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,
        enum __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,
        enum __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,enum __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,enum __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,
        enum __x_ABI_CWindows_CGraphics_CImaging_CBitmapPixelFormat *value);

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

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

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