/*** Autogenerated by WIDL 1.0 from include/wincodec.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wincodec_h__
#define __wincodec_h__

/* Forward declarations */

#ifndef __IWICColorContext_FWD_DEFINED__
#define __IWICColorContext_FWD_DEFINED__
typedef interface IWICColorContext IWICColorContext;
#endif

#ifndef __IWICBitmapSource_FWD_DEFINED__
#define __IWICBitmapSource_FWD_DEFINED__
typedef interface IWICBitmapSource IWICBitmapSource;
#endif

#ifndef __IWICBitmapLock_FWD_DEFINED__
#define __IWICBitmapLock_FWD_DEFINED__
typedef interface IWICBitmapLock IWICBitmapLock;
#endif

#ifndef __IWICBitmapFlipRotator_FWD_DEFINED__
#define __IWICBitmapFlipRotator_FWD_DEFINED__
typedef interface IWICBitmapFlipRotator IWICBitmapFlipRotator;
#endif

#ifndef __IWICBitmap_FWD_DEFINED__
#define __IWICBitmap_FWD_DEFINED__
typedef interface IWICBitmap IWICBitmap;
#endif

#ifndef __IWICPalette_FWD_DEFINED__
#define __IWICPalette_FWD_DEFINED__
typedef interface IWICPalette IWICPalette;
#endif

#ifndef __IWICComponentInfo_FWD_DEFINED__
#define __IWICComponentInfo_FWD_DEFINED__
typedef interface IWICComponentInfo IWICComponentInfo;
#endif

#ifndef __IWICMetadataQueryReader_FWD_DEFINED__
#define __IWICMetadataQueryReader_FWD_DEFINED__
typedef interface IWICMetadataQueryReader IWICMetadataQueryReader;
#endif

#ifndef __IWICMetadataQueryWriter_FWD_DEFINED__
#define __IWICMetadataQueryWriter_FWD_DEFINED__
typedef interface IWICMetadataQueryWriter IWICMetadataQueryWriter;
#endif

#ifndef __IWICBitmapFrameDecode_FWD_DEFINED__
#define __IWICBitmapFrameDecode_FWD_DEFINED__
typedef interface IWICBitmapFrameDecode IWICBitmapFrameDecode;
#endif

#ifndef __IWICPixelFormatInfo_FWD_DEFINED__
#define __IWICPixelFormatInfo_FWD_DEFINED__
typedef interface IWICPixelFormatInfo IWICPixelFormatInfo;
#endif

#ifndef __IWICPixelFormatInfo2_FWD_DEFINED__
#define __IWICPixelFormatInfo2_FWD_DEFINED__
typedef interface IWICPixelFormatInfo2 IWICPixelFormatInfo2;
#endif

#ifndef __IWICBitmapCodecInfo_FWD_DEFINED__
#define __IWICBitmapCodecInfo_FWD_DEFINED__
typedef interface IWICBitmapCodecInfo IWICBitmapCodecInfo;
#endif

#ifndef __IWICBitmapDecoderInfo_FWD_DEFINED__
#define __IWICBitmapDecoderInfo_FWD_DEFINED__
typedef interface IWICBitmapDecoderInfo IWICBitmapDecoderInfo;
#endif

#ifndef __IWICBitmapDecoder_FWD_DEFINED__
#define __IWICBitmapDecoder_FWD_DEFINED__
typedef interface IWICBitmapDecoder IWICBitmapDecoder;
#endif

#ifndef __IWICBitmapFrameEncode_FWD_DEFINED__
#define __IWICBitmapFrameEncode_FWD_DEFINED__
typedef interface IWICBitmapFrameEncode IWICBitmapFrameEncode;
#endif

#ifndef __IWICBitmapEncoderInfo_FWD_DEFINED__
#define __IWICBitmapEncoderInfo_FWD_DEFINED__
typedef interface IWICBitmapEncoderInfo IWICBitmapEncoderInfo;
#endif

#ifndef __IWICBitmapEncoder_FWD_DEFINED__
#define __IWICBitmapEncoder_FWD_DEFINED__
typedef interface IWICBitmapEncoder IWICBitmapEncoder;
#endif

#ifndef __IWICFormatConverter_FWD_DEFINED__
#define __IWICFormatConverter_FWD_DEFINED__
typedef interface IWICFormatConverter IWICFormatConverter;
#endif

#ifndef __IWICFormatConverterInfo_FWD_DEFINED__
#define __IWICFormatConverterInfo_FWD_DEFINED__
typedef interface IWICFormatConverterInfo IWICFormatConverterInfo;
#endif

#ifndef __IWICStream_FWD_DEFINED__
#define __IWICStream_FWD_DEFINED__
typedef interface IWICStream IWICStream;
#endif

#ifndef __IWICBitmapScaler_FWD_DEFINED__
#define __IWICBitmapScaler_FWD_DEFINED__
typedef interface IWICBitmapScaler IWICBitmapScaler;
#endif

#ifndef __IWICBitmapClipper_FWD_DEFINED__
#define __IWICBitmapClipper_FWD_DEFINED__
typedef interface IWICBitmapClipper IWICBitmapClipper;
#endif

#ifndef __IWICColorTransform_FWD_DEFINED__
#define __IWICColorTransform_FWD_DEFINED__
typedef interface IWICColorTransform IWICColorTransform;
#endif

#ifndef __IWICFastMetadataEncoder_FWD_DEFINED__
#define __IWICFastMetadataEncoder_FWD_DEFINED__
typedef interface IWICFastMetadataEncoder IWICFastMetadataEncoder;
#endif

#ifndef __IWICImagingFactory_FWD_DEFINED__
#define __IWICImagingFactory_FWD_DEFINED__
typedef interface IWICImagingFactory IWICImagingFactory;
#endif

#ifndef __IWICEnumMetadataItem_FWD_DEFINED__
#define __IWICEnumMetadataItem_FWD_DEFINED__
typedef interface IWICEnumMetadataItem IWICEnumMetadataItem;
#endif

/* Headers for imported files */

#include <wtypes.h>
#include <propidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#define WINCODEC_SDK_VERSION 0x0236
typedef enum WICDecodeOptions {
    WICDecodeMetadataCacheOnDemand = 0x0,
    WICDecodeMetadataCacheOnLoad = 0x1,
    WICMETADATACACHEOPTION_FORCE_DWORD = 0x7fffffff
} WICDecodeOptions;
typedef enum WICBitmapCreateCacheOption {
    WICBitmapNoCache = 0x0,
    WICBitmapCacheOnDemand = 0x1,
    WICBitmapCacheOnLoad = 0x2,
    WICBITMAPCREATECACHEOPTION_FORCE_DWORD = 0x7fffffff
} WICBitmapCreateCacheOption;
typedef enum WICBitmapAlphaChannelOption {
    WICBitmapUseAlpha = 0x0,
    WICBitmapUsePremultipliedAlpha = 0x1,
    WICBitmapIgnoreAlpha = 0x2,
    WICBITMAPALPHACHANNELOPTIONS_FORCE_DWORD = 0x7fffffff
} WICBitmapAlphaChannelOption;
typedef enum WICBitmapDecoderCapabilities {
    WICBitmapDecoderCapabilitySameEncoder = 0x1,
    WICBitmapDecoderCapabilityCanDecodeAllImages = 0x2,
    WICBitmapDecoderCapabilityCanDecodeSomeImages = 0x4,
    WICBitmapDecoderCapabilityCanEnumerateMetadata = 0x8,
    WICBitmapDecoderCapabilityCanDecodeThumbnail = 0x10
} WICBitmapDecoderCapabilities;
typedef enum WICBitmapDitherType {
    WICBitmapDitherTypeNone = 0x0,
    WICBitmapDitherTypeSolid = 0x0,
    WICBitmapDitherTypeOrdered4x4 = 0x1,
    WICBitmapDitherTypeOrdered8x8 = 0x2,
    WICBitmapDitherTypeOrdered16x16 = 0x3,
    WICBitmapDitherTypeSpiral4x4 = 0x4,
    WICBitmapDitherTypeSpiral8x8 = 0x5,
    WICBitmapDitherTypeDualSpiral4x4 = 0x6,
    WICBitmapDitherTypeDualSpiral8x8 = 0x7,
    WICBitmapDitherTypeErrorDiffusion = 0x8,
    WICBITMAPDITHERTYPE_FORCE_DWORD = 0x7fffffff
} WICBitmapDitherType;
typedef enum WICBitmapEncoderCacheOption {
    WICBitmapEncoderCacheInMemory = 0x0,
    WICBitmapEncoderCacheTempFile = 0x1,
    WICBitmapEncoderNoCache = 0x2,
    WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = 0x7fffffff
} WICBitmapEncoderCacheOption;
typedef enum WICBitmapInterpolationMode {
    WICBitmapInterpolationModeNearestNeighbor = 0x0,
    WICBitmapInterpolationModeLinear = 0x1,
    WICBitmapInterpolationModeCubic = 0x2,
    WICBitmapInterpolationModeFant = 0x3,
    WICBITMAPINTERPOLATIONMODE_FORCE_DWORD = 0x7fffffff
} WICBitmapInterpolationMode;
typedef enum WICBitmapLockFlags {
    WICBitmapLockRead = 0x1,
    WICBitmapLockWrite = 0x2,
    WICBITMAPLOCKFLAGS_FORCE_DWORD = 0x7fffffff
} WICBitmapLockFlags;
typedef enum WICBitmapPaletteType {
    WICBitmapPaletteTypeCustom = 0x0,
    WICBitmapPaletteTypeMedianCut = 0x1,
    WICBitmapPaletteTypeFixedBW = 0x2,
    WICBitmapPaletteTypeFixedHalftone8 = 0x3,
    WICBitmapPaletteTypeFixedHalftone27 = 0x4,
    WICBitmapPaletteTypeFixedHalftone64 = 0x5,
    WICBitmapPaletteTypeFixedHalftone125 = 0x6,
    WICBitmapPaletteTypeFixedHalftone216 = 0x7,
    WICBitmapPaletteTypeFixedWebPalette = WICBitmapPaletteTypeFixedHalftone216,
    WICBitmapPaletteTypeFixedHalftone252 = 0x8,
    WICBitmapPaletteTypeFixedHalftone256 = 0x9,
    WICBitmapPaletteTypeFixedGray4 = 0xa,
    WICBitmapPaletteTypeFixedGray16 = 0xb,
    WICBitmapPaletteTypeFixedGray256 = 0xc,
    WICBITMAPPALETTETYPE_FORCE_DWORD = 0x7fffffff
} WICBitmapPaletteType;
typedef enum WICBitmapTransformOptions {
    WICBitmapTransformRotate0 = 0x0,
    WICBitmapTransformRotate90 = 0x1,
    WICBitmapTransformRotate180 = 0x2,
    WICBitmapTransformRotate270 = 0x3,
    WICBitmapTransformFlipHorizontal = 0x8,
    WICBitmapTransformFlipVertical = 0x10,
    WICBITMAPTRANSFORMOPTIONS_FORCE_DWORD = 0x7fffffff
} WICBitmapTransformOptions;
typedef enum WICColorContextType {
    WICColorContextUninitialized = 0x0,
    WICColorContextProfile = 0x1,
    WICColorContextExifColorSpace = 0x2
} WICColorContextType;
typedef enum WICComponentType {
    WICDecoder = 0x1,
    WICEncoder = 0x2,
    WICPixelFormatConverter = 0x4,
    WICMetadataReader = 0x8,
    WICMetadataWriter = 0x10,
    WICPixelFormat = 0x20,
    WICCOMPONENTTYPE_FORCE_DWORD = 0x7fffffff
} WICComponentType;
typedef enum WICComponentSigning {
    WICComponentSigned = 0x1,
    WICComponentUnsigned = 0x2,
    WICComponentSafe = 0x4,
    WICComponentDisabled = 0x80000000
} WICComponentSigning;
typedef enum WICComponentEnumerateOptions {
    WICComponentEnumerateDefault = 0x0,
    WICComponentEnumerateRefresh = 0x1,
    WICComponentEnumerateBuiltInOnly = 0x20000000,
    WICComponentEnumerateUnsigned = 0x40000000,
    WICComponentEnumerateDisabled = 0x80000000
} WICComponentEnumerateOptions;
typedef enum WICPixelFormatNumericRepresentation {
    WICPixelFormatNumericRepresentationUnspecified = 0x0,
    WICPixelFormatNumericRepresentationIndexed = 0x1,
    WICPixelFormatNumericRepresentationUnsignedInteger = 0x2,
    WICPixelFormatNumericRepresentationSignedInteger = 0x3,
    WICPixelFormatNumericRepresentationFixed = 0x4,
    WICPixelFormatNumericRepresentationFloat = 0x5,
    WICPIXELFORMATNUMERICREPRESENTATION_FORCE_DWORD = 0x7fffffff
} WICPixelFormatNumericRepresentation;
typedef GUID WICPixelFormatGUID;
typedef REFGUID REFWICPixelFormatGUID;
DEFINE_GUID(GUID_WICPixelFormatDontCare, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x00);
#define GUID_WICPixelFormatUndefined GUID_WICPixelFormatDontCare
DEFINE_GUID(GUID_WICPixelFormat1bppIndexed, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x01);
DEFINE_GUID(GUID_WICPixelFormat2bppIndexed, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x02);
DEFINE_GUID(GUID_WICPixelFormat4bppIndexed, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x03);
DEFINE_GUID(GUID_WICPixelFormat8bppIndexed, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x04);
DEFINE_GUID(GUID_WICPixelFormatBlackWhite, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x05);
DEFINE_GUID(GUID_WICPixelFormat2bppGray, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x06);
DEFINE_GUID(GUID_WICPixelFormat4bppGray, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x07);
DEFINE_GUID(GUID_WICPixelFormat8bppGray, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x08);
DEFINE_GUID(GUID_WICPixelFormat16bppGray, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x0b);
DEFINE_GUID(GUID_WICPixelFormat16bppBGR555, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x09);
DEFINE_GUID(GUID_WICPixelFormat16bppBGR565, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x0a);
DEFINE_GUID(GUID_WICPixelFormat16bppBGRA5551, 0x05ec7c2b,0xf1e6,0x4961,0xad,0x46,0xe1,0xcc,0x81,0x0a,0x87,0xd2);
DEFINE_GUID(GUID_WICPixelFormat24bppBGR, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x0c);
DEFINE_GUID(GUID_WICPixelFormat32bppBGR, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x0e);
DEFINE_GUID(GUID_WICPixelFormat32bppBGRA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x0f);
DEFINE_GUID(GUID_WICPixelFormat32bppPBGRA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x10);
DEFINE_GUID(GUID_WICPixelFormat48bppRGB, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x15);
DEFINE_GUID(GUID_WICPixelFormat64bppRGBA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x16);
DEFINE_GUID(GUID_WICPixelFormat64bppPRGBA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x17);
DEFINE_GUID(GUID_WICPixelFormat32bppCMYK, 0x6fddc324,0x4e03,0x4fbe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x1c);
typedef struct WICRect {
    INT X;
    INT Y;
    INT Width;
    INT Height;
} WICRect;
typedef struct WICBitmapPattern {
    ULARGE_INTEGER Position;
    ULONG Length;
    BYTE *Pattern;
    BYTE *Mask;
    WINBOOL EndOfStream;
} WICBitmapPattern;
typedef UINT32 WICColor;
#define WINCODEC_ERR_WRONGSTATE 0x88982f04
#define WINCODEC_ERR_VALUEOUTOFRANGE 0x88982f05
#define WINCODEC_ERR_NOTINITIALIZED 0x88982f0c
#define WINCODEC_ERR_ALREADYLOCKED 0x88982f0d
#define WINCODEC_ERR_PROPERTYNOTFOUND 0x88982f40
#define WINCODEC_ERR_CODECNOTHUMBNAIL 0x88982f44
#define WINCODEC_ERR_PALETTEUNAVAILABLE 0x88982f45
#define WINCODEC_ERR_COMPONENTNOTFOUND 0x88982f50
#define WINCODEC_ERR_FRAMEMISSING 0x88982f62
#define WINCODEC_ERR_BADMETADATAHEADER 0x88982f63
#define WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT 0x88982f80
#define WINCODEC_ERR_UNSUPPORTEDOPERATION 0x88982f81
#define WINCODEC_ERR_INSUFFICIENTBUFFER 0x88982f8c
#ifndef __IWICPalette_FWD_DEFINED__
#define __IWICPalette_FWD_DEFINED__
typedef interface IWICPalette IWICPalette;
#endif

/*****************************************************************************
 * IWICColorContext interface
 */
#ifndef __IWICColorContext_INTERFACE_DEFINED__
#define __IWICColorContext_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICColorContext, 0x3c613a02, 0x34b2, 0x44ea, 0x9a,0x7c, 0x45,0xae,0xa9,0xc6,0xfd,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3c613a02-34b2-44ea-9a7c-45aea9c6fd6d")
IWICColorContext : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitializeFromFilename(
        LPCWSTR wzFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromMemory(
        const BYTE *pbBuffer,
        UINT cbBufferSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromExifColorSpace(
        UINT value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetType(
        WICColorContextType *pType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProfileBytes(
        UINT cbBuffer,
        BYTE *pbBuffer,
        UINT *pcbActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExifColorSpace(
        UINT *pValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICColorContext, 0x3c613a02, 0x34b2, 0x44ea, 0x9a,0x7c, 0x45,0xae,0xa9,0xc6,0xfd,0x6d)
#endif
#else
typedef struct IWICColorContextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICColorContext methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeFromFilename)(
        IWICColorContext* This,
        LPCWSTR wzFilename);

    HRESULT (STDMETHODCALLTYPE *InitializeFromMemory)(
        IWICColorContext* This,
        const BYTE *pbBuffer,
        UINT cbBufferSize);

    HRESULT (STDMETHODCALLTYPE *InitializeFromExifColorSpace)(
        IWICColorContext* This,
        UINT value);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWICColorContext* This,
        WICColorContextType *pType);

    HRESULT (STDMETHODCALLTYPE *GetProfileBytes)(
        IWICColorContext* This,
        UINT cbBuffer,
        BYTE *pbBuffer,
        UINT *pcbActual);

    HRESULT (STDMETHODCALLTYPE *GetExifColorSpace)(
        IWICColorContext* This,
        UINT *pValue);

    END_INTERFACE
} IWICColorContextVtbl;
interface IWICColorContext {
    CONST_VTBL IWICColorContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICColorContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICColorContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICColorContext_Release(This) (This)->lpVtbl->Release(This)
/*** IWICColorContext methods ***/
#define IWICColorContext_InitializeFromFilename(This,wzFilename) (This)->lpVtbl->InitializeFromFilename(This,wzFilename)
#define IWICColorContext_InitializeFromMemory(This,pbBuffer,cbBufferSize) (This)->lpVtbl->InitializeFromMemory(This,pbBuffer,cbBufferSize)
#define IWICColorContext_InitializeFromExifColorSpace(This,value) (This)->lpVtbl->InitializeFromExifColorSpace(This,value)
#define IWICColorContext_GetType(This,pType) (This)->lpVtbl->GetType(This,pType)
#define IWICColorContext_GetProfileBytes(This,cbBuffer,pbBuffer,pcbActual) (This)->lpVtbl->GetProfileBytes(This,cbBuffer,pbBuffer,pcbActual)
#define IWICColorContext_GetExifColorSpace(This,pValue) (This)->lpVtbl->GetExifColorSpace(This,pValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICColorContext_QueryInterface(IWICColorContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICColorContext_AddRef(IWICColorContext* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICColorContext_Release(IWICColorContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICColorContext methods ***/
static FORCEINLINE HRESULT IWICColorContext_InitializeFromFilename(IWICColorContext* This,LPCWSTR wzFilename) {
    return This->lpVtbl->InitializeFromFilename(This,wzFilename);
}
static FORCEINLINE HRESULT IWICColorContext_InitializeFromMemory(IWICColorContext* This,const BYTE *pbBuffer,UINT cbBufferSize) {
    return This->lpVtbl->InitializeFromMemory(This,pbBuffer,cbBufferSize);
}
static FORCEINLINE HRESULT IWICColorContext_InitializeFromExifColorSpace(IWICColorContext* This,UINT value) {
    return This->lpVtbl->InitializeFromExifColorSpace(This,value);
}
static FORCEINLINE HRESULT IWICColorContext_GetType(IWICColorContext* This,WICColorContextType *pType) {
    return This->lpVtbl->GetType(This,pType);
}
static FORCEINLINE HRESULT IWICColorContext_GetProfileBytes(IWICColorContext* This,UINT cbBuffer,BYTE *pbBuffer,UINT *pcbActual) {
    return This->lpVtbl->GetProfileBytes(This,cbBuffer,pbBuffer,pcbActual);
}
static FORCEINLINE HRESULT IWICColorContext_GetExifColorSpace(IWICColorContext* This,UINT *pValue) {
    return This->lpVtbl->GetExifColorSpace(This,pValue);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICColorContext_InitializeFromFilename_Proxy(
    IWICColorContext* This,
    LPCWSTR wzFilename);
void __RPC_STUB IWICColorContext_InitializeFromFilename_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICColorContext_InitializeFromMemory_Proxy(
    IWICColorContext* This,
    const BYTE *pbBuffer,
    UINT cbBufferSize);
void __RPC_STUB IWICColorContext_InitializeFromMemory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICColorContext_InitializeFromExifColorSpace_Proxy(
    IWICColorContext* This,
    UINT value);
void __RPC_STUB IWICColorContext_InitializeFromExifColorSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICColorContext_GetType_Proxy(
    IWICColorContext* This,
    WICColorContextType *pType);
void __RPC_STUB IWICColorContext_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICColorContext_GetProfileBytes_Proxy(
    IWICColorContext* This,
    UINT cbBuffer,
    BYTE *pbBuffer,
    UINT *pcbActual);
void __RPC_STUB IWICColorContext_GetProfileBytes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICColorContext_GetExifColorSpace_Proxy(
    IWICColorContext* This,
    UINT *pValue);
void __RPC_STUB IWICColorContext_GetExifColorSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICColorContext_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapSource interface
 */
#ifndef __IWICBitmapSource_INTERFACE_DEFINED__
#define __IWICBitmapSource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapSource, 0x00000120, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000120-a8f2-4877-ba0a-fd2b6645fb94")
IWICBitmapSource : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSize(
        UINT *puiWidth,
        UINT *puiHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPixelFormat(
        WICPixelFormatGUID *pPixelFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResolution(
        double *pDpiX,
        double *pDpiY) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyPalette(
        IWICPalette *pIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyPixels(
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapSource, 0x00000120, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICBitmapSourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmapSource* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmapSource* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICBitmapSource* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmapSource* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICBitmapSource* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    END_INTERFACE
} IWICBitmapSourceVtbl;
interface IWICBitmapSource {
    CONST_VTBL IWICBitmapSourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapSource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapSource_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICBitmapSource_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICBitmapSource_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICBitmapSource_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICBitmapSource_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmapSource_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapSource_QueryInterface(IWICBitmapSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapSource_AddRef(IWICBitmapSource* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapSource_Release(IWICBitmapSource* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICBitmapSource_GetSize(IWICBitmapSource* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICBitmapSource_GetPixelFormat(IWICBitmapSource* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmapSource_GetResolution(IWICBitmapSource* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICBitmapSource_CopyPalette(IWICBitmapSource* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapSource_CopyPixels(IWICBitmapSource* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapSource_GetSize_Proxy(
    IWICBitmapSource* This,
    UINT *puiWidth,
    UINT *puiHeight);
void __RPC_STUB IWICBitmapSource_GetSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapSource_GetPixelFormat_Proxy(
    IWICBitmapSource* This,
    WICPixelFormatGUID *pPixelFormat);
void __RPC_STUB IWICBitmapSource_GetPixelFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapSource_GetResolution_Proxy(
    IWICBitmapSource* This,
    double *pDpiX,
    double *pDpiY);
void __RPC_STUB IWICBitmapSource_GetResolution_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapSource_CopyPalette_Proxy(
    IWICBitmapSource* This,
    IWICPalette *pIPalette);
void __RPC_STUB IWICBitmapSource_CopyPalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapSource_CopyPixels_Proxy(
    IWICBitmapSource* This,
    const WICRect *prc,
    UINT cbStride,
    UINT cbBufferSize,
    BYTE *pbBuffer);
void __RPC_STUB IWICBitmapSource_CopyPixels_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapSource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapLock interface
 */
#ifndef __IWICBitmapLock_INTERFACE_DEFINED__
#define __IWICBitmapLock_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapLock, 0x00000123, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000123-a8f2-4877-ba0a-fd2b6645fb94")
IWICBitmapLock : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSize(
        UINT *pWidth,
        UINT *pHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStride(
        UINT *pcbStride) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDataPointer(
        UINT *pcbBufferSize,
        BYTE **ppbData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPixelFormat(
        WICPixelFormatGUID *pPixelFormat) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapLock, 0x00000123, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICBitmapLockVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapLock methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmapLock* This,
        UINT *pWidth,
        UINT *pHeight);

    HRESULT (STDMETHODCALLTYPE *GetStride)(
        IWICBitmapLock* This,
        UINT *pcbStride);

    HRESULT (STDMETHODCALLTYPE *GetDataPointer)(
        IWICBitmapLock* This,
        UINT *pcbBufferSize,
        BYTE **ppbData);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmapLock* This,
        WICPixelFormatGUID *pPixelFormat);

    END_INTERFACE
} IWICBitmapLockVtbl;
interface IWICBitmapLock {
    CONST_VTBL IWICBitmapLockVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapLock_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapLock_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapLock_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapLock methods ***/
#define IWICBitmapLock_GetSize(This,pWidth,pHeight) (This)->lpVtbl->GetSize(This,pWidth,pHeight)
#define IWICBitmapLock_GetStride(This,pcbStride) (This)->lpVtbl->GetStride(This,pcbStride)
#define IWICBitmapLock_GetDataPointer(This,pcbBufferSize,ppbData) (This)->lpVtbl->GetDataPointer(This,pcbBufferSize,ppbData)
#define IWICBitmapLock_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapLock_QueryInterface(IWICBitmapLock* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapLock_AddRef(IWICBitmapLock* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapLock_Release(IWICBitmapLock* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapLock methods ***/
static FORCEINLINE HRESULT IWICBitmapLock_GetSize(IWICBitmapLock* This,UINT *pWidth,UINT *pHeight) {
    return This->lpVtbl->GetSize(This,pWidth,pHeight);
}
static FORCEINLINE HRESULT IWICBitmapLock_GetStride(IWICBitmapLock* This,UINT *pcbStride) {
    return This->lpVtbl->GetStride(This,pcbStride);
}
static FORCEINLINE HRESULT IWICBitmapLock_GetDataPointer(IWICBitmapLock* This,UINT *pcbBufferSize,BYTE **ppbData) {
    return This->lpVtbl->GetDataPointer(This,pcbBufferSize,ppbData);
}
static FORCEINLINE HRESULT IWICBitmapLock_GetPixelFormat(IWICBitmapLock* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapLock_GetSize_Proxy(
    IWICBitmapLock* This,
    UINT *pWidth,
    UINT *pHeight);
void __RPC_STUB IWICBitmapLock_GetSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapLock_GetStride_Proxy(
    IWICBitmapLock* This,
    UINT *pcbStride);
void __RPC_STUB IWICBitmapLock_GetStride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapLock_GetDataPointer_Proxy(
    IWICBitmapLock* This,
    UINT *pcbBufferSize,
    BYTE **ppbData);
void __RPC_STUB IWICBitmapLock_GetDataPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapLock_GetPixelFormat_Proxy(
    IWICBitmapLock* This,
    WICPixelFormatGUID *pPixelFormat);
void __RPC_STUB IWICBitmapLock_GetPixelFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapLock_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapFlipRotator interface
 */
#ifndef __IWICBitmapFlipRotator_INTERFACE_DEFINED__
#define __IWICBitmapFlipRotator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapFlipRotator, 0x5009834f, 0x2d6a, 0x41ce, 0x9e,0x1b, 0x17,0xc5,0xaf,0xf7,0xa7,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5009834f-2d6a-41ce-9e1b-17c5aff7a782")
IWICBitmapFlipRotator : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IWICBitmapSource *pISource,
        WICBitmapTransformOptions options) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapFlipRotator, 0x5009834f, 0x2d6a, 0x41ce, 0x9e,0x1b, 0x17,0xc5,0xaf,0xf7,0xa7,0x82)
#endif
#else
typedef struct IWICBitmapFlipRotatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmapFlipRotator* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmapFlipRotator* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICBitmapFlipRotator* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmapFlipRotator* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICBitmapFlipRotator* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICBitmapFlipRotator methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICBitmapFlipRotator* This,
        IWICBitmapSource *pISource,
        WICBitmapTransformOptions options);

    END_INTERFACE
} IWICBitmapFlipRotatorVtbl;
interface IWICBitmapFlipRotator {
    CONST_VTBL IWICBitmapFlipRotatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapFlipRotator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapFlipRotator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapFlipRotator_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICBitmapFlipRotator_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICBitmapFlipRotator_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICBitmapFlipRotator_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICBitmapFlipRotator_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmapFlipRotator_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICBitmapFlipRotator methods ***/
#define IWICBitmapFlipRotator_Initialize(This,pISource,options) (This)->lpVtbl->Initialize(This,pISource,options)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapFlipRotator_QueryInterface(IWICBitmapFlipRotator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapFlipRotator_AddRef(IWICBitmapFlipRotator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapFlipRotator_Release(IWICBitmapFlipRotator* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICBitmapFlipRotator_GetSize(IWICBitmapFlipRotator* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICBitmapFlipRotator_GetPixelFormat(IWICBitmapFlipRotator* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmapFlipRotator_GetResolution(IWICBitmapFlipRotator* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICBitmapFlipRotator_CopyPalette(IWICBitmapFlipRotator* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapFlipRotator_CopyPixels(IWICBitmapFlipRotator* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICBitmapFlipRotator methods ***/
static FORCEINLINE HRESULT IWICBitmapFlipRotator_Initialize(IWICBitmapFlipRotator* This,IWICBitmapSource *pISource,WICBitmapTransformOptions options) {
    return This->lpVtbl->Initialize(This,pISource,options);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapFlipRotator_Initialize_Proxy(
    IWICBitmapFlipRotator* This,
    IWICBitmapSource *pISource,
    WICBitmapTransformOptions options);
void __RPC_STUB IWICBitmapFlipRotator_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapFlipRotator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmap interface
 */
#ifndef __IWICBitmap_INTERFACE_DEFINED__
#define __IWICBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmap, 0x00000121, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000121-a8f2-4877-ba0a-fd2b6645fb94")
IWICBitmap : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE Lock(
        const WICRect *prcLock,
        DWORD flags,
        IWICBitmapLock **ppILock) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPalette(
        IWICPalette *pIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetResolution(
        double dpiX,
        double dpiY) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmap, 0x00000121, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmap* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmap* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICBitmap* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmap* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICBitmap* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICBitmap methods ***/
    HRESULT (STDMETHODCALLTYPE *Lock)(
        IWICBitmap* This,
        const WICRect *prcLock,
        DWORD flags,
        IWICBitmapLock **ppILock);

    HRESULT (STDMETHODCALLTYPE *SetPalette)(
        IWICBitmap* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *SetResolution)(
        IWICBitmap* This,
        double dpiX,
        double dpiY);

    END_INTERFACE
} IWICBitmapVtbl;
interface IWICBitmap {
    CONST_VTBL IWICBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICBitmap_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICBitmap_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICBitmap_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICBitmap_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmap_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICBitmap methods ***/
#define IWICBitmap_Lock(This,prcLock,flags,ppILock) (This)->lpVtbl->Lock(This,prcLock,flags,ppILock)
#define IWICBitmap_SetPalette(This,pIPalette) (This)->lpVtbl->SetPalette(This,pIPalette)
#define IWICBitmap_SetResolution(This,dpiX,dpiY) (This)->lpVtbl->SetResolution(This,dpiX,dpiY)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmap_QueryInterface(IWICBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmap_AddRef(IWICBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmap_Release(IWICBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICBitmap_GetSize(IWICBitmap* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICBitmap_GetPixelFormat(IWICBitmap* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmap_GetResolution(IWICBitmap* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICBitmap_CopyPalette(IWICBitmap* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmap_CopyPixels(IWICBitmap* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICBitmap methods ***/
static FORCEINLINE HRESULT IWICBitmap_Lock(IWICBitmap* This,const WICRect *prcLock,DWORD flags,IWICBitmapLock **ppILock) {
    return This->lpVtbl->Lock(This,prcLock,flags,ppILock);
}
static FORCEINLINE HRESULT IWICBitmap_SetPalette(IWICBitmap* This,IWICPalette *pIPalette) {
    return This->lpVtbl->SetPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmap_SetResolution(IWICBitmap* This,double dpiX,double dpiY) {
    return This->lpVtbl->SetResolution(This,dpiX,dpiY);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmap_Lock_Proxy(
    IWICBitmap* This,
    const WICRect *prcLock,
    DWORD flags,
    IWICBitmapLock **ppILock);
void __RPC_STUB IWICBitmap_Lock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmap_SetPalette_Proxy(
    IWICBitmap* This,
    IWICPalette *pIPalette);
void __RPC_STUB IWICBitmap_SetPalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmap_SetResolution_Proxy(
    IWICBitmap* This,
    double dpiX,
    double dpiY);
void __RPC_STUB IWICBitmap_SetResolution_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICPalette interface
 */
#ifndef __IWICPalette_INTERFACE_DEFINED__
#define __IWICPalette_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICPalette, 0x00000040, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000040-a8f2-4877-ba0a-fd2b6645fb94")
IWICPalette : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitializePredefined(
        WICBitmapPaletteType ePaletteType,
        WINBOOL fAddTransparentColor) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeCustom(
        WICColor *pColors,
        UINT colorCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromBitmap(
        IWICBitmapSource *pISurface,
        UINT colorCount,
        WINBOOL fAddTransparentColor) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromPalette(
        IWICPalette *pIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetType(
        WICBitmapPaletteType *pePaletteType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorCount(
        UINT *pcCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColors(
        UINT colorCount,
        WICColor *pColors,
        UINT *pcActualColors) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsBlackWhite(
        WINBOOL *pfIsBlackWhite) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsGrayscale(
        WINBOOL *pfIsGrayscale) = 0;

    virtual HRESULT STDMETHODCALLTYPE HasAlpha(
        WINBOOL *pfHasAlpha) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICPalette, 0x00000040, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICPaletteVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICPalette methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializePredefined)(
        IWICPalette* This,
        WICBitmapPaletteType ePaletteType,
        WINBOOL fAddTransparentColor);

    HRESULT (STDMETHODCALLTYPE *InitializeCustom)(
        IWICPalette* This,
        WICColor *pColors,
        UINT colorCount);

    HRESULT (STDMETHODCALLTYPE *InitializeFromBitmap)(
        IWICPalette* This,
        IWICBitmapSource *pISurface,
        UINT colorCount,
        WINBOOL fAddTransparentColor);

    HRESULT (STDMETHODCALLTYPE *InitializeFromPalette)(
        IWICPalette* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWICPalette* This,
        WICBitmapPaletteType *pePaletteType);

    HRESULT (STDMETHODCALLTYPE *GetColorCount)(
        IWICPalette* This,
        UINT *pcCount);

    HRESULT (STDMETHODCALLTYPE *GetColors)(
        IWICPalette* This,
        UINT colorCount,
        WICColor *pColors,
        UINT *pcActualColors);

    HRESULT (STDMETHODCALLTYPE *IsBlackWhite)(
        IWICPalette* This,
        WINBOOL *pfIsBlackWhite);

    HRESULT (STDMETHODCALLTYPE *IsGrayscale)(
        IWICPalette* This,
        WINBOOL *pfIsGrayscale);

    HRESULT (STDMETHODCALLTYPE *HasAlpha)(
        IWICPalette* This,
        WINBOOL *pfHasAlpha);

    END_INTERFACE
} IWICPaletteVtbl;
interface IWICPalette {
    CONST_VTBL IWICPaletteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICPalette_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICPalette_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICPalette_Release(This) (This)->lpVtbl->Release(This)
/*** IWICPalette methods ***/
#define IWICPalette_InitializePredefined(This,ePaletteType,fAddTransparentColor) (This)->lpVtbl->InitializePredefined(This,ePaletteType,fAddTransparentColor)
#define IWICPalette_InitializeCustom(This,pColors,colorCount) (This)->lpVtbl->InitializeCustom(This,pColors,colorCount)
#define IWICPalette_InitializeFromBitmap(This,pISurface,colorCount,fAddTransparentColor) (This)->lpVtbl->InitializeFromBitmap(This,pISurface,colorCount,fAddTransparentColor)
#define IWICPalette_InitializeFromPalette(This,pIPalette) (This)->lpVtbl->InitializeFromPalette(This,pIPalette)
#define IWICPalette_GetType(This,pePaletteType) (This)->lpVtbl->GetType(This,pePaletteType)
#define IWICPalette_GetColorCount(This,pcCount) (This)->lpVtbl->GetColorCount(This,pcCount)
#define IWICPalette_GetColors(This,colorCount,pColors,pcActualColors) (This)->lpVtbl->GetColors(This,colorCount,pColors,pcActualColors)
#define IWICPalette_IsBlackWhite(This,pfIsBlackWhite) (This)->lpVtbl->IsBlackWhite(This,pfIsBlackWhite)
#define IWICPalette_IsGrayscale(This,pfIsGrayscale) (This)->lpVtbl->IsGrayscale(This,pfIsGrayscale)
#define IWICPalette_HasAlpha(This,pfHasAlpha) (This)->lpVtbl->HasAlpha(This,pfHasAlpha)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICPalette_QueryInterface(IWICPalette* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICPalette_AddRef(IWICPalette* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICPalette_Release(IWICPalette* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICPalette methods ***/
static FORCEINLINE HRESULT IWICPalette_InitializePredefined(IWICPalette* This,WICBitmapPaletteType ePaletteType,WINBOOL fAddTransparentColor) {
    return This->lpVtbl->InitializePredefined(This,ePaletteType,fAddTransparentColor);
}
static FORCEINLINE HRESULT IWICPalette_InitializeCustom(IWICPalette* This,WICColor *pColors,UINT colorCount) {
    return This->lpVtbl->InitializeCustom(This,pColors,colorCount);
}
static FORCEINLINE HRESULT IWICPalette_InitializeFromBitmap(IWICPalette* This,IWICBitmapSource *pISurface,UINT colorCount,WINBOOL fAddTransparentColor) {
    return This->lpVtbl->InitializeFromBitmap(This,pISurface,colorCount,fAddTransparentColor);
}
static FORCEINLINE HRESULT IWICPalette_InitializeFromPalette(IWICPalette* This,IWICPalette *pIPalette) {
    return This->lpVtbl->InitializeFromPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICPalette_GetType(IWICPalette* This,WICBitmapPaletteType *pePaletteType) {
    return This->lpVtbl->GetType(This,pePaletteType);
}
static FORCEINLINE HRESULT IWICPalette_GetColorCount(IWICPalette* This,UINT *pcCount) {
    return This->lpVtbl->GetColorCount(This,pcCount);
}
static FORCEINLINE HRESULT IWICPalette_GetColors(IWICPalette* This,UINT colorCount,WICColor *pColors,UINT *pcActualColors) {
    return This->lpVtbl->GetColors(This,colorCount,pColors,pcActualColors);
}
static FORCEINLINE HRESULT IWICPalette_IsBlackWhite(IWICPalette* This,WINBOOL *pfIsBlackWhite) {
    return This->lpVtbl->IsBlackWhite(This,pfIsBlackWhite);
}
static FORCEINLINE HRESULT IWICPalette_IsGrayscale(IWICPalette* This,WINBOOL *pfIsGrayscale) {
    return This->lpVtbl->IsGrayscale(This,pfIsGrayscale);
}
static FORCEINLINE HRESULT IWICPalette_HasAlpha(IWICPalette* This,WINBOOL *pfHasAlpha) {
    return This->lpVtbl->HasAlpha(This,pfHasAlpha);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICPalette_InitializePredefined_Proxy(
    IWICPalette* This,
    WICBitmapPaletteType ePaletteType,
    WINBOOL fAddTransparentColor);
void __RPC_STUB IWICPalette_InitializePredefined_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_InitializeCustom_Proxy(
    IWICPalette* This,
    WICColor *pColors,
    UINT colorCount);
void __RPC_STUB IWICPalette_InitializeCustom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_InitializeFromBitmap_Proxy(
    IWICPalette* This,
    IWICBitmapSource *pISurface,
    UINT colorCount,
    WINBOOL fAddTransparentColor);
void __RPC_STUB IWICPalette_InitializeFromBitmap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_InitializeFromPalette_Proxy(
    IWICPalette* This,
    IWICPalette *pIPalette);
void __RPC_STUB IWICPalette_InitializeFromPalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_GetType_Proxy(
    IWICPalette* This,
    WICBitmapPaletteType *pePaletteType);
void __RPC_STUB IWICPalette_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_GetColorCount_Proxy(
    IWICPalette* This,
    UINT *pcCount);
void __RPC_STUB IWICPalette_GetColorCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_GetColors_Proxy(
    IWICPalette* This,
    UINT colorCount,
    WICColor *pColors,
    UINT *pcActualColors);
void __RPC_STUB IWICPalette_GetColors_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_IsBlackWhite_Proxy(
    IWICPalette* This,
    WINBOOL *pfIsBlackWhite);
void __RPC_STUB IWICPalette_IsBlackWhite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_IsGrayscale_Proxy(
    IWICPalette* This,
    WINBOOL *pfIsGrayscale);
void __RPC_STUB IWICPalette_IsGrayscale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPalette_HasAlpha_Proxy(
    IWICPalette* This,
    WINBOOL *pfHasAlpha);
void __RPC_STUB IWICPalette_HasAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICPalette_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICComponentInfo interface
 */
#ifndef __IWICComponentInfo_INTERFACE_DEFINED__
#define __IWICComponentInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICComponentInfo, 0x23bc3f0a, 0x698b, 0x4357, 0x88,0x6b, 0xf2,0x4d,0x50,0x67,0x13,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("23bc3f0a-698b-4357-886b-f24d50671334")
IWICComponentInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetComponentType(
        WICComponentType *pType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCLSID(
        CLSID *pclsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSigningStatus(
        DWORD *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAuthor(
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVendorGUID(
        GUID *pguidVendor) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVersion(
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSpecVersion(
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFriendlyName(
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICComponentInfo, 0x23bc3f0a, 0x698b, 0x4357, 0x88,0x6b, 0xf2,0x4d,0x50,0x67,0x13,0x34)
#endif
#else
typedef struct IWICComponentInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICComponentInfo* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICComponentInfo* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICComponentInfo* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICComponentInfo* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICComponentInfo* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICComponentInfo* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICComponentInfo* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICComponentInfo* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    END_INTERFACE
} IWICComponentInfoVtbl;
interface IWICComponentInfo {
    CONST_VTBL IWICComponentInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICComponentInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICComponentInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICComponentInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICComponentInfo_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICComponentInfo_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICComponentInfo_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICComponentInfo_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICComponentInfo_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICComponentInfo_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICComponentInfo_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICComponentInfo_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICComponentInfo_QueryInterface(IWICComponentInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICComponentInfo_AddRef(IWICComponentInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICComponentInfo_Release(IWICComponentInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICComponentInfo_GetComponentType(IWICComponentInfo* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetCLSID(IWICComponentInfo* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetSigningStatus(IWICComponentInfo* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetAuthor(IWICComponentInfo* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetVendorGUID(IWICComponentInfo* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetVersion(IWICComponentInfo* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetSpecVersion(IWICComponentInfo* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICComponentInfo_GetFriendlyName(IWICComponentInfo* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetComponentType_Proxy(
    IWICComponentInfo* This,
    WICComponentType *pType);
void __RPC_STUB IWICComponentInfo_GetComponentType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetCLSID_Proxy(
    IWICComponentInfo* This,
    CLSID *pclsid);
void __RPC_STUB IWICComponentInfo_GetCLSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetSigningStatus_Proxy(
    IWICComponentInfo* This,
    DWORD *pStatus);
void __RPC_STUB IWICComponentInfo_GetSigningStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetAuthor_Proxy(
    IWICComponentInfo* This,
    UINT cchAuthor,
    WCHAR *wzAuthor,
    UINT *pcchActual);
void __RPC_STUB IWICComponentInfo_GetAuthor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetVendorGUID_Proxy(
    IWICComponentInfo* This,
    GUID *pguidVendor);
void __RPC_STUB IWICComponentInfo_GetVendorGUID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetVersion_Proxy(
    IWICComponentInfo* This,
    UINT cchVersion,
    WCHAR *wzVersion,
    UINT *pcchActual);
void __RPC_STUB IWICComponentInfo_GetVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetSpecVersion_Proxy(
    IWICComponentInfo* This,
    UINT cchSpecVersion,
    WCHAR *wzSpecVersion,
    UINT *pcchActual);
void __RPC_STUB IWICComponentInfo_GetSpecVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICComponentInfo_GetFriendlyName_Proxy(
    IWICComponentInfo* This,
    UINT cchFriendlyName,
    WCHAR *wzFriendlyName,
    UINT *pcchActual);
void __RPC_STUB IWICComponentInfo_GetFriendlyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICComponentInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICMetadataQueryReader interface
 */
#ifndef __IWICMetadataQueryReader_INTERFACE_DEFINED__
#define __IWICMetadataQueryReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICMetadataQueryReader, 0x30989668, 0xe1c9, 0x4597, 0xb3,0x95, 0x45,0x8e,0xed,0xb8,0x08,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30989668-e1c9-4597-b395-458eedb808df")
IWICMetadataQueryReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetContainerFormat(
        GUID *pguidContainerFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLocation(
        UINT cchMaxLength,
        WCHAR *wzNamespace,
        UINT *pcchActualLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMetadataByName(
        LPCWSTR wzName,
        PROPVARIANT *pvarValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IEnumString **ppIEnumString) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICMetadataQueryReader, 0x30989668, 0xe1c9, 0x4597, 0xb3,0x95, 0x45,0x8e,0xed,0xb8,0x08,0xdf)
#endif
#else
typedef struct IWICMetadataQueryReaderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICMetadataQueryReader methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICMetadataQueryReader* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetLocation)(
        IWICMetadataQueryReader* This,
        UINT cchMaxLength,
        WCHAR *wzNamespace,
        UINT *pcchActualLength);

    HRESULT (STDMETHODCALLTYPE *GetMetadataByName)(
        IWICMetadataQueryReader* This,
        LPCWSTR wzName,
        PROPVARIANT *pvarValue);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IWICMetadataQueryReader* This,
        IEnumString **ppIEnumString);

    END_INTERFACE
} IWICMetadataQueryReaderVtbl;
interface IWICMetadataQueryReader {
    CONST_VTBL IWICMetadataQueryReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICMetadataQueryReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICMetadataQueryReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICMetadataQueryReader_Release(This) (This)->lpVtbl->Release(This)
/*** IWICMetadataQueryReader methods ***/
#define IWICMetadataQueryReader_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICMetadataQueryReader_GetLocation(This,cchMaxLength,wzNamespace,pcchActualLength) (This)->lpVtbl->GetLocation(This,cchMaxLength,wzNamespace,pcchActualLength)
#define IWICMetadataQueryReader_GetMetadataByName(This,wzName,pvarValue) (This)->lpVtbl->GetMetadataByName(This,wzName,pvarValue)
#define IWICMetadataQueryReader_GetEnumerator(This,ppIEnumString) (This)->lpVtbl->GetEnumerator(This,ppIEnumString)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICMetadataQueryReader_QueryInterface(IWICMetadataQueryReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICMetadataQueryReader_AddRef(IWICMetadataQueryReader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICMetadataQueryReader_Release(IWICMetadataQueryReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICMetadataQueryReader methods ***/
static FORCEINLINE HRESULT IWICMetadataQueryReader_GetContainerFormat(IWICMetadataQueryReader* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICMetadataQueryReader_GetLocation(IWICMetadataQueryReader* This,UINT cchMaxLength,WCHAR *wzNamespace,UINT *pcchActualLength) {
    return This->lpVtbl->GetLocation(This,cchMaxLength,wzNamespace,pcchActualLength);
}
static FORCEINLINE HRESULT IWICMetadataQueryReader_GetMetadataByName(IWICMetadataQueryReader* This,LPCWSTR wzName,PROPVARIANT *pvarValue) {
    return This->lpVtbl->GetMetadataByName(This,wzName,pvarValue);
}
static FORCEINLINE HRESULT IWICMetadataQueryReader_GetEnumerator(IWICMetadataQueryReader* This,IEnumString **ppIEnumString) {
    return This->lpVtbl->GetEnumerator(This,ppIEnumString);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICMetadataQueryReader_GetContainerFormat_Proxy(
    IWICMetadataQueryReader* This,
    GUID *pguidContainerFormat);
void __RPC_STUB IWICMetadataQueryReader_GetContainerFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICMetadataQueryReader_GetLocation_Proxy(
    IWICMetadataQueryReader* This,
    UINT cchMaxLength,
    WCHAR *wzNamespace,
    UINT *pcchActualLength);
void __RPC_STUB IWICMetadataQueryReader_GetLocation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICMetadataQueryReader_GetMetadataByName_Proxy(
    IWICMetadataQueryReader* This,
    LPCWSTR wzName,
    PROPVARIANT *pvarValue);
void __RPC_STUB IWICMetadataQueryReader_GetMetadataByName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICMetadataQueryReader_GetEnumerator_Proxy(
    IWICMetadataQueryReader* This,
    IEnumString **ppIEnumString);
void __RPC_STUB IWICMetadataQueryReader_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICMetadataQueryReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICMetadataQueryWriter interface
 */
#ifndef __IWICMetadataQueryWriter_INTERFACE_DEFINED__
#define __IWICMetadataQueryWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICMetadataQueryWriter, 0xa721791a, 0x0def, 0x4d06, 0xbd,0x91, 0x21,0x18,0xbf,0x1d,0xb1,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a721791a-0def-4d06-bd91-2118bf1db10b")
IWICMetadataQueryWriter : public IWICMetadataQueryReader
{
    virtual HRESULT STDMETHODCALLTYPE SetMetadataByName(
        LPCWSTR wzName,
        const PROPVARIANT *pvarValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMetadataByName(
        LPCWSTR wzName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICMetadataQueryWriter, 0xa721791a, 0x0def, 0x4d06, 0xbd,0x91, 0x21,0x18,0xbf,0x1d,0xb1,0x0b)
#endif
#else
typedef struct IWICMetadataQueryWriterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICMetadataQueryReader methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICMetadataQueryWriter* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetLocation)(
        IWICMetadataQueryWriter* This,
        UINT cchMaxLength,
        WCHAR *wzNamespace,
        UINT *pcchActualLength);

    HRESULT (STDMETHODCALLTYPE *GetMetadataByName)(
        IWICMetadataQueryWriter* This,
        LPCWSTR wzName,
        PROPVARIANT *pvarValue);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IWICMetadataQueryWriter* This,
        IEnumString **ppIEnumString);

    /*** IWICMetadataQueryWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *SetMetadataByName)(
        IWICMetadataQueryWriter* This,
        LPCWSTR wzName,
        const PROPVARIANT *pvarValue);

    HRESULT (STDMETHODCALLTYPE *RemoveMetadataByName)(
        IWICMetadataQueryWriter* This,
        LPCWSTR wzName);

    END_INTERFACE
} IWICMetadataQueryWriterVtbl;
interface IWICMetadataQueryWriter {
    CONST_VTBL IWICMetadataQueryWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICMetadataQueryWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICMetadataQueryWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICMetadataQueryWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IWICMetadataQueryReader methods ***/
#define IWICMetadataQueryWriter_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICMetadataQueryWriter_GetLocation(This,cchMaxLength,wzNamespace,pcchActualLength) (This)->lpVtbl->GetLocation(This,cchMaxLength,wzNamespace,pcchActualLength)
#define IWICMetadataQueryWriter_GetMetadataByName(This,wzName,pvarValue) (This)->lpVtbl->GetMetadataByName(This,wzName,pvarValue)
#define IWICMetadataQueryWriter_GetEnumerator(This,ppIEnumString) (This)->lpVtbl->GetEnumerator(This,ppIEnumString)
/*** IWICMetadataQueryWriter methods ***/
#define IWICMetadataQueryWriter_SetMetadataByName(This,wzName,pvarValue) (This)->lpVtbl->SetMetadataByName(This,wzName,pvarValue)
#define IWICMetadataQueryWriter_RemoveMetadataByName(This,wzName) (This)->lpVtbl->RemoveMetadataByName(This,wzName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICMetadataQueryWriter_QueryInterface(IWICMetadataQueryWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICMetadataQueryWriter_AddRef(IWICMetadataQueryWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICMetadataQueryWriter_Release(IWICMetadataQueryWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICMetadataQueryReader methods ***/
static FORCEINLINE HRESULT IWICMetadataQueryWriter_GetContainerFormat(IWICMetadataQueryWriter* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICMetadataQueryWriter_GetLocation(IWICMetadataQueryWriter* This,UINT cchMaxLength,WCHAR *wzNamespace,UINT *pcchActualLength) {
    return This->lpVtbl->GetLocation(This,cchMaxLength,wzNamespace,pcchActualLength);
}
static FORCEINLINE HRESULT IWICMetadataQueryWriter_GetMetadataByName(IWICMetadataQueryWriter* This,LPCWSTR wzName,PROPVARIANT *pvarValue) {
    return This->lpVtbl->GetMetadataByName(This,wzName,pvarValue);
}
static FORCEINLINE HRESULT IWICMetadataQueryWriter_GetEnumerator(IWICMetadataQueryWriter* This,IEnumString **ppIEnumString) {
    return This->lpVtbl->GetEnumerator(This,ppIEnumString);
}
/*** IWICMetadataQueryWriter methods ***/
static FORCEINLINE HRESULT IWICMetadataQueryWriter_SetMetadataByName(IWICMetadataQueryWriter* This,LPCWSTR wzName,const PROPVARIANT *pvarValue) {
    return This->lpVtbl->SetMetadataByName(This,wzName,pvarValue);
}
static FORCEINLINE HRESULT IWICMetadataQueryWriter_RemoveMetadataByName(IWICMetadataQueryWriter* This,LPCWSTR wzName) {
    return This->lpVtbl->RemoveMetadataByName(This,wzName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICMetadataQueryWriter_SetMetadataByName_Proxy(
    IWICMetadataQueryWriter* This,
    LPCWSTR wzName,
    const PROPVARIANT *pvarValue);
void __RPC_STUB IWICMetadataQueryWriter_SetMetadataByName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICMetadataQueryWriter_RemoveMetadataByName_Proxy(
    IWICMetadataQueryWriter* This,
    LPCWSTR wzName);
void __RPC_STUB IWICMetadataQueryWriter_RemoveMetadataByName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICMetadataQueryWriter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapFrameDecode interface
 */
#ifndef __IWICBitmapFrameDecode_INTERFACE_DEFINED__
#define __IWICBitmapFrameDecode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapFrameDecode, 0x3b16811b, 0x6a43, 0x4ec9, 0xa8,0x13, 0x3d,0x93,0x0c,0x13,0xb9,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3b16811b-6a43-4ec9-a813-3d930c13b940")
IWICBitmapFrameDecode : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE GetMetadataQueryReader(
        IWICMetadataQueryReader **ppIMetadataQueryReader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorContexts(
        UINT cCount,
        IWICColorContext **ppIColorContexts,
        UINT *pcActualCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThumbnail(
        IWICBitmapSource **ppIThumbnail) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapFrameDecode, 0x3b16811b, 0x6a43, 0x4ec9, 0xa8,0x13, 0x3d,0x93,0x0c,0x13,0xb9,0x40)
#endif
#else
typedef struct IWICBitmapFrameDecodeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmapFrameDecode* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmapFrameDecode* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICBitmapFrameDecode* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmapFrameDecode* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICBitmapFrameDecode* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICBitmapFrameDecode methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMetadataQueryReader)(
        IWICBitmapFrameDecode* This,
        IWICMetadataQueryReader **ppIMetadataQueryReader);

    HRESULT (STDMETHODCALLTYPE *GetColorContexts)(
        IWICBitmapFrameDecode* This,
        UINT cCount,
        IWICColorContext **ppIColorContexts,
        UINT *pcActualCount);

    HRESULT (STDMETHODCALLTYPE *GetThumbnail)(
        IWICBitmapFrameDecode* This,
        IWICBitmapSource **ppIThumbnail);

    END_INTERFACE
} IWICBitmapFrameDecodeVtbl;
interface IWICBitmapFrameDecode {
    CONST_VTBL IWICBitmapFrameDecodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapFrameDecode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapFrameDecode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapFrameDecode_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICBitmapFrameDecode_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICBitmapFrameDecode_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICBitmapFrameDecode_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICBitmapFrameDecode_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmapFrameDecode_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICBitmapFrameDecode methods ***/
#define IWICBitmapFrameDecode_GetMetadataQueryReader(This,ppIMetadataQueryReader) (This)->lpVtbl->GetMetadataQueryReader(This,ppIMetadataQueryReader)
#define IWICBitmapFrameDecode_GetColorContexts(This,cCount,ppIColorContexts,pcActualCount) (This)->lpVtbl->GetColorContexts(This,cCount,ppIColorContexts,pcActualCount)
#define IWICBitmapFrameDecode_GetThumbnail(This,ppIThumbnail) (This)->lpVtbl->GetThumbnail(This,ppIThumbnail)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapFrameDecode_QueryInterface(IWICBitmapFrameDecode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapFrameDecode_AddRef(IWICBitmapFrameDecode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapFrameDecode_Release(IWICBitmapFrameDecode* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICBitmapFrameDecode_GetSize(IWICBitmapFrameDecode* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICBitmapFrameDecode_GetPixelFormat(IWICBitmapFrameDecode* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmapFrameDecode_GetResolution(IWICBitmapFrameDecode* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICBitmapFrameDecode_CopyPalette(IWICBitmapFrameDecode* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapFrameDecode_CopyPixels(IWICBitmapFrameDecode* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICBitmapFrameDecode methods ***/
static FORCEINLINE HRESULT IWICBitmapFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode* This,IWICMetadataQueryReader **ppIMetadataQueryReader) {
    return This->lpVtbl->GetMetadataQueryReader(This,ppIMetadataQueryReader);
}
static FORCEINLINE HRESULT IWICBitmapFrameDecode_GetColorContexts(IWICBitmapFrameDecode* This,UINT cCount,IWICColorContext **ppIColorContexts,UINT *pcActualCount) {
    return This->lpVtbl->GetColorContexts(This,cCount,ppIColorContexts,pcActualCount);
}
static FORCEINLINE HRESULT IWICBitmapFrameDecode_GetThumbnail(IWICBitmapFrameDecode* This,IWICBitmapSource **ppIThumbnail) {
    return This->lpVtbl->GetThumbnail(This,ppIThumbnail);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapFrameDecode_GetMetadataQueryReader_Proxy(
    IWICBitmapFrameDecode* This,
    IWICMetadataQueryReader **ppIMetadataQueryReader);
void __RPC_STUB IWICBitmapFrameDecode_GetMetadataQueryReader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameDecode_GetColorContexts_Proxy(
    IWICBitmapFrameDecode* This,
    UINT cCount,
    IWICColorContext **ppIColorContexts,
    UINT *pcActualCount);
void __RPC_STUB IWICBitmapFrameDecode_GetColorContexts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameDecode_GetThumbnail_Proxy(
    IWICBitmapFrameDecode* This,
    IWICBitmapSource **ppIThumbnail);
void __RPC_STUB IWICBitmapFrameDecode_GetThumbnail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapFrameDecode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICPixelFormatInfo interface
 */
#ifndef __IWICPixelFormatInfo_INTERFACE_DEFINED__
#define __IWICPixelFormatInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICPixelFormatInfo, 0xe8eda601, 0x3d48, 0x431a, 0xab,0x44, 0x69,0x05,0x9b,0xe8,0x8b,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e8eda601-3d48-431a-ab44-69059be88bbe")
IWICPixelFormatInfo : public IWICComponentInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetFormatGUID(
        GUID *pFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorContext(
        IWICColorContext **ppIColorContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBitsPerPixel(
        UINT *puiBitsPerPixel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChannelCount(
        UINT *puiChannelCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChannelMask(
        UINT uiChannelIndex,
        UINT cbMaskBuffer,
        BYTE *pbMaskBuffer,
        UINT *pcbActual) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICPixelFormatInfo, 0xe8eda601, 0x3d48, 0x431a, 0xab,0x44, 0x69,0x05,0x9b,0xe8,0x8b,0xbe)
#endif
#else
typedef struct IWICPixelFormatInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICPixelFormatInfo* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICPixelFormatInfo* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICPixelFormatInfo* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICPixelFormatInfo* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICPixelFormatInfo* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICPixelFormatInfo* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICPixelFormatInfo* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICPixelFormatInfo* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    /*** IWICPixelFormatInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFormatGUID)(
        IWICPixelFormatInfo* This,
        GUID *pFormat);

    HRESULT (STDMETHODCALLTYPE *GetColorContext)(
        IWICPixelFormatInfo* This,
        IWICColorContext **ppIColorContext);

    HRESULT (STDMETHODCALLTYPE *GetBitsPerPixel)(
        IWICPixelFormatInfo* This,
        UINT *puiBitsPerPixel);

    HRESULT (STDMETHODCALLTYPE *GetChannelCount)(
        IWICPixelFormatInfo* This,
        UINT *puiChannelCount);

    HRESULT (STDMETHODCALLTYPE *GetChannelMask)(
        IWICPixelFormatInfo* This,
        UINT uiChannelIndex,
        UINT cbMaskBuffer,
        BYTE *pbMaskBuffer,
        UINT *pcbActual);

    END_INTERFACE
} IWICPixelFormatInfoVtbl;
interface IWICPixelFormatInfo {
    CONST_VTBL IWICPixelFormatInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICPixelFormatInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICPixelFormatInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICPixelFormatInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICPixelFormatInfo_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICPixelFormatInfo_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICPixelFormatInfo_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICPixelFormatInfo_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICPixelFormatInfo_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICPixelFormatInfo_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICPixelFormatInfo_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICPixelFormatInfo_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
/*** IWICPixelFormatInfo methods ***/
#define IWICPixelFormatInfo_GetFormatGUID(This,pFormat) (This)->lpVtbl->GetFormatGUID(This,pFormat)
#define IWICPixelFormatInfo_GetColorContext(This,ppIColorContext) (This)->lpVtbl->GetColorContext(This,ppIColorContext)
#define IWICPixelFormatInfo_GetBitsPerPixel(This,puiBitsPerPixel) (This)->lpVtbl->GetBitsPerPixel(This,puiBitsPerPixel)
#define IWICPixelFormatInfo_GetChannelCount(This,puiChannelCount) (This)->lpVtbl->GetChannelCount(This,puiChannelCount)
#define IWICPixelFormatInfo_GetChannelMask(This,uiChannelIndex,cbMaskBuffer,pbMaskBuffer,pcbActual) (This)->lpVtbl->GetChannelMask(This,uiChannelIndex,cbMaskBuffer,pbMaskBuffer,pcbActual)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo_QueryInterface(IWICPixelFormatInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICPixelFormatInfo_AddRef(IWICPixelFormatInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICPixelFormatInfo_Release(IWICPixelFormatInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetComponentType(IWICPixelFormatInfo* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetCLSID(IWICPixelFormatInfo* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetSigningStatus(IWICPixelFormatInfo* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetAuthor(IWICPixelFormatInfo* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetVendorGUID(IWICPixelFormatInfo* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetVersion(IWICPixelFormatInfo* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetSpecVersion(IWICPixelFormatInfo* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetFriendlyName(IWICPixelFormatInfo* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
/*** IWICPixelFormatInfo methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetFormatGUID(IWICPixelFormatInfo* This,GUID *pFormat) {
    return This->lpVtbl->GetFormatGUID(This,pFormat);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetColorContext(IWICPixelFormatInfo* This,IWICColorContext **ppIColorContext) {
    return This->lpVtbl->GetColorContext(This,ppIColorContext);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetBitsPerPixel(IWICPixelFormatInfo* This,UINT *puiBitsPerPixel) {
    return This->lpVtbl->GetBitsPerPixel(This,puiBitsPerPixel);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetChannelCount(IWICPixelFormatInfo* This,UINT *puiChannelCount) {
    return This->lpVtbl->GetChannelCount(This,puiChannelCount);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo_GetChannelMask(IWICPixelFormatInfo* This,UINT uiChannelIndex,UINT cbMaskBuffer,BYTE *pbMaskBuffer,UINT *pcbActual) {
    return This->lpVtbl->GetChannelMask(This,uiChannelIndex,cbMaskBuffer,pbMaskBuffer,pcbActual);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo_GetFormatGUID_Proxy(
    IWICPixelFormatInfo* This,
    GUID *pFormat);
void __RPC_STUB IWICPixelFormatInfo_GetFormatGUID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo_GetColorContext_Proxy(
    IWICPixelFormatInfo* This,
    IWICColorContext **ppIColorContext);
void __RPC_STUB IWICPixelFormatInfo_GetColorContext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo_GetBitsPerPixel_Proxy(
    IWICPixelFormatInfo* This,
    UINT *puiBitsPerPixel);
void __RPC_STUB IWICPixelFormatInfo_GetBitsPerPixel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo_GetChannelCount_Proxy(
    IWICPixelFormatInfo* This,
    UINT *puiChannelCount);
void __RPC_STUB IWICPixelFormatInfo_GetChannelCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo_GetChannelMask_Proxy(
    IWICPixelFormatInfo* This,
    UINT uiChannelIndex,
    UINT cbMaskBuffer,
    BYTE *pbMaskBuffer,
    UINT *pcbActual);
void __RPC_STUB IWICPixelFormatInfo_GetChannelMask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICPixelFormatInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICPixelFormatInfo2 interface
 */
#ifndef __IWICPixelFormatInfo2_INTERFACE_DEFINED__
#define __IWICPixelFormatInfo2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICPixelFormatInfo2, 0xa9db33a2, 0xaf5f, 0x43c7, 0xb6,0x79, 0x74,0xf5,0x98,0x4b,0x5a,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a9db33a2-af5f-43c7-b679-74f5984b5aa4")
IWICPixelFormatInfo2 : public IWICPixelFormatInfo
{
    virtual HRESULT STDMETHODCALLTYPE SupportsTransparency(
        WINBOOL *pfSupportsTransparency) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumericRepresentation(
        WICPixelFormatNumericRepresentation *pNumericRepresentation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICPixelFormatInfo2, 0xa9db33a2, 0xaf5f, 0x43c7, 0xb6,0x79, 0x74,0xf5,0x98,0x4b,0x5a,0xa4)
#endif
#else
typedef struct IWICPixelFormatInfo2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICPixelFormatInfo2* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICPixelFormatInfo2* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICPixelFormatInfo2* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICPixelFormatInfo2* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICPixelFormatInfo2* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICPixelFormatInfo2* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICPixelFormatInfo2* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICPixelFormatInfo2* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    /*** IWICPixelFormatInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFormatGUID)(
        IWICPixelFormatInfo2* This,
        GUID *pFormat);

    HRESULT (STDMETHODCALLTYPE *GetColorContext)(
        IWICPixelFormatInfo2* This,
        IWICColorContext **ppIColorContext);

    HRESULT (STDMETHODCALLTYPE *GetBitsPerPixel)(
        IWICPixelFormatInfo2* This,
        UINT *puiBitsPerPixel);

    HRESULT (STDMETHODCALLTYPE *GetChannelCount)(
        IWICPixelFormatInfo2* This,
        UINT *puiChannelCount);

    HRESULT (STDMETHODCALLTYPE *GetChannelMask)(
        IWICPixelFormatInfo2* This,
        UINT uiChannelIndex,
        UINT cbMaskBuffer,
        BYTE *pbMaskBuffer,
        UINT *pcbActual);

    /*** IWICPixelFormatInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SupportsTransparency)(
        IWICPixelFormatInfo2* This,
        WINBOOL *pfSupportsTransparency);

    HRESULT (STDMETHODCALLTYPE *GetNumericRepresentation)(
        IWICPixelFormatInfo2* This,
        WICPixelFormatNumericRepresentation *pNumericRepresentation);

    END_INTERFACE
} IWICPixelFormatInfo2Vtbl;
interface IWICPixelFormatInfo2 {
    CONST_VTBL IWICPixelFormatInfo2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICPixelFormatInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICPixelFormatInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICPixelFormatInfo2_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICPixelFormatInfo2_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICPixelFormatInfo2_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICPixelFormatInfo2_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICPixelFormatInfo2_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICPixelFormatInfo2_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICPixelFormatInfo2_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICPixelFormatInfo2_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICPixelFormatInfo2_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
/*** IWICPixelFormatInfo methods ***/
#define IWICPixelFormatInfo2_GetFormatGUID(This,pFormat) (This)->lpVtbl->GetFormatGUID(This,pFormat)
#define IWICPixelFormatInfo2_GetColorContext(This,ppIColorContext) (This)->lpVtbl->GetColorContext(This,ppIColorContext)
#define IWICPixelFormatInfo2_GetBitsPerPixel(This,puiBitsPerPixel) (This)->lpVtbl->GetBitsPerPixel(This,puiBitsPerPixel)
#define IWICPixelFormatInfo2_GetChannelCount(This,puiChannelCount) (This)->lpVtbl->GetChannelCount(This,puiChannelCount)
#define IWICPixelFormatInfo2_GetChannelMask(This,uiChannelIndex,cbMaskBuffer,pbMaskBuffer,pcbActual) (This)->lpVtbl->GetChannelMask(This,uiChannelIndex,cbMaskBuffer,pbMaskBuffer,pcbActual)
/*** IWICPixelFormatInfo2 methods ***/
#define IWICPixelFormatInfo2_SupportsTransparency(This,pfSupportsTransparency) (This)->lpVtbl->SupportsTransparency(This,pfSupportsTransparency)
#define IWICPixelFormatInfo2_GetNumericRepresentation(This,pNumericRepresentation) (This)->lpVtbl->GetNumericRepresentation(This,pNumericRepresentation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo2_QueryInterface(IWICPixelFormatInfo2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICPixelFormatInfo2_AddRef(IWICPixelFormatInfo2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICPixelFormatInfo2_Release(IWICPixelFormatInfo2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetComponentType(IWICPixelFormatInfo2* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetCLSID(IWICPixelFormatInfo2* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetSigningStatus(IWICPixelFormatInfo2* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetAuthor(IWICPixelFormatInfo2* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetVendorGUID(IWICPixelFormatInfo2* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetVersion(IWICPixelFormatInfo2* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetSpecVersion(IWICPixelFormatInfo2* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetFriendlyName(IWICPixelFormatInfo2* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
/*** IWICPixelFormatInfo methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetFormatGUID(IWICPixelFormatInfo2* This,GUID *pFormat) {
    return This->lpVtbl->GetFormatGUID(This,pFormat);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetColorContext(IWICPixelFormatInfo2* This,IWICColorContext **ppIColorContext) {
    return This->lpVtbl->GetColorContext(This,ppIColorContext);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetBitsPerPixel(IWICPixelFormatInfo2* This,UINT *puiBitsPerPixel) {
    return This->lpVtbl->GetBitsPerPixel(This,puiBitsPerPixel);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetChannelCount(IWICPixelFormatInfo2* This,UINT *puiChannelCount) {
    return This->lpVtbl->GetChannelCount(This,puiChannelCount);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetChannelMask(IWICPixelFormatInfo2* This,UINT uiChannelIndex,UINT cbMaskBuffer,BYTE *pbMaskBuffer,UINT *pcbActual) {
    return This->lpVtbl->GetChannelMask(This,uiChannelIndex,cbMaskBuffer,pbMaskBuffer,pcbActual);
}
/*** IWICPixelFormatInfo2 methods ***/
static FORCEINLINE HRESULT IWICPixelFormatInfo2_SupportsTransparency(IWICPixelFormatInfo2* This,WINBOOL *pfSupportsTransparency) {
    return This->lpVtbl->SupportsTransparency(This,pfSupportsTransparency);
}
static FORCEINLINE HRESULT IWICPixelFormatInfo2_GetNumericRepresentation(IWICPixelFormatInfo2* This,WICPixelFormatNumericRepresentation *pNumericRepresentation) {
    return This->lpVtbl->GetNumericRepresentation(This,pNumericRepresentation);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo2_SupportsTransparency_Proxy(
    IWICPixelFormatInfo2* This,
    WINBOOL *pfSupportsTransparency);
void __RPC_STUB IWICPixelFormatInfo2_SupportsTransparency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICPixelFormatInfo2_GetNumericRepresentation_Proxy(
    IWICPixelFormatInfo2* This,
    WICPixelFormatNumericRepresentation *pNumericRepresentation);
void __RPC_STUB IWICPixelFormatInfo2_GetNumericRepresentation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICPixelFormatInfo2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapCodecInfo interface
 */
#ifndef __IWICBitmapCodecInfo_INTERFACE_DEFINED__
#define __IWICBitmapCodecInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapCodecInfo, 0xe87a44c4, 0xb76e, 0x4c47, 0x8b,0x09, 0x29,0x8e,0xb1,0x2a,0x27,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e87a44c4-b76e-4c47-8b09-298eb12a2714")
IWICBitmapCodecInfo : public IWICComponentInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetContainerFormat(
        GUID *pguidContainerFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPixelFormats(
        UINT cFormats,
        GUID *pguidPixelFormats,
        UINT *pcActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorManagementVersion(
        UINT cchColorManagementVersion,
        WCHAR *wzColorManagementVersion,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceManufacturer(
        UINT cchDeviceManufacturer,
        WCHAR *wzDeviceManufacturer,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceModels(
        UINT cchDeviceModels,
        WCHAR *wzDeviceModels,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMimeTypes(
        UINT cchMimeTypes,
        WCHAR *wzMimeTypes,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileExtensions(
        UINT cchFileExtensions,
        WCHAR *wzFileExtensions,
        UINT *pcchActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoesSupportAnimation(
        WINBOOL *pfSupportAnimation) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoesSupportChromaKey(
        WINBOOL *pfSupportChromaKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoesSupportLossless(
        WINBOOL *pfSupportLossless) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoesSupportMultiframe(
        WINBOOL *pfSupportMultiframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE MatchesMimeType(
        LPCWSTR wzMimeType,
        WINBOOL *pfMatches) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapCodecInfo, 0xe87a44c4, 0xb76e, 0x4c47, 0x8b,0x09, 0x29,0x8e,0xb1,0x2a,0x27,0x14)
#endif
#else
typedef struct IWICBitmapCodecInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICBitmapCodecInfo* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICBitmapCodecInfo* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICBitmapCodecInfo* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICBitmapCodecInfo* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICBitmapCodecInfo* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICBitmapCodecInfo* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICBitmapCodecInfo* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICBitmapCodecInfo* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    /*** IWICBitmapCodecInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICBitmapCodecInfo* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormats)(
        IWICBitmapCodecInfo* This,
        UINT cFormats,
        GUID *pguidPixelFormats,
        UINT *pcActual);

    HRESULT (STDMETHODCALLTYPE *GetColorManagementVersion)(
        IWICBitmapCodecInfo* This,
        UINT cchColorManagementVersion,
        WCHAR *wzColorManagementVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetDeviceManufacturer)(
        IWICBitmapCodecInfo* This,
        UINT cchDeviceManufacturer,
        WCHAR *wzDeviceManufacturer,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetDeviceModels)(
        IWICBitmapCodecInfo* This,
        UINT cchDeviceModels,
        WCHAR *wzDeviceModels,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetMimeTypes)(
        IWICBitmapCodecInfo* This,
        UINT cchMimeTypes,
        WCHAR *wzMimeTypes,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFileExtensions)(
        IWICBitmapCodecInfo* This,
        UINT cchFileExtensions,
        WCHAR *wzFileExtensions,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *DoesSupportAnimation)(
        IWICBitmapCodecInfo* This,
        WINBOOL *pfSupportAnimation);

    HRESULT (STDMETHODCALLTYPE *DoesSupportChromaKey)(
        IWICBitmapCodecInfo* This,
        WINBOOL *pfSupportChromaKey);

    HRESULT (STDMETHODCALLTYPE *DoesSupportLossless)(
        IWICBitmapCodecInfo* This,
        WINBOOL *pfSupportLossless);

    HRESULT (STDMETHODCALLTYPE *DoesSupportMultiframe)(
        IWICBitmapCodecInfo* This,
        WINBOOL *pfSupportMultiframe);

    HRESULT (STDMETHODCALLTYPE *MatchesMimeType)(
        IWICBitmapCodecInfo* This,
        LPCWSTR wzMimeType,
        WINBOOL *pfMatches);

    END_INTERFACE
} IWICBitmapCodecInfoVtbl;
interface IWICBitmapCodecInfo {
    CONST_VTBL IWICBitmapCodecInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapCodecInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapCodecInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapCodecInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICBitmapCodecInfo_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICBitmapCodecInfo_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICBitmapCodecInfo_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICBitmapCodecInfo_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICBitmapCodecInfo_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICBitmapCodecInfo_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICBitmapCodecInfo_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICBitmapCodecInfo_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
/*** IWICBitmapCodecInfo methods ***/
#define IWICBitmapCodecInfo_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICBitmapCodecInfo_GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual) (This)->lpVtbl->GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual)
#define IWICBitmapCodecInfo_GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual) (This)->lpVtbl->GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual)
#define IWICBitmapCodecInfo_GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual) (This)->lpVtbl->GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual)
#define IWICBitmapCodecInfo_GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual) (This)->lpVtbl->GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual)
#define IWICBitmapCodecInfo_GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual) (This)->lpVtbl->GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual)
#define IWICBitmapCodecInfo_GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual) (This)->lpVtbl->GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual)
#define IWICBitmapCodecInfo_DoesSupportAnimation(This,pfSupportAnimation) (This)->lpVtbl->DoesSupportAnimation(This,pfSupportAnimation)
#define IWICBitmapCodecInfo_DoesSupportChromaKey(This,pfSupportChromaKey) (This)->lpVtbl->DoesSupportChromaKey(This,pfSupportChromaKey)
#define IWICBitmapCodecInfo_DoesSupportLossless(This,pfSupportLossless) (This)->lpVtbl->DoesSupportLossless(This,pfSupportLossless)
#define IWICBitmapCodecInfo_DoesSupportMultiframe(This,pfSupportMultiframe) (This)->lpVtbl->DoesSupportMultiframe(This,pfSupportMultiframe)
#define IWICBitmapCodecInfo_MatchesMimeType(This,wzMimeType,pfMatches) (This)->lpVtbl->MatchesMimeType(This,wzMimeType,pfMatches)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapCodecInfo_QueryInterface(IWICBitmapCodecInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapCodecInfo_AddRef(IWICBitmapCodecInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapCodecInfo_Release(IWICBitmapCodecInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetComponentType(IWICBitmapCodecInfo* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetCLSID(IWICBitmapCodecInfo* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetSigningStatus(IWICBitmapCodecInfo* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetAuthor(IWICBitmapCodecInfo* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetVendorGUID(IWICBitmapCodecInfo* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetVersion(IWICBitmapCodecInfo* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetSpecVersion(IWICBitmapCodecInfo* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetFriendlyName(IWICBitmapCodecInfo* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
/*** IWICBitmapCodecInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetContainerFormat(IWICBitmapCodecInfo* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetPixelFormats(IWICBitmapCodecInfo* This,UINT cFormats,GUID *pguidPixelFormats,UINT *pcActual) {
    return This->lpVtbl->GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetColorManagementVersion(IWICBitmapCodecInfo* This,UINT cchColorManagementVersion,WCHAR *wzColorManagementVersion,UINT *pcchActual) {
    return This->lpVtbl->GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetDeviceManufacturer(IWICBitmapCodecInfo* This,UINT cchDeviceManufacturer,WCHAR *wzDeviceManufacturer,UINT *pcchActual) {
    return This->lpVtbl->GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetDeviceModels(IWICBitmapCodecInfo* This,UINT cchDeviceModels,WCHAR *wzDeviceModels,UINT *pcchActual) {
    return This->lpVtbl->GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetMimeTypes(IWICBitmapCodecInfo* This,UINT cchMimeTypes,WCHAR *wzMimeTypes,UINT *pcchActual) {
    return This->lpVtbl->GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_GetFileExtensions(IWICBitmapCodecInfo* This,UINT cchFileExtensions,WCHAR *wzFileExtensions,UINT *pcchActual) {
    return This->lpVtbl->GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_DoesSupportAnimation(IWICBitmapCodecInfo* This,WINBOOL *pfSupportAnimation) {
    return This->lpVtbl->DoesSupportAnimation(This,pfSupportAnimation);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_DoesSupportChromaKey(IWICBitmapCodecInfo* This,WINBOOL *pfSupportChromaKey) {
    return This->lpVtbl->DoesSupportChromaKey(This,pfSupportChromaKey);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_DoesSupportLossless(IWICBitmapCodecInfo* This,WINBOOL *pfSupportLossless) {
    return This->lpVtbl->DoesSupportLossless(This,pfSupportLossless);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_DoesSupportMultiframe(IWICBitmapCodecInfo* This,WINBOOL *pfSupportMultiframe) {
    return This->lpVtbl->DoesSupportMultiframe(This,pfSupportMultiframe);
}
static FORCEINLINE HRESULT IWICBitmapCodecInfo_MatchesMimeType(IWICBitmapCodecInfo* This,LPCWSTR wzMimeType,WINBOOL *pfMatches) {
    return This->lpVtbl->MatchesMimeType(This,wzMimeType,pfMatches);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetContainerFormat_Proxy(
    IWICBitmapCodecInfo* This,
    GUID *pguidContainerFormat);
void __RPC_STUB IWICBitmapCodecInfo_GetContainerFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetPixelFormats_Proxy(
    IWICBitmapCodecInfo* This,
    UINT cFormats,
    GUID *pguidPixelFormats,
    UINT *pcActual);
void __RPC_STUB IWICBitmapCodecInfo_GetPixelFormats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetColorManagementVersion_Proxy(
    IWICBitmapCodecInfo* This,
    UINT cchColorManagementVersion,
    WCHAR *wzColorManagementVersion,
    UINT *pcchActual);
void __RPC_STUB IWICBitmapCodecInfo_GetColorManagementVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetDeviceManufacturer_Proxy(
    IWICBitmapCodecInfo* This,
    UINT cchDeviceManufacturer,
    WCHAR *wzDeviceManufacturer,
    UINT *pcchActual);
void __RPC_STUB IWICBitmapCodecInfo_GetDeviceManufacturer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetDeviceModels_Proxy(
    IWICBitmapCodecInfo* This,
    UINT cchDeviceModels,
    WCHAR *wzDeviceModels,
    UINT *pcchActual);
void __RPC_STUB IWICBitmapCodecInfo_GetDeviceModels_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetMimeTypes_Proxy(
    IWICBitmapCodecInfo* This,
    UINT cchMimeTypes,
    WCHAR *wzMimeTypes,
    UINT *pcchActual);
void __RPC_STUB IWICBitmapCodecInfo_GetMimeTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_GetFileExtensions_Proxy(
    IWICBitmapCodecInfo* This,
    UINT cchFileExtensions,
    WCHAR *wzFileExtensions,
    UINT *pcchActual);
void __RPC_STUB IWICBitmapCodecInfo_GetFileExtensions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_DoesSupportAnimation_Proxy(
    IWICBitmapCodecInfo* This,
    WINBOOL *pfSupportAnimation);
void __RPC_STUB IWICBitmapCodecInfo_DoesSupportAnimation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_DoesSupportChromaKey_Proxy(
    IWICBitmapCodecInfo* This,
    WINBOOL *pfSupportChromaKey);
void __RPC_STUB IWICBitmapCodecInfo_DoesSupportChromaKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_DoesSupportLossless_Proxy(
    IWICBitmapCodecInfo* This,
    WINBOOL *pfSupportLossless);
void __RPC_STUB IWICBitmapCodecInfo_DoesSupportLossless_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_DoesSupportMultiframe_Proxy(
    IWICBitmapCodecInfo* This,
    WINBOOL *pfSupportMultiframe);
void __RPC_STUB IWICBitmapCodecInfo_DoesSupportMultiframe_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapCodecInfo_MatchesMimeType_Proxy(
    IWICBitmapCodecInfo* This,
    LPCWSTR wzMimeType,
    WINBOOL *pfMatches);
void __RPC_STUB IWICBitmapCodecInfo_MatchesMimeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapCodecInfo_INTERFACE_DEFINED__ */

#ifndef __IWICBitmapDecoder_FWD_DEFINED__
#define __IWICBitmapDecoder_FWD_DEFINED__
typedef interface IWICBitmapDecoder IWICBitmapDecoder;
#endif

/*****************************************************************************
 * IWICBitmapDecoderInfo interface
 */
#ifndef __IWICBitmapDecoderInfo_INTERFACE_DEFINED__
#define __IWICBitmapDecoderInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapDecoderInfo, 0xd8cd007f, 0xd08f, 0x4191, 0x9b,0xfc, 0x23,0x6e,0xa7,0xf0,0xe4,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d8cd007f-d08f-4191-9bfc-236ea7f0e4b5")
IWICBitmapDecoderInfo : public IWICBitmapCodecInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetPatterns(
        UINT cbSizePatterns,
        WICBitmapPattern *pPatterns,
        UINT *pcPatterns,
        UINT *pcbPatternsActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE MatchesPattern(
        IStream *pIStream,
        WINBOOL *pfMatches) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        IWICBitmapDecoder **ppIBitmapDecoder) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapDecoderInfo, 0xd8cd007f, 0xd08f, 0x4191, 0x9b,0xfc, 0x23,0x6e,0xa7,0xf0,0xe4,0xb5)
#endif
#else
typedef struct IWICBitmapDecoderInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICBitmapDecoderInfo* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICBitmapDecoderInfo* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICBitmapDecoderInfo* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICBitmapDecoderInfo* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICBitmapDecoderInfo* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICBitmapDecoderInfo* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICBitmapDecoderInfo* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICBitmapDecoderInfo* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    /*** IWICBitmapCodecInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICBitmapDecoderInfo* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormats)(
        IWICBitmapDecoderInfo* This,
        UINT cFormats,
        GUID *pguidPixelFormats,
        UINT *pcActual);

    HRESULT (STDMETHODCALLTYPE *GetColorManagementVersion)(
        IWICBitmapDecoderInfo* This,
        UINT cchColorManagementVersion,
        WCHAR *wzColorManagementVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetDeviceManufacturer)(
        IWICBitmapDecoderInfo* This,
        UINT cchDeviceManufacturer,
        WCHAR *wzDeviceManufacturer,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetDeviceModels)(
        IWICBitmapDecoderInfo* This,
        UINT cchDeviceModels,
        WCHAR *wzDeviceModels,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetMimeTypes)(
        IWICBitmapDecoderInfo* This,
        UINT cchMimeTypes,
        WCHAR *wzMimeTypes,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFileExtensions)(
        IWICBitmapDecoderInfo* This,
        UINT cchFileExtensions,
        WCHAR *wzFileExtensions,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *DoesSupportAnimation)(
        IWICBitmapDecoderInfo* This,
        WINBOOL *pfSupportAnimation);

    HRESULT (STDMETHODCALLTYPE *DoesSupportChromaKey)(
        IWICBitmapDecoderInfo* This,
        WINBOOL *pfSupportChromaKey);

    HRESULT (STDMETHODCALLTYPE *DoesSupportLossless)(
        IWICBitmapDecoderInfo* This,
        WINBOOL *pfSupportLossless);

    HRESULT (STDMETHODCALLTYPE *DoesSupportMultiframe)(
        IWICBitmapDecoderInfo* This,
        WINBOOL *pfSupportMultiframe);

    HRESULT (STDMETHODCALLTYPE *MatchesMimeType)(
        IWICBitmapDecoderInfo* This,
        LPCWSTR wzMimeType,
        WINBOOL *pfMatches);

    /*** IWICBitmapDecoderInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPatterns)(
        IWICBitmapDecoderInfo* This,
        UINT cbSizePatterns,
        WICBitmapPattern *pPatterns,
        UINT *pcPatterns,
        UINT *pcbPatternsActual);

    HRESULT (STDMETHODCALLTYPE *MatchesPattern)(
        IWICBitmapDecoderInfo* This,
        IStream *pIStream,
        WINBOOL *pfMatches);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IWICBitmapDecoderInfo* This,
        IWICBitmapDecoder **ppIBitmapDecoder);

    END_INTERFACE
} IWICBitmapDecoderInfoVtbl;
interface IWICBitmapDecoderInfo {
    CONST_VTBL IWICBitmapDecoderInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapDecoderInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapDecoderInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapDecoderInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICBitmapDecoderInfo_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICBitmapDecoderInfo_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICBitmapDecoderInfo_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICBitmapDecoderInfo_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICBitmapDecoderInfo_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICBitmapDecoderInfo_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICBitmapDecoderInfo_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICBitmapDecoderInfo_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
/*** IWICBitmapCodecInfo methods ***/
#define IWICBitmapDecoderInfo_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICBitmapDecoderInfo_GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual) (This)->lpVtbl->GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual)
#define IWICBitmapDecoderInfo_GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual) (This)->lpVtbl->GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual)
#define IWICBitmapDecoderInfo_GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual) (This)->lpVtbl->GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual)
#define IWICBitmapDecoderInfo_GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual) (This)->lpVtbl->GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual)
#define IWICBitmapDecoderInfo_GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual) (This)->lpVtbl->GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual)
#define IWICBitmapDecoderInfo_GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual) (This)->lpVtbl->GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual)
#define IWICBitmapDecoderInfo_DoesSupportAnimation(This,pfSupportAnimation) (This)->lpVtbl->DoesSupportAnimation(This,pfSupportAnimation)
#define IWICBitmapDecoderInfo_DoesSupportChromaKey(This,pfSupportChromaKey) (This)->lpVtbl->DoesSupportChromaKey(This,pfSupportChromaKey)
#define IWICBitmapDecoderInfo_DoesSupportLossless(This,pfSupportLossless) (This)->lpVtbl->DoesSupportLossless(This,pfSupportLossless)
#define IWICBitmapDecoderInfo_DoesSupportMultiframe(This,pfSupportMultiframe) (This)->lpVtbl->DoesSupportMultiframe(This,pfSupportMultiframe)
#define IWICBitmapDecoderInfo_MatchesMimeType(This,wzMimeType,pfMatches) (This)->lpVtbl->MatchesMimeType(This,wzMimeType,pfMatches)
/*** IWICBitmapDecoderInfo methods ***/
#define IWICBitmapDecoderInfo_GetPatterns(This,cbSizePatterns,pPatterns,pcPatterns,pcbPatternsActual) (This)->lpVtbl->GetPatterns(This,cbSizePatterns,pPatterns,pcPatterns,pcbPatternsActual)
#define IWICBitmapDecoderInfo_MatchesPattern(This,pIStream,pfMatches) (This)->lpVtbl->MatchesPattern(This,pIStream,pfMatches)
#define IWICBitmapDecoderInfo_CreateInstance(This,ppIBitmapDecoder) (This)->lpVtbl->CreateInstance(This,ppIBitmapDecoder)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_QueryInterface(IWICBitmapDecoderInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapDecoderInfo_AddRef(IWICBitmapDecoderInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapDecoderInfo_Release(IWICBitmapDecoderInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetComponentType(IWICBitmapDecoderInfo* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetCLSID(IWICBitmapDecoderInfo* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetSigningStatus(IWICBitmapDecoderInfo* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetAuthor(IWICBitmapDecoderInfo* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetVendorGUID(IWICBitmapDecoderInfo* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetVersion(IWICBitmapDecoderInfo* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetSpecVersion(IWICBitmapDecoderInfo* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetFriendlyName(IWICBitmapDecoderInfo* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
/*** IWICBitmapCodecInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetContainerFormat(IWICBitmapDecoderInfo* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetPixelFormats(IWICBitmapDecoderInfo* This,UINT cFormats,GUID *pguidPixelFormats,UINT *pcActual) {
    return This->lpVtbl->GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetColorManagementVersion(IWICBitmapDecoderInfo* This,UINT cchColorManagementVersion,WCHAR *wzColorManagementVersion,UINT *pcchActual) {
    return This->lpVtbl->GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetDeviceManufacturer(IWICBitmapDecoderInfo* This,UINT cchDeviceManufacturer,WCHAR *wzDeviceManufacturer,UINT *pcchActual) {
    return This->lpVtbl->GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetDeviceModels(IWICBitmapDecoderInfo* This,UINT cchDeviceModels,WCHAR *wzDeviceModels,UINT *pcchActual) {
    return This->lpVtbl->GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetMimeTypes(IWICBitmapDecoderInfo* This,UINT cchMimeTypes,WCHAR *wzMimeTypes,UINT *pcchActual) {
    return This->lpVtbl->GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetFileExtensions(IWICBitmapDecoderInfo* This,UINT cchFileExtensions,WCHAR *wzFileExtensions,UINT *pcchActual) {
    return This->lpVtbl->GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_DoesSupportAnimation(IWICBitmapDecoderInfo* This,WINBOOL *pfSupportAnimation) {
    return This->lpVtbl->DoesSupportAnimation(This,pfSupportAnimation);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_DoesSupportChromaKey(IWICBitmapDecoderInfo* This,WINBOOL *pfSupportChromaKey) {
    return This->lpVtbl->DoesSupportChromaKey(This,pfSupportChromaKey);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_DoesSupportLossless(IWICBitmapDecoderInfo* This,WINBOOL *pfSupportLossless) {
    return This->lpVtbl->DoesSupportLossless(This,pfSupportLossless);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_DoesSupportMultiframe(IWICBitmapDecoderInfo* This,WINBOOL *pfSupportMultiframe) {
    return This->lpVtbl->DoesSupportMultiframe(This,pfSupportMultiframe);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_MatchesMimeType(IWICBitmapDecoderInfo* This,LPCWSTR wzMimeType,WINBOOL *pfMatches) {
    return This->lpVtbl->MatchesMimeType(This,wzMimeType,pfMatches);
}
/*** IWICBitmapDecoderInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_GetPatterns(IWICBitmapDecoderInfo* This,UINT cbSizePatterns,WICBitmapPattern *pPatterns,UINT *pcPatterns,UINT *pcbPatternsActual) {
    return This->lpVtbl->GetPatterns(This,cbSizePatterns,pPatterns,pcPatterns,pcbPatternsActual);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_MatchesPattern(IWICBitmapDecoderInfo* This,IStream *pIStream,WINBOOL *pfMatches) {
    return This->lpVtbl->MatchesPattern(This,pIStream,pfMatches);
}
static FORCEINLINE HRESULT IWICBitmapDecoderInfo_CreateInstance(IWICBitmapDecoderInfo* This,IWICBitmapDecoder **ppIBitmapDecoder) {
    return This->lpVtbl->CreateInstance(This,ppIBitmapDecoder);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapDecoderInfo_MatchesPattern_Proxy(
    IWICBitmapDecoderInfo* This,
    IStream *pIStream,
    WINBOOL *pfMatches);
void __RPC_STUB IWICBitmapDecoderInfo_MatchesPattern_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoderInfo_CreateInstance_Proxy(
    IWICBitmapDecoderInfo* This,
    IWICBitmapDecoder **ppIBitmapDecoder);
void __RPC_STUB IWICBitmapDecoderInfo_CreateInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapDecoderInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapDecoder interface
 */
#ifndef __IWICBitmapDecoder_INTERFACE_DEFINED__
#define __IWICBitmapDecoder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapDecoder, 0x9edde9e7, 0x8dee, 0x47ea, 0x99,0xdf, 0xe6,0xfa,0xf2,0xed,0x44,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9edde9e7-8dee-47ea-99df-e6faf2ed44bf")
IWICBitmapDecoder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryCapability(
        IStream *pIStream,
        DWORD *pdwCapability) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IStream *pIStream,
        WICDecodeOptions cacheOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContainerFormat(
        GUID *pguidContainerFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDecoderInfo(
        IWICBitmapDecoderInfo **ppIDecoderInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyPalette(
        IWICPalette *pIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMetadataQueryReader(
        IWICMetadataQueryReader **ppIMetadataQueryReader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreview(
        IWICBitmapSource **ppIBitmapSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorContexts(
        UINT cCount,
        IWICColorContext **ppIColorContexts,
        UINT *pcActualCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThumbnail(
        IWICBitmapSource **ppIThumbnail) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFrameCount(
        UINT *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFrame(
        UINT index,
        IWICBitmapFrameDecode **ppIBitmapFrame) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapDecoder, 0x9edde9e7, 0x8dee, 0x47ea, 0x99,0xdf, 0xe6,0xfa,0xf2,0xed,0x44,0xbf)
#endif
#else
typedef struct IWICBitmapDecoderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapDecoder methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryCapability)(
        IWICBitmapDecoder* This,
        IStream *pIStream,
        DWORD *pdwCapability);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICBitmapDecoder* This,
        IStream *pIStream,
        WICDecodeOptions cacheOptions);

    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICBitmapDecoder* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetDecoderInfo)(
        IWICBitmapDecoder* This,
        IWICBitmapDecoderInfo **ppIDecoderInfo);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmapDecoder* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *GetMetadataQueryReader)(
        IWICBitmapDecoder* This,
        IWICMetadataQueryReader **ppIMetadataQueryReader);

    HRESULT (STDMETHODCALLTYPE *GetPreview)(
        IWICBitmapDecoder* This,
        IWICBitmapSource **ppIBitmapSource);

    HRESULT (STDMETHODCALLTYPE *GetColorContexts)(
        IWICBitmapDecoder* This,
        UINT cCount,
        IWICColorContext **ppIColorContexts,
        UINT *pcActualCount);

    HRESULT (STDMETHODCALLTYPE *GetThumbnail)(
        IWICBitmapDecoder* This,
        IWICBitmapSource **ppIThumbnail);

    HRESULT (STDMETHODCALLTYPE *GetFrameCount)(
        IWICBitmapDecoder* This,
        UINT *pCount);

    HRESULT (STDMETHODCALLTYPE *GetFrame)(
        IWICBitmapDecoder* This,
        UINT index,
        IWICBitmapFrameDecode **ppIBitmapFrame);

    END_INTERFACE
} IWICBitmapDecoderVtbl;
interface IWICBitmapDecoder {
    CONST_VTBL IWICBitmapDecoderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapDecoder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapDecoder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapDecoder_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapDecoder methods ***/
#define IWICBitmapDecoder_QueryCapability(This,pIStream,pdwCapability) (This)->lpVtbl->QueryCapability(This,pIStream,pdwCapability)
#define IWICBitmapDecoder_Initialize(This,pIStream,cacheOptions) (This)->lpVtbl->Initialize(This,pIStream,cacheOptions)
#define IWICBitmapDecoder_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICBitmapDecoder_GetDecoderInfo(This,ppIDecoderInfo) (This)->lpVtbl->GetDecoderInfo(This,ppIDecoderInfo)
#define IWICBitmapDecoder_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmapDecoder_GetMetadataQueryReader(This,ppIMetadataQueryReader) (This)->lpVtbl->GetMetadataQueryReader(This,ppIMetadataQueryReader)
#define IWICBitmapDecoder_GetPreview(This,ppIBitmapSource) (This)->lpVtbl->GetPreview(This,ppIBitmapSource)
#define IWICBitmapDecoder_GetColorContexts(This,cCount,ppIColorContexts,pcActualCount) (This)->lpVtbl->GetColorContexts(This,cCount,ppIColorContexts,pcActualCount)
#define IWICBitmapDecoder_GetThumbnail(This,ppIThumbnail) (This)->lpVtbl->GetThumbnail(This,ppIThumbnail)
#define IWICBitmapDecoder_GetFrameCount(This,pCount) (This)->lpVtbl->GetFrameCount(This,pCount)
#define IWICBitmapDecoder_GetFrame(This,index,ppIBitmapFrame) (This)->lpVtbl->GetFrame(This,index,ppIBitmapFrame)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapDecoder_QueryInterface(IWICBitmapDecoder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapDecoder_AddRef(IWICBitmapDecoder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapDecoder_Release(IWICBitmapDecoder* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapDecoder methods ***/
static FORCEINLINE HRESULT IWICBitmapDecoder_QueryCapability(IWICBitmapDecoder* This,IStream *pIStream,DWORD *pdwCapability) {
    return This->lpVtbl->QueryCapability(This,pIStream,pdwCapability);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_Initialize(IWICBitmapDecoder* This,IStream *pIStream,WICDecodeOptions cacheOptions) {
    return This->lpVtbl->Initialize(This,pIStream,cacheOptions);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetContainerFormat(IWICBitmapDecoder* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetDecoderInfo(IWICBitmapDecoder* This,IWICBitmapDecoderInfo **ppIDecoderInfo) {
    return This->lpVtbl->GetDecoderInfo(This,ppIDecoderInfo);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_CopyPalette(IWICBitmapDecoder* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetMetadataQueryReader(IWICBitmapDecoder* This,IWICMetadataQueryReader **ppIMetadataQueryReader) {
    return This->lpVtbl->GetMetadataQueryReader(This,ppIMetadataQueryReader);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetPreview(IWICBitmapDecoder* This,IWICBitmapSource **ppIBitmapSource) {
    return This->lpVtbl->GetPreview(This,ppIBitmapSource);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetColorContexts(IWICBitmapDecoder* This,UINT cCount,IWICColorContext **ppIColorContexts,UINT *pcActualCount) {
    return This->lpVtbl->GetColorContexts(This,cCount,ppIColorContexts,pcActualCount);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetThumbnail(IWICBitmapDecoder* This,IWICBitmapSource **ppIThumbnail) {
    return This->lpVtbl->GetThumbnail(This,ppIThumbnail);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetFrameCount(IWICBitmapDecoder* This,UINT *pCount) {
    return This->lpVtbl->GetFrameCount(This,pCount);
}
static FORCEINLINE HRESULT IWICBitmapDecoder_GetFrame(IWICBitmapDecoder* This,UINT index,IWICBitmapFrameDecode **ppIBitmapFrame) {
    return This->lpVtbl->GetFrame(This,index,ppIBitmapFrame);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_QueryCapability_Proxy(
    IWICBitmapDecoder* This,
    IStream *pIStream,
    DWORD *pdwCapability);
void __RPC_STUB IWICBitmapDecoder_QueryCapability_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_Initialize_Proxy(
    IWICBitmapDecoder* This,
    IStream *pIStream,
    WICDecodeOptions cacheOptions);
void __RPC_STUB IWICBitmapDecoder_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetContainerFormat_Proxy(
    IWICBitmapDecoder* This,
    GUID *pguidContainerFormat);
void __RPC_STUB IWICBitmapDecoder_GetContainerFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetDecoderInfo_Proxy(
    IWICBitmapDecoder* This,
    IWICBitmapDecoderInfo **ppIDecoderInfo);
void __RPC_STUB IWICBitmapDecoder_GetDecoderInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_CopyPalette_Proxy(
    IWICBitmapDecoder* This,
    IWICPalette *pIPalette);
void __RPC_STUB IWICBitmapDecoder_CopyPalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetMetadataQueryReader_Proxy(
    IWICBitmapDecoder* This,
    IWICMetadataQueryReader **ppIMetadataQueryReader);
void __RPC_STUB IWICBitmapDecoder_GetMetadataQueryReader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetPreview_Proxy(
    IWICBitmapDecoder* This,
    IWICBitmapSource **ppIBitmapSource);
void __RPC_STUB IWICBitmapDecoder_GetPreview_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetColorContexts_Proxy(
    IWICBitmapDecoder* This,
    UINT cCount,
    IWICColorContext **ppIColorContexts,
    UINT *pcActualCount);
void __RPC_STUB IWICBitmapDecoder_GetColorContexts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetThumbnail_Proxy(
    IWICBitmapDecoder* This,
    IWICBitmapSource **ppIThumbnail);
void __RPC_STUB IWICBitmapDecoder_GetThumbnail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetFrameCount_Proxy(
    IWICBitmapDecoder* This,
    UINT *pCount);
void __RPC_STUB IWICBitmapDecoder_GetFrameCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapDecoder_GetFrame_Proxy(
    IWICBitmapDecoder* This,
    UINT index,
    IWICBitmapFrameDecode **ppIBitmapFrame);
void __RPC_STUB IWICBitmapDecoder_GetFrame_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapDecoder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapFrameEncode interface
 */
#ifndef __IWICBitmapFrameEncode_INTERFACE_DEFINED__
#define __IWICBitmapFrameEncode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapFrameEncode, 0x00000105, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000105-a8f2-4877-ba0a-fd2b6645fb94")
IWICBitmapFrameEncode : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IPropertyBag2 *pIEncoderOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSize(
        UINT uiWidth,
        UINT uiHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetResolution(
        double dpiX,
        double dpiY) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPixelFormat(
        WICPixelFormatGUID *pPixelFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColorContexts(
        UINT cCount,
        IWICColorContext **ppIColorContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPalette(
        IWICPalette *pIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThumbnail(
        IWICBitmapSource *pIThumbnail) = 0;

    virtual HRESULT STDMETHODCALLTYPE WritePixels(
        UINT lineCount,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbPixels) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteSource(
        IWICBitmapSource *pIBitmapSource,
        WICRect *prc) = 0;

    virtual HRESULT STDMETHODCALLTYPE Commit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMetadataQueryWriter(
        IWICMetadataQueryWriter **ppIMetadataQueryWriter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapFrameEncode, 0x00000105, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICBitmapFrameEncodeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapFrameEncode methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICBitmapFrameEncode* This,
        IPropertyBag2 *pIEncoderOptions);

    HRESULT (STDMETHODCALLTYPE *SetSize)(
        IWICBitmapFrameEncode* This,
        UINT uiWidth,
        UINT uiHeight);

    HRESULT (STDMETHODCALLTYPE *SetResolution)(
        IWICBitmapFrameEncode* This,
        double dpiX,
        double dpiY);

    HRESULT (STDMETHODCALLTYPE *SetPixelFormat)(
        IWICBitmapFrameEncode* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *SetColorContexts)(
        IWICBitmapFrameEncode* This,
        UINT cCount,
        IWICColorContext **ppIColorContext);

    HRESULT (STDMETHODCALLTYPE *SetPalette)(
        IWICBitmapFrameEncode* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *SetThumbnail)(
        IWICBitmapFrameEncode* This,
        IWICBitmapSource *pIThumbnail);

    HRESULT (STDMETHODCALLTYPE *WritePixels)(
        IWICBitmapFrameEncode* This,
        UINT lineCount,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbPixels);

    HRESULT (STDMETHODCALLTYPE *WriteSource)(
        IWICBitmapFrameEncode* This,
        IWICBitmapSource *pIBitmapSource,
        WICRect *prc);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IWICBitmapFrameEncode* This);

    HRESULT (STDMETHODCALLTYPE *GetMetadataQueryWriter)(
        IWICBitmapFrameEncode* This,
        IWICMetadataQueryWriter **ppIMetadataQueryWriter);

    END_INTERFACE
} IWICBitmapFrameEncodeVtbl;
interface IWICBitmapFrameEncode {
    CONST_VTBL IWICBitmapFrameEncodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapFrameEncode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapFrameEncode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapFrameEncode_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapFrameEncode methods ***/
#define IWICBitmapFrameEncode_Initialize(This,pIEncoderOptions) (This)->lpVtbl->Initialize(This,pIEncoderOptions)
#define IWICBitmapFrameEncode_SetSize(This,uiWidth,uiHeight) (This)->lpVtbl->SetSize(This,uiWidth,uiHeight)
#define IWICBitmapFrameEncode_SetResolution(This,dpiX,dpiY) (This)->lpVtbl->SetResolution(This,dpiX,dpiY)
#define IWICBitmapFrameEncode_SetPixelFormat(This,pPixelFormat) (This)->lpVtbl->SetPixelFormat(This,pPixelFormat)
#define IWICBitmapFrameEncode_SetColorContexts(This,cCount,ppIColorContext) (This)->lpVtbl->SetColorContexts(This,cCount,ppIColorContext)
#define IWICBitmapFrameEncode_SetPalette(This,pIPalette) (This)->lpVtbl->SetPalette(This,pIPalette)
#define IWICBitmapFrameEncode_SetThumbnail(This,pIThumbnail) (This)->lpVtbl->SetThumbnail(This,pIThumbnail)
#define IWICBitmapFrameEncode_WritePixels(This,lineCount,cbStride,cbBufferSize,pbPixels) (This)->lpVtbl->WritePixels(This,lineCount,cbStride,cbBufferSize,pbPixels)
#define IWICBitmapFrameEncode_WriteSource(This,pIBitmapSource,prc) (This)->lpVtbl->WriteSource(This,pIBitmapSource,prc)
#define IWICBitmapFrameEncode_Commit(This) (This)->lpVtbl->Commit(This)
#define IWICBitmapFrameEncode_GetMetadataQueryWriter(This,ppIMetadataQueryWriter) (This)->lpVtbl->GetMetadataQueryWriter(This,ppIMetadataQueryWriter)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapFrameEncode_QueryInterface(IWICBitmapFrameEncode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapFrameEncode_AddRef(IWICBitmapFrameEncode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapFrameEncode_Release(IWICBitmapFrameEncode* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapFrameEncode methods ***/
static FORCEINLINE HRESULT IWICBitmapFrameEncode_Initialize(IWICBitmapFrameEncode* This,IPropertyBag2 *pIEncoderOptions) {
    return This->lpVtbl->Initialize(This,pIEncoderOptions);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_SetSize(IWICBitmapFrameEncode* This,UINT uiWidth,UINT uiHeight) {
    return This->lpVtbl->SetSize(This,uiWidth,uiHeight);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_SetResolution(IWICBitmapFrameEncode* This,double dpiX,double dpiY) {
    return This->lpVtbl->SetResolution(This,dpiX,dpiY);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_SetPixelFormat(IWICBitmapFrameEncode* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->SetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_SetColorContexts(IWICBitmapFrameEncode* This,UINT cCount,IWICColorContext **ppIColorContext) {
    return This->lpVtbl->SetColorContexts(This,cCount,ppIColorContext);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_SetPalette(IWICBitmapFrameEncode* This,IWICPalette *pIPalette) {
    return This->lpVtbl->SetPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_SetThumbnail(IWICBitmapFrameEncode* This,IWICBitmapSource *pIThumbnail) {
    return This->lpVtbl->SetThumbnail(This,pIThumbnail);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_WritePixels(IWICBitmapFrameEncode* This,UINT lineCount,UINT cbStride,UINT cbBufferSize,BYTE *pbPixels) {
    return This->lpVtbl->WritePixels(This,lineCount,cbStride,cbBufferSize,pbPixels);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_WriteSource(IWICBitmapFrameEncode* This,IWICBitmapSource *pIBitmapSource,WICRect *prc) {
    return This->lpVtbl->WriteSource(This,pIBitmapSource,prc);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_Commit(IWICBitmapFrameEncode* This) {
    return This->lpVtbl->Commit(This);
}
static FORCEINLINE HRESULT IWICBitmapFrameEncode_GetMetadataQueryWriter(IWICBitmapFrameEncode* This,IWICMetadataQueryWriter **ppIMetadataQueryWriter) {
    return This->lpVtbl->GetMetadataQueryWriter(This,ppIMetadataQueryWriter);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_Initialize_Proxy(
    IWICBitmapFrameEncode* This,
    IPropertyBag2 *pIEncoderOptions);
void __RPC_STUB IWICBitmapFrameEncode_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_SetSize_Proxy(
    IWICBitmapFrameEncode* This,
    UINT uiWidth,
    UINT uiHeight);
void __RPC_STUB IWICBitmapFrameEncode_SetSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_SetResolution_Proxy(
    IWICBitmapFrameEncode* This,
    double dpiX,
    double dpiY);
void __RPC_STUB IWICBitmapFrameEncode_SetResolution_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_SetPixelFormat_Proxy(
    IWICBitmapFrameEncode* This,
    WICPixelFormatGUID *pPixelFormat);
void __RPC_STUB IWICBitmapFrameEncode_SetPixelFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_SetColorContexts_Proxy(
    IWICBitmapFrameEncode* This,
    UINT cCount,
    IWICColorContext **ppIColorContext);
void __RPC_STUB IWICBitmapFrameEncode_SetColorContexts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_SetPalette_Proxy(
    IWICBitmapFrameEncode* This,
    IWICPalette *pIPalette);
void __RPC_STUB IWICBitmapFrameEncode_SetPalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_SetThumbnail_Proxy(
    IWICBitmapFrameEncode* This,
    IWICBitmapSource *pIThumbnail);
void __RPC_STUB IWICBitmapFrameEncode_SetThumbnail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_WritePixels_Proxy(
    IWICBitmapFrameEncode* This,
    UINT lineCount,
    UINT cbStride,
    UINT cbBufferSize,
    BYTE *pbPixels);
void __RPC_STUB IWICBitmapFrameEncode_WritePixels_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_WriteSource_Proxy(
    IWICBitmapFrameEncode* This,
    IWICBitmapSource *pIBitmapSource,
    WICRect *prc);
void __RPC_STUB IWICBitmapFrameEncode_WriteSource_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_Commit_Proxy(
    IWICBitmapFrameEncode* This);
void __RPC_STUB IWICBitmapFrameEncode_Commit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapFrameEncode_GetMetadataQueryWriter_Proxy(
    IWICBitmapFrameEncode* This,
    IWICMetadataQueryWriter **ppIMetadataQueryWriter);
void __RPC_STUB IWICBitmapFrameEncode_GetMetadataQueryWriter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapFrameEncode_INTERFACE_DEFINED__ */

#ifndef __IWICBitmapEncoder_FWD_DEFINED__
#define __IWICBitmapEncoder_FWD_DEFINED__
typedef interface IWICBitmapEncoder IWICBitmapEncoder;
#endif

/*****************************************************************************
 * IWICBitmapEncoderInfo interface
 */
#ifndef __IWICBitmapEncoderInfo_INTERFACE_DEFINED__
#define __IWICBitmapEncoderInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapEncoderInfo, 0x94c9b4ee, 0xa09f, 0x4f92, 0x8a,0x1e, 0x4a,0x9b,0xce,0x7e,0x76,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("94c9b4ee-a09f-4f92-8a1e-4a9bce7e76fb")
IWICBitmapEncoderInfo : public IWICBitmapCodecInfo
{
    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        IWICBitmapEncoder **ppIBitmapEncoder) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapEncoderInfo, 0x94c9b4ee, 0xa09f, 0x4f92, 0x8a,0x1e, 0x4a,0x9b,0xce,0x7e,0x76,0xfb)
#endif
#else
typedef struct IWICBitmapEncoderInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICBitmapEncoderInfo* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICBitmapEncoderInfo* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICBitmapEncoderInfo* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICBitmapEncoderInfo* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICBitmapEncoderInfo* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICBitmapEncoderInfo* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICBitmapEncoderInfo* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICBitmapEncoderInfo* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    /*** IWICBitmapCodecInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICBitmapEncoderInfo* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormats)(
        IWICBitmapEncoderInfo* This,
        UINT cFormats,
        GUID *pguidPixelFormats,
        UINT *pcActual);

    HRESULT (STDMETHODCALLTYPE *GetColorManagementVersion)(
        IWICBitmapEncoderInfo* This,
        UINT cchColorManagementVersion,
        WCHAR *wzColorManagementVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetDeviceManufacturer)(
        IWICBitmapEncoderInfo* This,
        UINT cchDeviceManufacturer,
        WCHAR *wzDeviceManufacturer,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetDeviceModels)(
        IWICBitmapEncoderInfo* This,
        UINT cchDeviceModels,
        WCHAR *wzDeviceModels,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetMimeTypes)(
        IWICBitmapEncoderInfo* This,
        UINT cchMimeTypes,
        WCHAR *wzMimeTypes,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFileExtensions)(
        IWICBitmapEncoderInfo* This,
        UINT cchFileExtensions,
        WCHAR *wzFileExtensions,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *DoesSupportAnimation)(
        IWICBitmapEncoderInfo* This,
        WINBOOL *pfSupportAnimation);

    HRESULT (STDMETHODCALLTYPE *DoesSupportChromaKey)(
        IWICBitmapEncoderInfo* This,
        WINBOOL *pfSupportChromaKey);

    HRESULT (STDMETHODCALLTYPE *DoesSupportLossless)(
        IWICBitmapEncoderInfo* This,
        WINBOOL *pfSupportLossless);

    HRESULT (STDMETHODCALLTYPE *DoesSupportMultiframe)(
        IWICBitmapEncoderInfo* This,
        WINBOOL *pfSupportMultiframe);

    HRESULT (STDMETHODCALLTYPE *MatchesMimeType)(
        IWICBitmapEncoderInfo* This,
        LPCWSTR wzMimeType,
        WINBOOL *pfMatches);

    /*** IWICBitmapEncoderInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IWICBitmapEncoderInfo* This,
        IWICBitmapEncoder **ppIBitmapEncoder);

    END_INTERFACE
} IWICBitmapEncoderInfoVtbl;
interface IWICBitmapEncoderInfo {
    CONST_VTBL IWICBitmapEncoderInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapEncoderInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapEncoderInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapEncoderInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICBitmapEncoderInfo_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICBitmapEncoderInfo_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICBitmapEncoderInfo_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICBitmapEncoderInfo_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICBitmapEncoderInfo_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICBitmapEncoderInfo_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICBitmapEncoderInfo_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICBitmapEncoderInfo_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
/*** IWICBitmapCodecInfo methods ***/
#define IWICBitmapEncoderInfo_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICBitmapEncoderInfo_GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual) (This)->lpVtbl->GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual)
#define IWICBitmapEncoderInfo_GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual) (This)->lpVtbl->GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual)
#define IWICBitmapEncoderInfo_GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual) (This)->lpVtbl->GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual)
#define IWICBitmapEncoderInfo_GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual) (This)->lpVtbl->GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual)
#define IWICBitmapEncoderInfo_GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual) (This)->lpVtbl->GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual)
#define IWICBitmapEncoderInfo_GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual) (This)->lpVtbl->GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual)
#define IWICBitmapEncoderInfo_DoesSupportAnimation(This,pfSupportAnimation) (This)->lpVtbl->DoesSupportAnimation(This,pfSupportAnimation)
#define IWICBitmapEncoderInfo_DoesSupportChromaKey(This,pfSupportChromaKey) (This)->lpVtbl->DoesSupportChromaKey(This,pfSupportChromaKey)
#define IWICBitmapEncoderInfo_DoesSupportLossless(This,pfSupportLossless) (This)->lpVtbl->DoesSupportLossless(This,pfSupportLossless)
#define IWICBitmapEncoderInfo_DoesSupportMultiframe(This,pfSupportMultiframe) (This)->lpVtbl->DoesSupportMultiframe(This,pfSupportMultiframe)
#define IWICBitmapEncoderInfo_MatchesMimeType(This,wzMimeType,pfMatches) (This)->lpVtbl->MatchesMimeType(This,wzMimeType,pfMatches)
/*** IWICBitmapEncoderInfo methods ***/
#define IWICBitmapEncoderInfo_CreateInstance(This,ppIBitmapEncoder) (This)->lpVtbl->CreateInstance(This,ppIBitmapEncoder)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_QueryInterface(IWICBitmapEncoderInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapEncoderInfo_AddRef(IWICBitmapEncoderInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapEncoderInfo_Release(IWICBitmapEncoderInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetComponentType(IWICBitmapEncoderInfo* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetCLSID(IWICBitmapEncoderInfo* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetSigningStatus(IWICBitmapEncoderInfo* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetAuthor(IWICBitmapEncoderInfo* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetVendorGUID(IWICBitmapEncoderInfo* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetVersion(IWICBitmapEncoderInfo* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetSpecVersion(IWICBitmapEncoderInfo* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetFriendlyName(IWICBitmapEncoderInfo* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
/*** IWICBitmapCodecInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetContainerFormat(IWICBitmapEncoderInfo* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetPixelFormats(IWICBitmapEncoderInfo* This,UINT cFormats,GUID *pguidPixelFormats,UINT *pcActual) {
    return This->lpVtbl->GetPixelFormats(This,cFormats,pguidPixelFormats,pcActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetColorManagementVersion(IWICBitmapEncoderInfo* This,UINT cchColorManagementVersion,WCHAR *wzColorManagementVersion,UINT *pcchActual) {
    return This->lpVtbl->GetColorManagementVersion(This,cchColorManagementVersion,wzColorManagementVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetDeviceManufacturer(IWICBitmapEncoderInfo* This,UINT cchDeviceManufacturer,WCHAR *wzDeviceManufacturer,UINT *pcchActual) {
    return This->lpVtbl->GetDeviceManufacturer(This,cchDeviceManufacturer,wzDeviceManufacturer,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetDeviceModels(IWICBitmapEncoderInfo* This,UINT cchDeviceModels,WCHAR *wzDeviceModels,UINT *pcchActual) {
    return This->lpVtbl->GetDeviceModels(This,cchDeviceModels,wzDeviceModels,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetMimeTypes(IWICBitmapEncoderInfo* This,UINT cchMimeTypes,WCHAR *wzMimeTypes,UINT *pcchActual) {
    return This->lpVtbl->GetMimeTypes(This,cchMimeTypes,wzMimeTypes,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_GetFileExtensions(IWICBitmapEncoderInfo* This,UINT cchFileExtensions,WCHAR *wzFileExtensions,UINT *pcchActual) {
    return This->lpVtbl->GetFileExtensions(This,cchFileExtensions,wzFileExtensions,pcchActual);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_DoesSupportAnimation(IWICBitmapEncoderInfo* This,WINBOOL *pfSupportAnimation) {
    return This->lpVtbl->DoesSupportAnimation(This,pfSupportAnimation);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_DoesSupportChromaKey(IWICBitmapEncoderInfo* This,WINBOOL *pfSupportChromaKey) {
    return This->lpVtbl->DoesSupportChromaKey(This,pfSupportChromaKey);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_DoesSupportLossless(IWICBitmapEncoderInfo* This,WINBOOL *pfSupportLossless) {
    return This->lpVtbl->DoesSupportLossless(This,pfSupportLossless);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_DoesSupportMultiframe(IWICBitmapEncoderInfo* This,WINBOOL *pfSupportMultiframe) {
    return This->lpVtbl->DoesSupportMultiframe(This,pfSupportMultiframe);
}
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_MatchesMimeType(IWICBitmapEncoderInfo* This,LPCWSTR wzMimeType,WINBOOL *pfMatches) {
    return This->lpVtbl->MatchesMimeType(This,wzMimeType,pfMatches);
}
/*** IWICBitmapEncoderInfo methods ***/
static FORCEINLINE HRESULT IWICBitmapEncoderInfo_CreateInstance(IWICBitmapEncoderInfo* This,IWICBitmapEncoder **ppIBitmapEncoder) {
    return This->lpVtbl->CreateInstance(This,ppIBitmapEncoder);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapEncoderInfo_CreateInstance_Proxy(
    IWICBitmapEncoderInfo* This,
    IWICBitmapEncoder **ppIBitmapEncoder);
void __RPC_STUB IWICBitmapEncoderInfo_CreateInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapEncoderInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapEncoder interface
 */
#ifndef __IWICBitmapEncoder_INTERFACE_DEFINED__
#define __IWICBitmapEncoder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapEncoder, 0x00000103, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000103-a8f2-4877-ba0a-fd2b6645fb94")
IWICBitmapEncoder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IStream *pIStream,
        WICBitmapEncoderCacheOption cacheOption) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContainerFormat(
        GUID *pguidContainerFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEncoderInfo(
        IWICBitmapEncoderInfo **ppIEncoderInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColorContexts(
        UINT cCount,
        IWICColorContext **ppIColorContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPalette(
        IWICPalette *pIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThumbnail(
        IWICBitmapSource *pIThumbnail) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPreview(
        IWICBitmapSource *pIPreview) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewFrame(
        IWICBitmapFrameEncode **ppIFrameEncode,
        IPropertyBag2 **ppIEncoderOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE Commit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMetadataQueryWriter(
        IWICMetadataQueryWriter **ppIMetadataQueryWriter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapEncoder, 0x00000103, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICBitmapEncoderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapEncoder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICBitmapEncoder* This,
        IStream *pIStream,
        WICBitmapEncoderCacheOption cacheOption);

    HRESULT (STDMETHODCALLTYPE *GetContainerFormat)(
        IWICBitmapEncoder* This,
        GUID *pguidContainerFormat);

    HRESULT (STDMETHODCALLTYPE *GetEncoderInfo)(
        IWICBitmapEncoder* This,
        IWICBitmapEncoderInfo **ppIEncoderInfo);

    HRESULT (STDMETHODCALLTYPE *SetColorContexts)(
        IWICBitmapEncoder* This,
        UINT cCount,
        IWICColorContext **ppIColorContext);

    HRESULT (STDMETHODCALLTYPE *SetPalette)(
        IWICBitmapEncoder* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *SetThumbnail)(
        IWICBitmapEncoder* This,
        IWICBitmapSource *pIThumbnail);

    HRESULT (STDMETHODCALLTYPE *SetPreview)(
        IWICBitmapEncoder* This,
        IWICBitmapSource *pIPreview);

    HRESULT (STDMETHODCALLTYPE *CreateNewFrame)(
        IWICBitmapEncoder* This,
        IWICBitmapFrameEncode **ppIFrameEncode,
        IPropertyBag2 **ppIEncoderOptions);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IWICBitmapEncoder* This);

    HRESULT (STDMETHODCALLTYPE *GetMetadataQueryWriter)(
        IWICBitmapEncoder* This,
        IWICMetadataQueryWriter **ppIMetadataQueryWriter);

    END_INTERFACE
} IWICBitmapEncoderVtbl;
interface IWICBitmapEncoder {
    CONST_VTBL IWICBitmapEncoderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapEncoder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapEncoder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapEncoder_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapEncoder methods ***/
#define IWICBitmapEncoder_Initialize(This,pIStream,cacheOption) (This)->lpVtbl->Initialize(This,pIStream,cacheOption)
#define IWICBitmapEncoder_GetContainerFormat(This,pguidContainerFormat) (This)->lpVtbl->GetContainerFormat(This,pguidContainerFormat)
#define IWICBitmapEncoder_GetEncoderInfo(This,ppIEncoderInfo) (This)->lpVtbl->GetEncoderInfo(This,ppIEncoderInfo)
#define IWICBitmapEncoder_SetColorContexts(This,cCount,ppIColorContext) (This)->lpVtbl->SetColorContexts(This,cCount,ppIColorContext)
#define IWICBitmapEncoder_SetPalette(This,pIPalette) (This)->lpVtbl->SetPalette(This,pIPalette)
#define IWICBitmapEncoder_SetThumbnail(This,pIThumbnail) (This)->lpVtbl->SetThumbnail(This,pIThumbnail)
#define IWICBitmapEncoder_SetPreview(This,pIPreview) (This)->lpVtbl->SetPreview(This,pIPreview)
#define IWICBitmapEncoder_CreateNewFrame(This,ppIFrameEncode,ppIEncoderOptions) (This)->lpVtbl->CreateNewFrame(This,ppIFrameEncode,ppIEncoderOptions)
#define IWICBitmapEncoder_Commit(This) (This)->lpVtbl->Commit(This)
#define IWICBitmapEncoder_GetMetadataQueryWriter(This,ppIMetadataQueryWriter) (This)->lpVtbl->GetMetadataQueryWriter(This,ppIMetadataQueryWriter)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapEncoder_QueryInterface(IWICBitmapEncoder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapEncoder_AddRef(IWICBitmapEncoder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapEncoder_Release(IWICBitmapEncoder* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapEncoder methods ***/
static FORCEINLINE HRESULT IWICBitmapEncoder_Initialize(IWICBitmapEncoder* This,IStream *pIStream,WICBitmapEncoderCacheOption cacheOption) {
    return This->lpVtbl->Initialize(This,pIStream,cacheOption);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_GetContainerFormat(IWICBitmapEncoder* This,GUID *pguidContainerFormat) {
    return This->lpVtbl->GetContainerFormat(This,pguidContainerFormat);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_GetEncoderInfo(IWICBitmapEncoder* This,IWICBitmapEncoderInfo **ppIEncoderInfo) {
    return This->lpVtbl->GetEncoderInfo(This,ppIEncoderInfo);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_SetColorContexts(IWICBitmapEncoder* This,UINT cCount,IWICColorContext **ppIColorContext) {
    return This->lpVtbl->SetColorContexts(This,cCount,ppIColorContext);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_SetPalette(IWICBitmapEncoder* This,IWICPalette *pIPalette) {
    return This->lpVtbl->SetPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_SetThumbnail(IWICBitmapEncoder* This,IWICBitmapSource *pIThumbnail) {
    return This->lpVtbl->SetThumbnail(This,pIThumbnail);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_SetPreview(IWICBitmapEncoder* This,IWICBitmapSource *pIPreview) {
    return This->lpVtbl->SetPreview(This,pIPreview);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_CreateNewFrame(IWICBitmapEncoder* This,IWICBitmapFrameEncode **ppIFrameEncode,IPropertyBag2 **ppIEncoderOptions) {
    return This->lpVtbl->CreateNewFrame(This,ppIFrameEncode,ppIEncoderOptions);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_Commit(IWICBitmapEncoder* This) {
    return This->lpVtbl->Commit(This);
}
static FORCEINLINE HRESULT IWICBitmapEncoder_GetMetadataQueryWriter(IWICBitmapEncoder* This,IWICMetadataQueryWriter **ppIMetadataQueryWriter) {
    return This->lpVtbl->GetMetadataQueryWriter(This,ppIMetadataQueryWriter);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_Initialize_Proxy(
    IWICBitmapEncoder* This,
    IStream *pIStream,
    WICBitmapEncoderCacheOption cacheOption);
void __RPC_STUB IWICBitmapEncoder_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_GetContainerFormat_Proxy(
    IWICBitmapEncoder* This,
    GUID *pguidContainerFormat);
void __RPC_STUB IWICBitmapEncoder_GetContainerFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_GetEncoderInfo_Proxy(
    IWICBitmapEncoder* This,
    IWICBitmapEncoderInfo **ppIEncoderInfo);
void __RPC_STUB IWICBitmapEncoder_GetEncoderInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_SetColorContexts_Proxy(
    IWICBitmapEncoder* This,
    UINT cCount,
    IWICColorContext **ppIColorContext);
void __RPC_STUB IWICBitmapEncoder_SetColorContexts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_SetPalette_Proxy(
    IWICBitmapEncoder* This,
    IWICPalette *pIPalette);
void __RPC_STUB IWICBitmapEncoder_SetPalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_SetThumbnail_Proxy(
    IWICBitmapEncoder* This,
    IWICBitmapSource *pIThumbnail);
void __RPC_STUB IWICBitmapEncoder_SetThumbnail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_SetPreview_Proxy(
    IWICBitmapEncoder* This,
    IWICBitmapSource *pIPreview);
void __RPC_STUB IWICBitmapEncoder_SetPreview_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_CreateNewFrame_Proxy(
    IWICBitmapEncoder* This,
    IWICBitmapFrameEncode **ppIFrameEncode,
    IPropertyBag2 **ppIEncoderOptions);
void __RPC_STUB IWICBitmapEncoder_CreateNewFrame_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_Commit_Proxy(
    IWICBitmapEncoder* This);
void __RPC_STUB IWICBitmapEncoder_Commit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICBitmapEncoder_GetMetadataQueryWriter_Proxy(
    IWICBitmapEncoder* This,
    IWICMetadataQueryWriter **ppIMetadataQueryWriter);
void __RPC_STUB IWICBitmapEncoder_GetMetadataQueryWriter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapEncoder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICFormatConverter interface
 */
#ifndef __IWICFormatConverter_INTERFACE_DEFINED__
#define __IWICFormatConverter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICFormatConverter, 0x00000301, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000301-a8f2-4877-ba0a-fd2b6645fb94")
IWICFormatConverter : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IWICBitmapSource *pISource,
        REFWICPixelFormatGUID dstFormat,
        WICBitmapDitherType dither,
        IWICPalette *pIPalette,
        double alphaThresholdPercent,
        WICBitmapPaletteType paletteTranslate) = 0;

    virtual HRESULT STDMETHODCALLTYPE CanConvert(
        REFWICPixelFormatGUID srcPixelFormat,
        REFWICPixelFormatGUID dstPixelFormat,
        WINBOOL *pfCanConvert) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICFormatConverter, 0x00000301, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICFormatConverterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICFormatConverter* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICFormatConverter* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICFormatConverter* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICFormatConverter* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICFormatConverter* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICFormatConverter methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICFormatConverter* This,
        IWICBitmapSource *pISource,
        REFWICPixelFormatGUID dstFormat,
        WICBitmapDitherType dither,
        IWICPalette *pIPalette,
        double alphaThresholdPercent,
        WICBitmapPaletteType paletteTranslate);

    HRESULT (STDMETHODCALLTYPE *CanConvert)(
        IWICFormatConverter* This,
        REFWICPixelFormatGUID srcPixelFormat,
        REFWICPixelFormatGUID dstPixelFormat,
        WINBOOL *pfCanConvert);

    END_INTERFACE
} IWICFormatConverterVtbl;
interface IWICFormatConverter {
    CONST_VTBL IWICFormatConverterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICFormatConverter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICFormatConverter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICFormatConverter_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICFormatConverter_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICFormatConverter_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICFormatConverter_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICFormatConverter_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICFormatConverter_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICFormatConverter methods ***/
#define IWICFormatConverter_Initialize(This,pISource,dstFormat,dither,pIPalette,alphaThresholdPercent,paletteTranslate) (This)->lpVtbl->Initialize(This,pISource,dstFormat,dither,pIPalette,alphaThresholdPercent,paletteTranslate)
#define IWICFormatConverter_CanConvert(This,srcPixelFormat,dstPixelFormat,pfCanConvert) (This)->lpVtbl->CanConvert(This,srcPixelFormat,dstPixelFormat,pfCanConvert)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICFormatConverter_QueryInterface(IWICFormatConverter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICFormatConverter_AddRef(IWICFormatConverter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICFormatConverter_Release(IWICFormatConverter* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICFormatConverter_GetSize(IWICFormatConverter* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICFormatConverter_GetPixelFormat(IWICFormatConverter* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICFormatConverter_GetResolution(IWICFormatConverter* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICFormatConverter_CopyPalette(IWICFormatConverter* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICFormatConverter_CopyPixels(IWICFormatConverter* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICFormatConverter methods ***/
static FORCEINLINE HRESULT IWICFormatConverter_Initialize(IWICFormatConverter* This,IWICBitmapSource *pISource,REFWICPixelFormatGUID dstFormat,WICBitmapDitherType dither,IWICPalette *pIPalette,double alphaThresholdPercent,WICBitmapPaletteType paletteTranslate) {
    return This->lpVtbl->Initialize(This,pISource,dstFormat,dither,pIPalette,alphaThresholdPercent,paletteTranslate);
}
static FORCEINLINE HRESULT IWICFormatConverter_CanConvert(IWICFormatConverter* This,REFWICPixelFormatGUID srcPixelFormat,REFWICPixelFormatGUID dstPixelFormat,WINBOOL *pfCanConvert) {
    return This->lpVtbl->CanConvert(This,srcPixelFormat,dstPixelFormat,pfCanConvert);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICFormatConverter_Initialize_Proxy(
    IWICFormatConverter* This,
    IWICBitmapSource *pISource,
    REFWICPixelFormatGUID dstFormat,
    WICBitmapDitherType dither,
    IWICPalette *pIPalette,
    double alphaThresholdPercent,
    WICBitmapPaletteType paletteTranslate);
void __RPC_STUB IWICFormatConverter_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICFormatConverter_CanConvert_Proxy(
    IWICFormatConverter* This,
    REFWICPixelFormatGUID srcPixelFormat,
    REFWICPixelFormatGUID dstPixelFormat,
    WINBOOL *pfCanConvert);
void __RPC_STUB IWICFormatConverter_CanConvert_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICFormatConverter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICFormatConverterInfo interface
 */
#ifndef __IWICFormatConverterInfo_INTERFACE_DEFINED__
#define __IWICFormatConverterInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICFormatConverterInfo, 0x9f34fb65, 0x13f4, 0x4f15, 0xbc,0x57, 0x37,0x26,0xb5,0xe5,0x3d,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9f34fb65-13f4-4f15-bc57-3726b5e53d9f")
IWICFormatConverterInfo : public IWICComponentInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetPixelFormats(
        UINT cFormats,
        WICPixelFormatGUID *pPixelFormatGUIDs,
        UINT *pcActual) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        IWICFormatConverter **ppIConverter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICFormatConverterInfo, 0x9f34fb65, 0x13f4, 0x4f15, 0xbc,0x57, 0x37,0x26,0xb5,0xe5,0x3d,0x9f)
#endif
#else
typedef struct IWICFormatConverterInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICComponentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IWICFormatConverterInfo* This,
        WICComponentType *pType);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IWICFormatConverterInfo* This,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetSigningStatus)(
        IWICFormatConverterInfo* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetAuthor)(
        IWICFormatConverterInfo* This,
        UINT cchAuthor,
        WCHAR *wzAuthor,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetVendorGUID)(
        IWICFormatConverterInfo* This,
        GUID *pguidVendor);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWICFormatConverterInfo* This,
        UINT cchVersion,
        WCHAR *wzVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetSpecVersion)(
        IWICFormatConverterInfo* This,
        UINT cchSpecVersion,
        WCHAR *wzSpecVersion,
        UINT *pcchActual);

    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
        IWICFormatConverterInfo* This,
        UINT cchFriendlyName,
        WCHAR *wzFriendlyName,
        UINT *pcchActual);

    /*** IWICFormatConverterInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPixelFormats)(
        IWICFormatConverterInfo* This,
        UINT cFormats,
        WICPixelFormatGUID *pPixelFormatGUIDs,
        UINT *pcActual);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IWICFormatConverterInfo* This,
        IWICFormatConverter **ppIConverter);

    END_INTERFACE
} IWICFormatConverterInfoVtbl;
interface IWICFormatConverterInfo {
    CONST_VTBL IWICFormatConverterInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICFormatConverterInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICFormatConverterInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICFormatConverterInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWICComponentInfo methods ***/
#define IWICFormatConverterInfo_GetComponentType(This,pType) (This)->lpVtbl->GetComponentType(This,pType)
#define IWICFormatConverterInfo_GetCLSID(This,pclsid) (This)->lpVtbl->GetCLSID(This,pclsid)
#define IWICFormatConverterInfo_GetSigningStatus(This,pStatus) (This)->lpVtbl->GetSigningStatus(This,pStatus)
#define IWICFormatConverterInfo_GetAuthor(This,cchAuthor,wzAuthor,pcchActual) (This)->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual)
#define IWICFormatConverterInfo_GetVendorGUID(This,pguidVendor) (This)->lpVtbl->GetVendorGUID(This,pguidVendor)
#define IWICFormatConverterInfo_GetVersion(This,cchVersion,wzVersion,pcchActual) (This)->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual)
#define IWICFormatConverterInfo_GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual) (This)->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual)
#define IWICFormatConverterInfo_GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual) (This)->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual)
/*** IWICFormatConverterInfo methods ***/
#define IWICFormatConverterInfo_GetPixelFormats(This,cFormats,pPixelFormatGUIDs,pcActual) (This)->lpVtbl->GetPixelFormats(This,cFormats,pPixelFormatGUIDs,pcActual)
#define IWICFormatConverterInfo_CreateInstance(This,ppIConverter) (This)->lpVtbl->CreateInstance(This,ppIConverter)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICFormatConverterInfo_QueryInterface(IWICFormatConverterInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICFormatConverterInfo_AddRef(IWICFormatConverterInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICFormatConverterInfo_Release(IWICFormatConverterInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICComponentInfo methods ***/
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetComponentType(IWICFormatConverterInfo* This,WICComponentType *pType) {
    return This->lpVtbl->GetComponentType(This,pType);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetCLSID(IWICFormatConverterInfo* This,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,pclsid);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetSigningStatus(IWICFormatConverterInfo* This,DWORD *pStatus) {
    return This->lpVtbl->GetSigningStatus(This,pStatus);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetAuthor(IWICFormatConverterInfo* This,UINT cchAuthor,WCHAR *wzAuthor,UINT *pcchActual) {
    return This->lpVtbl->GetAuthor(This,cchAuthor,wzAuthor,pcchActual);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetVendorGUID(IWICFormatConverterInfo* This,GUID *pguidVendor) {
    return This->lpVtbl->GetVendorGUID(This,pguidVendor);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetVersion(IWICFormatConverterInfo* This,UINT cchVersion,WCHAR *wzVersion,UINT *pcchActual) {
    return This->lpVtbl->GetVersion(This,cchVersion,wzVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetSpecVersion(IWICFormatConverterInfo* This,UINT cchSpecVersion,WCHAR *wzSpecVersion,UINT *pcchActual) {
    return This->lpVtbl->GetSpecVersion(This,cchSpecVersion,wzSpecVersion,pcchActual);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetFriendlyName(IWICFormatConverterInfo* This,UINT cchFriendlyName,WCHAR *wzFriendlyName,UINT *pcchActual) {
    return This->lpVtbl->GetFriendlyName(This,cchFriendlyName,wzFriendlyName,pcchActual);
}
/*** IWICFormatConverterInfo methods ***/
static FORCEINLINE HRESULT IWICFormatConverterInfo_GetPixelFormats(IWICFormatConverterInfo* This,UINT cFormats,WICPixelFormatGUID *pPixelFormatGUIDs,UINT *pcActual) {
    return This->lpVtbl->GetPixelFormats(This,cFormats,pPixelFormatGUIDs,pcActual);
}
static FORCEINLINE HRESULT IWICFormatConverterInfo_CreateInstance(IWICFormatConverterInfo* This,IWICFormatConverter **ppIConverter) {
    return This->lpVtbl->CreateInstance(This,ppIConverter);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICFormatConverterInfo_GetPixelFormats_Proxy(
    IWICFormatConverterInfo* This,
    UINT cFormats,
    WICPixelFormatGUID *pPixelFormatGUIDs,
    UINT *pcActual);
void __RPC_STUB IWICFormatConverterInfo_GetPixelFormats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICFormatConverterInfo_CreateInstance_Proxy(
    IWICFormatConverterInfo* This,
    IWICFormatConverter **ppIConverter);
void __RPC_STUB IWICFormatConverterInfo_CreateInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICFormatConverterInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICStream interface
 */
#ifndef __IWICStream_INTERFACE_DEFINED__
#define __IWICStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICStream, 0x135ff860, 0x22b7, 0x4ddf, 0xb0,0xf6, 0x21,0x8f,0x4f,0x29,0x9a,0x43);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("135ff860-22b7-4ddf-b0f6-218f4f299a43")
IWICStream : public IStream
{
    virtual HRESULT STDMETHODCALLTYPE InitializeFromIStream(
        IStream *pIStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromFilename(
        LPCWSTR wzFileName,
        DWORD dwAccessMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromMemory(
        BYTE *pbBuffer,
        DWORD cbBufferSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromIStreamRegion(
        IStream *pIStream,
        ULARGE_INTEGER ulOffset,
        ULARGE_INTEGER ulMaxSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICStream, 0x135ff860, 0x22b7, 0x4ddf, 0xb0,0xf6, 0x21,0x8f,0x4f,0x29,0x9a,0x43)
#endif
#else
typedef struct IWICStreamVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISequentialStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Read)(
        IWICStream* This,
        void *pv,
        ULONG cb,
        ULONG *pcbRead);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IWICStream* This,
        const void *pv,
        ULONG cb,
        ULONG *pcbWritten);

    /*** IStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Seek)(
        IWICStream* This,
        LARGE_INTEGER dlibMove,
        DWORD dwOrigin,
        ULARGE_INTEGER *plibNewPosition);

    HRESULT (STDMETHODCALLTYPE *SetSize)(
        IWICStream* This,
        ULARGE_INTEGER libNewSize);

    HRESULT (STDMETHODCALLTYPE *CopyTo)(
        IWICStream* This,
        IStream *pstm,
        ULARGE_INTEGER cb,
        ULARGE_INTEGER *pcbRead,
        ULARGE_INTEGER *pcbWritten);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IWICStream* This,
        DWORD grfCommitFlags);

    HRESULT (STDMETHODCALLTYPE *Revert)(
        IWICStream* This);

    HRESULT (STDMETHODCALLTYPE *LockRegion)(
        IWICStream* This,
        ULARGE_INTEGER libOffset,
        ULARGE_INTEGER cb,
        DWORD dwLockType);

    HRESULT (STDMETHODCALLTYPE *UnlockRegion)(
        IWICStream* This,
        ULARGE_INTEGER libOffset,
        ULARGE_INTEGER cb,
        DWORD dwLockType);

    HRESULT (STDMETHODCALLTYPE *Stat)(
        IWICStream* This,
        STATSTG *pstatstg,
        DWORD grfStatFlag);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IWICStream* This,
        IStream **ppstm);

    /*** IWICStream methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeFromIStream)(
        IWICStream* This,
        IStream *pIStream);

    HRESULT (STDMETHODCALLTYPE *InitializeFromFilename)(
        IWICStream* This,
        LPCWSTR wzFileName,
        DWORD dwAccessMode);

    HRESULT (STDMETHODCALLTYPE *InitializeFromMemory)(
        IWICStream* This,
        BYTE *pbBuffer,
        DWORD cbBufferSize);

    HRESULT (STDMETHODCALLTYPE *InitializeFromIStreamRegion)(
        IWICStream* This,
        IStream *pIStream,
        ULARGE_INTEGER ulOffset,
        ULARGE_INTEGER ulMaxSize);

    END_INTERFACE
} IWICStreamVtbl;
interface IWICStream {
    CONST_VTBL IWICStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICStream_Release(This) (This)->lpVtbl->Release(This)
/*** ISequentialStream methods ***/
#define IWICStream_Read(This,pv,cb,pcbRead) (This)->lpVtbl->Read(This,pv,cb,pcbRead)
#define IWICStream_Write(This,pv,cb,pcbWritten) (This)->lpVtbl->Write(This,pv,cb,pcbWritten)
/*** IStream methods ***/
#define IWICStream_Seek(This,dlibMove,dwOrigin,plibNewPosition) (This)->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition)
#define IWICStream_SetSize(This,libNewSize) (This)->lpVtbl->SetSize(This,libNewSize)
#define IWICStream_CopyTo(This,pstm,cb,pcbRead,pcbWritten) (This)->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten)
#define IWICStream_Commit(This,grfCommitFlags) (This)->lpVtbl->Commit(This,grfCommitFlags)
#define IWICStream_Revert(This) (This)->lpVtbl->Revert(This)
#define IWICStream_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType)
#define IWICStream_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType)
#define IWICStream_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag)
#define IWICStream_Clone(This,ppstm) (This)->lpVtbl->Clone(This,ppstm)
/*** IWICStream methods ***/
#define IWICStream_InitializeFromIStream(This,pIStream) (This)->lpVtbl->InitializeFromIStream(This,pIStream)
#define IWICStream_InitializeFromFilename(This,wzFileName,dwAccessMode) (This)->lpVtbl->InitializeFromFilename(This,wzFileName,dwAccessMode)
#define IWICStream_InitializeFromMemory(This,pbBuffer,cbBufferSize) (This)->lpVtbl->InitializeFromMemory(This,pbBuffer,cbBufferSize)
#define IWICStream_InitializeFromIStreamRegion(This,pIStream,ulOffset,ulMaxSize) (This)->lpVtbl->InitializeFromIStreamRegion(This,pIStream,ulOffset,ulMaxSize)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICStream_QueryInterface(IWICStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICStream_AddRef(IWICStream* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICStream_Release(IWICStream* This) {
    return This->lpVtbl->Release(This);
}
/*** ISequentialStream methods ***/
static FORCEINLINE HRESULT IWICStream_Read(IWICStream* This,void *pv,ULONG cb,ULONG *pcbRead) {
    return This->lpVtbl->Read(This,pv,cb,pcbRead);
}
static FORCEINLINE HRESULT IWICStream_Write(IWICStream* This,const void *pv,ULONG cb,ULONG *pcbWritten) {
    return This->lpVtbl->Write(This,pv,cb,pcbWritten);
}
/*** IStream methods ***/
static FORCEINLINE HRESULT IWICStream_Seek(IWICStream* This,LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition) {
    return This->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition);
}
static FORCEINLINE HRESULT IWICStream_SetSize(IWICStream* This,ULARGE_INTEGER libNewSize) {
    return This->lpVtbl->SetSize(This,libNewSize);
}
static FORCEINLINE HRESULT IWICStream_CopyTo(IWICStream* This,IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten) {
    return This->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten);
}
static FORCEINLINE HRESULT IWICStream_Commit(IWICStream* This,DWORD grfCommitFlags) {
    return This->lpVtbl->Commit(This,grfCommitFlags);
}
static FORCEINLINE HRESULT IWICStream_Revert(IWICStream* This) {
    return This->lpVtbl->Revert(This);
}
static FORCEINLINE HRESULT IWICStream_LockRegion(IWICStream* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->LockRegion(This,libOffset,cb,dwLockType);
}
static FORCEINLINE HRESULT IWICStream_UnlockRegion(IWICStream* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType);
}
static FORCEINLINE HRESULT IWICStream_Stat(IWICStream* This,STATSTG *pstatstg,DWORD grfStatFlag) {
    return This->lpVtbl->Stat(This,pstatstg,grfStatFlag);
}
static FORCEINLINE HRESULT IWICStream_Clone(IWICStream* This,IStream **ppstm) {
    return This->lpVtbl->Clone(This,ppstm);
}
/*** IWICStream methods ***/
static FORCEINLINE HRESULT IWICStream_InitializeFromIStream(IWICStream* This,IStream *pIStream) {
    return This->lpVtbl->InitializeFromIStream(This,pIStream);
}
static FORCEINLINE HRESULT IWICStream_InitializeFromFilename(IWICStream* This,LPCWSTR wzFileName,DWORD dwAccessMode) {
    return This->lpVtbl->InitializeFromFilename(This,wzFileName,dwAccessMode);
}
static FORCEINLINE HRESULT IWICStream_InitializeFromMemory(IWICStream* This,BYTE *pbBuffer,DWORD cbBufferSize) {
    return This->lpVtbl->InitializeFromMemory(This,pbBuffer,cbBufferSize);
}
static FORCEINLINE HRESULT IWICStream_InitializeFromIStreamRegion(IWICStream* This,IStream *pIStream,ULARGE_INTEGER ulOffset,ULARGE_INTEGER ulMaxSize) {
    return This->lpVtbl->InitializeFromIStreamRegion(This,pIStream,ulOffset,ulMaxSize);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICStream_InitializeFromIStream_Proxy(
    IWICStream* This,
    IStream *pIStream);
void __RPC_STUB IWICStream_InitializeFromIStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICStream_InitializeFromFilename_Proxy(
    IWICStream* This,
    LPCWSTR wzFileName,
    DWORD dwAccessMode);
void __RPC_STUB IWICStream_InitializeFromFilename_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICStream_InitializeFromMemory_Proxy(
    IWICStream* This,
    BYTE *pbBuffer,
    DWORD cbBufferSize);
void __RPC_STUB IWICStream_InitializeFromMemory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICStream_InitializeFromIStreamRegion_Proxy(
    IWICStream* This,
    IStream *pIStream,
    ULARGE_INTEGER ulOffset,
    ULARGE_INTEGER ulMaxSize);
void __RPC_STUB IWICStream_InitializeFromIStreamRegion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapScaler interface
 */
#ifndef __IWICBitmapScaler_INTERFACE_DEFINED__
#define __IWICBitmapScaler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapScaler, 0x00000302, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000302-a8f2-4877-ba0a-fd2b6645fb94")
IWICBitmapScaler : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IWICBitmapSource *pISource,
        UINT uiWidth,
        UINT uiHeight,
        WICBitmapInterpolationMode mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapScaler, 0x00000302, 0xa8f2, 0x4877, 0xba,0x0a, 0xfd,0x2b,0x66,0x45,0xfb,0x94)
#endif
#else
typedef struct IWICBitmapScalerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmapScaler* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmapScaler* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICBitmapScaler* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmapScaler* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICBitmapScaler* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICBitmapScaler methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICBitmapScaler* This,
        IWICBitmapSource *pISource,
        UINT uiWidth,
        UINT uiHeight,
        WICBitmapInterpolationMode mode);

    END_INTERFACE
} IWICBitmapScalerVtbl;
interface IWICBitmapScaler {
    CONST_VTBL IWICBitmapScalerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapScaler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapScaler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapScaler_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICBitmapScaler_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICBitmapScaler_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICBitmapScaler_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICBitmapScaler_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmapScaler_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICBitmapScaler methods ***/
#define IWICBitmapScaler_Initialize(This,pISource,uiWidth,uiHeight,mode) (This)->lpVtbl->Initialize(This,pISource,uiWidth,uiHeight,mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapScaler_QueryInterface(IWICBitmapScaler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapScaler_AddRef(IWICBitmapScaler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapScaler_Release(IWICBitmapScaler* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICBitmapScaler_GetSize(IWICBitmapScaler* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICBitmapScaler_GetPixelFormat(IWICBitmapScaler* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmapScaler_GetResolution(IWICBitmapScaler* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICBitmapScaler_CopyPalette(IWICBitmapScaler* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapScaler_CopyPixels(IWICBitmapScaler* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICBitmapScaler methods ***/
static FORCEINLINE HRESULT IWICBitmapScaler_Initialize(IWICBitmapScaler* This,IWICBitmapSource *pISource,UINT uiWidth,UINT uiHeight,WICBitmapInterpolationMode mode) {
    return This->lpVtbl->Initialize(This,pISource,uiWidth,uiHeight,mode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapScaler_Initialize_Proxy(
    IWICBitmapScaler* This,
    IWICBitmapSource *pISource,
    UINT uiWidth,
    UINT uiHeight,
    WICBitmapInterpolationMode mode);
void __RPC_STUB IWICBitmapScaler_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapScaler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICBitmapClipper interface
 */
#ifndef __IWICBitmapClipper_INTERFACE_DEFINED__
#define __IWICBitmapClipper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICBitmapClipper, 0xe4fbcf03, 0x223d, 0x4e81, 0x93,0x33, 0xd6,0x35,0x55,0x6d,0xd1,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e4fbcf03-223d-4e81-9333-d635556dd1b5")
IWICBitmapClipper : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IWICBitmapSource *pISource,
        const WICRect *prc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICBitmapClipper, 0xe4fbcf03, 0x223d, 0x4e81, 0x93,0x33, 0xd6,0x35,0x55,0x6d,0xd1,0xb5)
#endif
#else
typedef struct IWICBitmapClipperVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICBitmapClipper* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICBitmapClipper* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICBitmapClipper* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICBitmapClipper* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICBitmapClipper* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICBitmapClipper methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICBitmapClipper* This,
        IWICBitmapSource *pISource,
        const WICRect *prc);

    END_INTERFACE
} IWICBitmapClipperVtbl;
interface IWICBitmapClipper {
    CONST_VTBL IWICBitmapClipperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICBitmapClipper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICBitmapClipper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICBitmapClipper_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICBitmapClipper_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICBitmapClipper_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICBitmapClipper_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICBitmapClipper_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICBitmapClipper_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICBitmapClipper methods ***/
#define IWICBitmapClipper_Initialize(This,pISource,prc) (This)->lpVtbl->Initialize(This,pISource,prc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICBitmapClipper_QueryInterface(IWICBitmapClipper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICBitmapClipper_AddRef(IWICBitmapClipper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICBitmapClipper_Release(IWICBitmapClipper* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICBitmapClipper_GetSize(IWICBitmapClipper* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICBitmapClipper_GetPixelFormat(IWICBitmapClipper* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICBitmapClipper_GetResolution(IWICBitmapClipper* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICBitmapClipper_CopyPalette(IWICBitmapClipper* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICBitmapClipper_CopyPixels(IWICBitmapClipper* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICBitmapClipper methods ***/
static FORCEINLINE HRESULT IWICBitmapClipper_Initialize(IWICBitmapClipper* This,IWICBitmapSource *pISource,const WICRect *prc) {
    return This->lpVtbl->Initialize(This,pISource,prc);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICBitmapClipper_Initialize_Proxy(
    IWICBitmapClipper* This,
    IWICBitmapSource *pISource,
    const WICRect *prc);
void __RPC_STUB IWICBitmapClipper_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICBitmapClipper_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICColorTransform interface
 */
#ifndef __IWICColorTransform_INTERFACE_DEFINED__
#define __IWICColorTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICColorTransform, 0xb66f034f, 0xd0e2, 0x40ab, 0xb4,0x36, 0x6d,0xe3,0x9e,0x32,0x1a,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b66f034f-d0e2-40ab-b436-6de39e321a94")
IWICColorTransform : public IWICBitmapSource
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IWICBitmapSource *pIBitmapSource,
        IWICColorContext *pIContextSource,
        IWICColorContext *pIContextDest,
        REFWICPixelFormatGUID pixelFmtDest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICColorTransform, 0xb66f034f, 0xd0e2, 0x40ab, 0xb4,0x36, 0x6d,0xe3,0x9e,0x32,0x1a,0x94)
#endif
#else
typedef struct IWICColorTransformVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICBitmapSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IWICColorTransform* This,
        UINT *puiWidth,
        UINT *puiHeight);

    HRESULT (STDMETHODCALLTYPE *GetPixelFormat)(
        IWICColorTransform* This,
        WICPixelFormatGUID *pPixelFormat);

    HRESULT (STDMETHODCALLTYPE *GetResolution)(
        IWICColorTransform* This,
        double *pDpiX,
        double *pDpiY);

    HRESULT (STDMETHODCALLTYPE *CopyPalette)(
        IWICColorTransform* This,
        IWICPalette *pIPalette);

    HRESULT (STDMETHODCALLTYPE *CopyPixels)(
        IWICColorTransform* This,
        const WICRect *prc,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer);

    /*** IWICColorTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWICColorTransform* This,
        IWICBitmapSource *pIBitmapSource,
        IWICColorContext *pIContextSource,
        IWICColorContext *pIContextDest,
        REFWICPixelFormatGUID pixelFmtDest);

    END_INTERFACE
} IWICColorTransformVtbl;
interface IWICColorTransform {
    CONST_VTBL IWICColorTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICColorTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICColorTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICColorTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IWICBitmapSource methods ***/
#define IWICColorTransform_GetSize(This,puiWidth,puiHeight) (This)->lpVtbl->GetSize(This,puiWidth,puiHeight)
#define IWICColorTransform_GetPixelFormat(This,pPixelFormat) (This)->lpVtbl->GetPixelFormat(This,pPixelFormat)
#define IWICColorTransform_GetResolution(This,pDpiX,pDpiY) (This)->lpVtbl->GetResolution(This,pDpiX,pDpiY)
#define IWICColorTransform_CopyPalette(This,pIPalette) (This)->lpVtbl->CopyPalette(This,pIPalette)
#define IWICColorTransform_CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer) (This)->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer)
/*** IWICColorTransform methods ***/
#define IWICColorTransform_Initialize(This,pIBitmapSource,pIContextSource,pIContextDest,pixelFmtDest) (This)->lpVtbl->Initialize(This,pIBitmapSource,pIContextSource,pIContextDest,pixelFmtDest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICColorTransform_QueryInterface(IWICColorTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICColorTransform_AddRef(IWICColorTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICColorTransform_Release(IWICColorTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICBitmapSource methods ***/
static FORCEINLINE HRESULT IWICColorTransform_GetSize(IWICColorTransform* This,UINT *puiWidth,UINT *puiHeight) {
    return This->lpVtbl->GetSize(This,puiWidth,puiHeight);
}
static FORCEINLINE HRESULT IWICColorTransform_GetPixelFormat(IWICColorTransform* This,WICPixelFormatGUID *pPixelFormat) {
    return This->lpVtbl->GetPixelFormat(This,pPixelFormat);
}
static FORCEINLINE HRESULT IWICColorTransform_GetResolution(IWICColorTransform* This,double *pDpiX,double *pDpiY) {
    return This->lpVtbl->GetResolution(This,pDpiX,pDpiY);
}
static FORCEINLINE HRESULT IWICColorTransform_CopyPalette(IWICColorTransform* This,IWICPalette *pIPalette) {
    return This->lpVtbl->CopyPalette(This,pIPalette);
}
static FORCEINLINE HRESULT IWICColorTransform_CopyPixels(IWICColorTransform* This,const WICRect *prc,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer) {
    return This->lpVtbl->CopyPixels(This,prc,cbStride,cbBufferSize,pbBuffer);
}
/*** IWICColorTransform methods ***/
static FORCEINLINE HRESULT IWICColorTransform_Initialize(IWICColorTransform* This,IWICBitmapSource *pIBitmapSource,IWICColorContext *pIContextSource,IWICColorContext *pIContextDest,REFWICPixelFormatGUID pixelFmtDest) {
    return This->lpVtbl->Initialize(This,pIBitmapSource,pIContextSource,pIContextDest,pixelFmtDest);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICColorTransform_Initialize_Proxy(
    IWICColorTransform* This,
    IWICBitmapSource *pIBitmapSource,
    IWICColorContext *pIContextSource,
    IWICColorContext *pIContextDest,
    REFWICPixelFormatGUID pixelFmtDest);
void __RPC_STUB IWICColorTransform_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICColorTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICFastMetadataEncoder interface
 */
#ifndef __IWICFastMetadataEncoder_INTERFACE_DEFINED__
#define __IWICFastMetadataEncoder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICFastMetadataEncoder, 0xb84e2c09, 0x78c9, 0x4ac4, 0x8b,0xd3, 0x52,0x4a,0xe1,0x66,0x3a,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b84e2c09-78c9-4ac4-8bd3-524ae1663a2f")
IWICFastMetadataEncoder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Commit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMetadataQueryWriter(
        IWICMetadataQueryWriter **ppIMetadataQueryWriter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICFastMetadataEncoder, 0xb84e2c09, 0x78c9, 0x4ac4, 0x8b,0xd3, 0x52,0x4a,0xe1,0x66,0x3a,0x2f)
#endif
#else
typedef struct IWICFastMetadataEncoderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICFastMetadataEncoder methods ***/
    HRESULT (STDMETHODCALLTYPE *Commit)(
        IWICFastMetadataEncoder* This);

    HRESULT (STDMETHODCALLTYPE *GetMetadataQueryWriter)(
        IWICFastMetadataEncoder* This,
        IWICMetadataQueryWriter **ppIMetadataQueryWriter);

    END_INTERFACE
} IWICFastMetadataEncoderVtbl;
interface IWICFastMetadataEncoder {
    CONST_VTBL IWICFastMetadataEncoderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICFastMetadataEncoder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICFastMetadataEncoder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICFastMetadataEncoder_Release(This) (This)->lpVtbl->Release(This)
/*** IWICFastMetadataEncoder methods ***/
#define IWICFastMetadataEncoder_Commit(This) (This)->lpVtbl->Commit(This)
#define IWICFastMetadataEncoder_GetMetadataQueryWriter(This,ppIMetadataQueryWriter) (This)->lpVtbl->GetMetadataQueryWriter(This,ppIMetadataQueryWriter)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICFastMetadataEncoder_QueryInterface(IWICFastMetadataEncoder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICFastMetadataEncoder_AddRef(IWICFastMetadataEncoder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICFastMetadataEncoder_Release(IWICFastMetadataEncoder* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICFastMetadataEncoder methods ***/
static FORCEINLINE HRESULT IWICFastMetadataEncoder_Commit(IWICFastMetadataEncoder* This) {
    return This->lpVtbl->Commit(This);
}
static FORCEINLINE HRESULT IWICFastMetadataEncoder_GetMetadataQueryWriter(IWICFastMetadataEncoder* This,IWICMetadataQueryWriter **ppIMetadataQueryWriter) {
    return This->lpVtbl->GetMetadataQueryWriter(This,ppIMetadataQueryWriter);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICFastMetadataEncoder_Commit_Proxy(
    IWICFastMetadataEncoder* This);
void __RPC_STUB IWICFastMetadataEncoder_Commit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICFastMetadataEncoder_GetMetadataQueryWriter_Proxy(
    IWICFastMetadataEncoder* This,
    IWICMetadataQueryWriter **ppIMetadataQueryWriter);
void __RPC_STUB IWICFastMetadataEncoder_GetMetadataQueryWriter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICFastMetadataEncoder_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262,0x9370,0x4615,0xa1,0x3b,0x9f,0x55,0x39,0xda,0x4c,0x0a);
/*****************************************************************************
 * IWICImagingFactory interface
 */
#ifndef __IWICImagingFactory_INTERFACE_DEFINED__
#define __IWICImagingFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICImagingFactory, 0xec5ec8a9, 0xc395, 0x4314, 0x9c,0x77, 0x54,0xd7,0xa9,0x35,0xff,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ec5ec8a9-c395-4314-9c77-54d7a935ff70")
IWICImagingFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateDecoderFromFilename(
        LPCWSTR wzFilename,
        const GUID *pguidVendor,
        DWORD dwDesiredAccess,
        WICDecodeOptions metadataOptions,
        IWICBitmapDecoder **ppIDecoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDecoderFromStream(
        IStream *pIStream,
        const GUID *pguidVendor,
        WICDecodeOptions metadataOptions,
        IWICBitmapDecoder **ppIDecoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDecoderFromFileHandle(
        ULONG_PTR hFile,
        const GUID *pguidVendor,
        WICDecodeOptions metadataOptions,
        IWICBitmapDecoder **ppIDecoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateComponentInfo(
        REFCLSID clsidComponent,
        IWICComponentInfo **ppIInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDecoder(
        REFGUID guidContainerFormat,
        const GUID *pguidVendor,
        IWICBitmapDecoder **ppIDecoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateEncoder(
        REFGUID guidContainerFormat,
        const GUID *pguidVendor,
        IWICBitmapEncoder **ppIEncoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePalette(
        IWICPalette **ppIPalette) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFormatConverter(
        IWICFormatConverter **ppIFormatConverter) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapScaler(
        IWICBitmapScaler **ppIBitmapScaler) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapClipper(
        IWICBitmapClipper **ppIBitmapClipper) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapFlipRotator(
        IWICBitmapFlipRotator **ppIBitmapFlipRotator) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStream(
        IWICStream **ppIWICStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateColorContext(
        IWICColorContext **ppIWICColorContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateColorTransformer(
        IWICColorTransform **ppIWICColorTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmap(
        UINT uiWidth,
        UINT uiHeight,
        REFWICPixelFormatGUID pixelFormat,
        WICBitmapCreateCacheOption option,
        IWICBitmap **ppIBitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapFromSource(
        IWICBitmapSource *piBitmapSource,
        WICBitmapCreateCacheOption option,
        IWICBitmap **ppIBitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapFromSourceRect(
        IWICBitmapSource *piBitmapSource,
        UINT x,
        UINT y,
        UINT width,
        UINT height,
        IWICBitmap **ppIBitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapFromMemory(
        UINT uiWidth,
        UINT uiHeight,
        REFWICPixelFormatGUID pixelFormat,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer,
        IWICBitmap **ppIBitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapFromHBITMAP(
        HBITMAP hBitmap,
        HPALETTE hPalette,
        WICBitmapAlphaChannelOption options,
        IWICBitmap **ppIBitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBitmapFromHICON(
        HICON hIcon,
        IWICBitmap **ppIBitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateComponentEnumerator(
        DWORD componentTypes,
        DWORD options,
        IEnumUnknown **ppIEnumUnknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFastMetadataEncoderFromDecoder(
        IWICBitmapDecoder *pIDecoder,
        IWICFastMetadataEncoder **ppIFastEncoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFastMetadataEncoderFromFrameDecode(
        IWICBitmapFrameDecode *pIFrameDecoder,
        IWICFastMetadataEncoder **ppIFastEncoder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQueryWriter(
        REFGUID guidMetadataFormat,
        const GUID *pguidVendor,
        IWICMetadataQueryWriter **ppIQueryWriter) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQueryWriterFromReader(
        IWICMetadataQueryReader *pIQueryReader,
        const GUID *pguidVendor,
        IWICMetadataQueryWriter **ppIQueryWriter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICImagingFactory, 0xec5ec8a9, 0xc395, 0x4314, 0x9c,0x77, 0x54,0xd7,0xa9,0x35,0xff,0x70)
#endif
#else
typedef struct IWICImagingFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICImagingFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateDecoderFromFilename)(
        IWICImagingFactory* This,
        LPCWSTR wzFilename,
        const GUID *pguidVendor,
        DWORD dwDesiredAccess,
        WICDecodeOptions metadataOptions,
        IWICBitmapDecoder **ppIDecoder);

    HRESULT (STDMETHODCALLTYPE *CreateDecoderFromStream)(
        IWICImagingFactory* This,
        IStream *pIStream,
        const GUID *pguidVendor,
        WICDecodeOptions metadataOptions,
        IWICBitmapDecoder **ppIDecoder);

    HRESULT (STDMETHODCALLTYPE *CreateDecoderFromFileHandle)(
        IWICImagingFactory* This,
        ULONG_PTR hFile,
        const GUID *pguidVendor,
        WICDecodeOptions metadataOptions,
        IWICBitmapDecoder **ppIDecoder);

    HRESULT (STDMETHODCALLTYPE *CreateComponentInfo)(
        IWICImagingFactory* This,
        REFCLSID clsidComponent,
        IWICComponentInfo **ppIInfo);

    HRESULT (STDMETHODCALLTYPE *CreateDecoder)(
        IWICImagingFactory* This,
        REFGUID guidContainerFormat,
        const GUID *pguidVendor,
        IWICBitmapDecoder **ppIDecoder);

    HRESULT (STDMETHODCALLTYPE *CreateEncoder)(
        IWICImagingFactory* This,
        REFGUID guidContainerFormat,
        const GUID *pguidVendor,
        IWICBitmapEncoder **ppIEncoder);

    HRESULT (STDMETHODCALLTYPE *CreatePalette)(
        IWICImagingFactory* This,
        IWICPalette **ppIPalette);

    HRESULT (STDMETHODCALLTYPE *CreateFormatConverter)(
        IWICImagingFactory* This,
        IWICFormatConverter **ppIFormatConverter);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapScaler)(
        IWICImagingFactory* This,
        IWICBitmapScaler **ppIBitmapScaler);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapClipper)(
        IWICImagingFactory* This,
        IWICBitmapClipper **ppIBitmapClipper);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapFlipRotator)(
        IWICImagingFactory* This,
        IWICBitmapFlipRotator **ppIBitmapFlipRotator);

    HRESULT (STDMETHODCALLTYPE *CreateStream)(
        IWICImagingFactory* This,
        IWICStream **ppIWICStream);

    HRESULT (STDMETHODCALLTYPE *CreateColorContext)(
        IWICImagingFactory* This,
        IWICColorContext **ppIWICColorContext);

    HRESULT (STDMETHODCALLTYPE *CreateColorTransformer)(
        IWICImagingFactory* This,
        IWICColorTransform **ppIWICColorTransform);

    HRESULT (STDMETHODCALLTYPE *CreateBitmap)(
        IWICImagingFactory* This,
        UINT uiWidth,
        UINT uiHeight,
        REFWICPixelFormatGUID pixelFormat,
        WICBitmapCreateCacheOption option,
        IWICBitmap **ppIBitmap);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapFromSource)(
        IWICImagingFactory* This,
        IWICBitmapSource *piBitmapSource,
        WICBitmapCreateCacheOption option,
        IWICBitmap **ppIBitmap);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapFromSourceRect)(
        IWICImagingFactory* This,
        IWICBitmapSource *piBitmapSource,
        UINT x,
        UINT y,
        UINT width,
        UINT height,
        IWICBitmap **ppIBitmap);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapFromMemory)(
        IWICImagingFactory* This,
        UINT uiWidth,
        UINT uiHeight,
        REFWICPixelFormatGUID pixelFormat,
        UINT cbStride,
        UINT cbBufferSize,
        BYTE *pbBuffer,
        IWICBitmap **ppIBitmap);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapFromHBITMAP)(
        IWICImagingFactory* This,
        HBITMAP hBitmap,
        HPALETTE hPalette,
        WICBitmapAlphaChannelOption options,
        IWICBitmap **ppIBitmap);

    HRESULT (STDMETHODCALLTYPE *CreateBitmapFromHICON)(
        IWICImagingFactory* This,
        HICON hIcon,
        IWICBitmap **ppIBitmap);

    HRESULT (STDMETHODCALLTYPE *CreateComponentEnumerator)(
        IWICImagingFactory* This,
        DWORD componentTypes,
        DWORD options,
        IEnumUnknown **ppIEnumUnknown);

    HRESULT (STDMETHODCALLTYPE *CreateFastMetadataEncoderFromDecoder)(
        IWICImagingFactory* This,
        IWICBitmapDecoder *pIDecoder,
        IWICFastMetadataEncoder **ppIFastEncoder);

    HRESULT (STDMETHODCALLTYPE *CreateFastMetadataEncoderFromFrameDecode)(
        IWICImagingFactory* This,
        IWICBitmapFrameDecode *pIFrameDecoder,
        IWICFastMetadataEncoder **ppIFastEncoder);

    HRESULT (STDMETHODCALLTYPE *CreateQueryWriter)(
        IWICImagingFactory* This,
        REFGUID guidMetadataFormat,
        const GUID *pguidVendor,
        IWICMetadataQueryWriter **ppIQueryWriter);

    HRESULT (STDMETHODCALLTYPE *CreateQueryWriterFromReader)(
        IWICImagingFactory* This,
        IWICMetadataQueryReader *pIQueryReader,
        const GUID *pguidVendor,
        IWICMetadataQueryWriter **ppIQueryWriter);

    END_INTERFACE
} IWICImagingFactoryVtbl;
interface IWICImagingFactory {
    CONST_VTBL IWICImagingFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICImagingFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICImagingFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICImagingFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IWICImagingFactory methods ***/
#define IWICImagingFactory_CreateDecoderFromFilename(This,wzFilename,pguidVendor,dwDesiredAccess,metadataOptions,ppIDecoder) (This)->lpVtbl->CreateDecoderFromFilename(This,wzFilename,pguidVendor,dwDesiredAccess,metadataOptions,ppIDecoder)
#define IWICImagingFactory_CreateDecoderFromStream(This,pIStream,pguidVendor,metadataOptions,ppIDecoder) (This)->lpVtbl->CreateDecoderFromStream(This,pIStream,pguidVendor,metadataOptions,ppIDecoder)
#define IWICImagingFactory_CreateDecoderFromFileHandle(This,hFile,pguidVendor,metadataOptions,ppIDecoder) (This)->lpVtbl->CreateDecoderFromFileHandle(This,hFile,pguidVendor,metadataOptions,ppIDecoder)
#define IWICImagingFactory_CreateComponentInfo(This,clsidComponent,ppIInfo) (This)->lpVtbl->CreateComponentInfo(This,clsidComponent,ppIInfo)
#define IWICImagingFactory_CreateDecoder(This,guidContainerFormat,pguidVendor,ppIDecoder) (This)->lpVtbl->CreateDecoder(This,guidContainerFormat,pguidVendor,ppIDecoder)
#define IWICImagingFactory_CreateEncoder(This,guidContainerFormat,pguidVendor,ppIEncoder) (This)->lpVtbl->CreateEncoder(This,guidContainerFormat,pguidVendor,ppIEncoder)
#define IWICImagingFactory_CreatePalette(This,ppIPalette) (This)->lpVtbl->CreatePalette(This,ppIPalette)
#define IWICImagingFactory_CreateFormatConverter(This,ppIFormatConverter) (This)->lpVtbl->CreateFormatConverter(This,ppIFormatConverter)
#define IWICImagingFactory_CreateBitmapScaler(This,ppIBitmapScaler) (This)->lpVtbl->CreateBitmapScaler(This,ppIBitmapScaler)
#define IWICImagingFactory_CreateBitmapClipper(This,ppIBitmapClipper) (This)->lpVtbl->CreateBitmapClipper(This,ppIBitmapClipper)
#define IWICImagingFactory_CreateBitmapFlipRotator(This,ppIBitmapFlipRotator) (This)->lpVtbl->CreateBitmapFlipRotator(This,ppIBitmapFlipRotator)
#define IWICImagingFactory_CreateStream(This,ppIWICStream) (This)->lpVtbl->CreateStream(This,ppIWICStream)
#define IWICImagingFactory_CreateColorContext(This,ppIWICColorContext) (This)->lpVtbl->CreateColorContext(This,ppIWICColorContext)
#define IWICImagingFactory_CreateColorTransformer(This,ppIWICColorTransform) (This)->lpVtbl->CreateColorTransformer(This,ppIWICColorTransform)
#define IWICImagingFactory_CreateBitmap(This,uiWidth,uiHeight,pixelFormat,option,ppIBitmap) (This)->lpVtbl->CreateBitmap(This,uiWidth,uiHeight,pixelFormat,option,ppIBitmap)
#define IWICImagingFactory_CreateBitmapFromSource(This,piBitmapSource,option,ppIBitmap) (This)->lpVtbl->CreateBitmapFromSource(This,piBitmapSource,option,ppIBitmap)
#define IWICImagingFactory_CreateBitmapFromSourceRect(This,piBitmapSource,x,y,width,height,ppIBitmap) (This)->lpVtbl->CreateBitmapFromSourceRect(This,piBitmapSource,x,y,width,height,ppIBitmap)
#define IWICImagingFactory_CreateBitmapFromMemory(This,uiWidth,uiHeight,pixelFormat,cbStride,cbBufferSize,pbBuffer,ppIBitmap) (This)->lpVtbl->CreateBitmapFromMemory(This,uiWidth,uiHeight,pixelFormat,cbStride,cbBufferSize,pbBuffer,ppIBitmap)
#define IWICImagingFactory_CreateBitmapFromHBITMAP(This,hBitmap,hPalette,options,ppIBitmap) (This)->lpVtbl->CreateBitmapFromHBITMAP(This,hBitmap,hPalette,options,ppIBitmap)
#define IWICImagingFactory_CreateBitmapFromHICON(This,hIcon,ppIBitmap) (This)->lpVtbl->CreateBitmapFromHICON(This,hIcon,ppIBitmap)
#define IWICImagingFactory_CreateComponentEnumerator(This,componentTypes,options,ppIEnumUnknown) (This)->lpVtbl->CreateComponentEnumerator(This,componentTypes,options,ppIEnumUnknown)
#define IWICImagingFactory_CreateFastMetadataEncoderFromDecoder(This,pIDecoder,ppIFastEncoder) (This)->lpVtbl->CreateFastMetadataEncoderFromDecoder(This,pIDecoder,ppIFastEncoder)
#define IWICImagingFactory_CreateFastMetadataEncoderFromFrameDecode(This,pIFrameDecoder,ppIFastEncoder) (This)->lpVtbl->CreateFastMetadataEncoderFromFrameDecode(This,pIFrameDecoder,ppIFastEncoder)
#define IWICImagingFactory_CreateQueryWriter(This,guidMetadataFormat,pguidVendor,ppIQueryWriter) (This)->lpVtbl->CreateQueryWriter(This,guidMetadataFormat,pguidVendor,ppIQueryWriter)
#define IWICImagingFactory_CreateQueryWriterFromReader(This,pIQueryReader,pguidVendor,ppIQueryWriter) (This)->lpVtbl->CreateQueryWriterFromReader(This,pIQueryReader,pguidVendor,ppIQueryWriter)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICImagingFactory_QueryInterface(IWICImagingFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICImagingFactory_AddRef(IWICImagingFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICImagingFactory_Release(IWICImagingFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICImagingFactory methods ***/
static FORCEINLINE HRESULT IWICImagingFactory_CreateDecoderFromFilename(IWICImagingFactory* This,LPCWSTR wzFilename,const GUID *pguidVendor,DWORD dwDesiredAccess,WICDecodeOptions metadataOptions,IWICBitmapDecoder **ppIDecoder) {
    return This->lpVtbl->CreateDecoderFromFilename(This,wzFilename,pguidVendor,dwDesiredAccess,metadataOptions,ppIDecoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateDecoderFromStream(IWICImagingFactory* This,IStream *pIStream,const GUID *pguidVendor,WICDecodeOptions metadataOptions,IWICBitmapDecoder **ppIDecoder) {
    return This->lpVtbl->CreateDecoderFromStream(This,pIStream,pguidVendor,metadataOptions,ppIDecoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateDecoderFromFileHandle(IWICImagingFactory* This,ULONG_PTR hFile,const GUID *pguidVendor,WICDecodeOptions metadataOptions,IWICBitmapDecoder **ppIDecoder) {
    return This->lpVtbl->CreateDecoderFromFileHandle(This,hFile,pguidVendor,metadataOptions,ppIDecoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateComponentInfo(IWICImagingFactory* This,REFCLSID clsidComponent,IWICComponentInfo **ppIInfo) {
    return This->lpVtbl->CreateComponentInfo(This,clsidComponent,ppIInfo);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateDecoder(IWICImagingFactory* This,REFGUID guidContainerFormat,const GUID *pguidVendor,IWICBitmapDecoder **ppIDecoder) {
    return This->lpVtbl->CreateDecoder(This,guidContainerFormat,pguidVendor,ppIDecoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateEncoder(IWICImagingFactory* This,REFGUID guidContainerFormat,const GUID *pguidVendor,IWICBitmapEncoder **ppIEncoder) {
    return This->lpVtbl->CreateEncoder(This,guidContainerFormat,pguidVendor,ppIEncoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreatePalette(IWICImagingFactory* This,IWICPalette **ppIPalette) {
    return This->lpVtbl->CreatePalette(This,ppIPalette);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateFormatConverter(IWICImagingFactory* This,IWICFormatConverter **ppIFormatConverter) {
    return This->lpVtbl->CreateFormatConverter(This,ppIFormatConverter);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapScaler(IWICImagingFactory* This,IWICBitmapScaler **ppIBitmapScaler) {
    return This->lpVtbl->CreateBitmapScaler(This,ppIBitmapScaler);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapClipper(IWICImagingFactory* This,IWICBitmapClipper **ppIBitmapClipper) {
    return This->lpVtbl->CreateBitmapClipper(This,ppIBitmapClipper);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapFlipRotator(IWICImagingFactory* This,IWICBitmapFlipRotator **ppIBitmapFlipRotator) {
    return This->lpVtbl->CreateBitmapFlipRotator(This,ppIBitmapFlipRotator);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateStream(IWICImagingFactory* This,IWICStream **ppIWICStream) {
    return This->lpVtbl->CreateStream(This,ppIWICStream);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateColorContext(IWICImagingFactory* This,IWICColorContext **ppIWICColorContext) {
    return This->lpVtbl->CreateColorContext(This,ppIWICColorContext);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateColorTransformer(IWICImagingFactory* This,IWICColorTransform **ppIWICColorTransform) {
    return This->lpVtbl->CreateColorTransformer(This,ppIWICColorTransform);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmap(IWICImagingFactory* This,UINT uiWidth,UINT uiHeight,REFWICPixelFormatGUID pixelFormat,WICBitmapCreateCacheOption option,IWICBitmap **ppIBitmap) {
    return This->lpVtbl->CreateBitmap(This,uiWidth,uiHeight,pixelFormat,option,ppIBitmap);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapFromSource(IWICImagingFactory* This,IWICBitmapSource *piBitmapSource,WICBitmapCreateCacheOption option,IWICBitmap **ppIBitmap) {
    return This->lpVtbl->CreateBitmapFromSource(This,piBitmapSource,option,ppIBitmap);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapFromSourceRect(IWICImagingFactory* This,IWICBitmapSource *piBitmapSource,UINT x,UINT y,UINT width,UINT height,IWICBitmap **ppIBitmap) {
    return This->lpVtbl->CreateBitmapFromSourceRect(This,piBitmapSource,x,y,width,height,ppIBitmap);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapFromMemory(IWICImagingFactory* This,UINT uiWidth,UINT uiHeight,REFWICPixelFormatGUID pixelFormat,UINT cbStride,UINT cbBufferSize,BYTE *pbBuffer,IWICBitmap **ppIBitmap) {
    return This->lpVtbl->CreateBitmapFromMemory(This,uiWidth,uiHeight,pixelFormat,cbStride,cbBufferSize,pbBuffer,ppIBitmap);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapFromHBITMAP(IWICImagingFactory* This,HBITMAP hBitmap,HPALETTE hPalette,WICBitmapAlphaChannelOption options,IWICBitmap **ppIBitmap) {
    return This->lpVtbl->CreateBitmapFromHBITMAP(This,hBitmap,hPalette,options,ppIBitmap);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateBitmapFromHICON(IWICImagingFactory* This,HICON hIcon,IWICBitmap **ppIBitmap) {
    return This->lpVtbl->CreateBitmapFromHICON(This,hIcon,ppIBitmap);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateComponentEnumerator(IWICImagingFactory* This,DWORD componentTypes,DWORD options,IEnumUnknown **ppIEnumUnknown) {
    return This->lpVtbl->CreateComponentEnumerator(This,componentTypes,options,ppIEnumUnknown);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateFastMetadataEncoderFromDecoder(IWICImagingFactory* This,IWICBitmapDecoder *pIDecoder,IWICFastMetadataEncoder **ppIFastEncoder) {
    return This->lpVtbl->CreateFastMetadataEncoderFromDecoder(This,pIDecoder,ppIFastEncoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateFastMetadataEncoderFromFrameDecode(IWICImagingFactory* This,IWICBitmapFrameDecode *pIFrameDecoder,IWICFastMetadataEncoder **ppIFastEncoder) {
    return This->lpVtbl->CreateFastMetadataEncoderFromFrameDecode(This,pIFrameDecoder,ppIFastEncoder);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateQueryWriter(IWICImagingFactory* This,REFGUID guidMetadataFormat,const GUID *pguidVendor,IWICMetadataQueryWriter **ppIQueryWriter) {
    return This->lpVtbl->CreateQueryWriter(This,guidMetadataFormat,pguidVendor,ppIQueryWriter);
}
static FORCEINLINE HRESULT IWICImagingFactory_CreateQueryWriterFromReader(IWICImagingFactory* This,IWICMetadataQueryReader *pIQueryReader,const GUID *pguidVendor,IWICMetadataQueryWriter **ppIQueryWriter) {
    return This->lpVtbl->CreateQueryWriterFromReader(This,pIQueryReader,pguidVendor,ppIQueryWriter);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateDecoderFromFilename_Proxy(
    IWICImagingFactory* This,
    LPCWSTR wzFilename,
    const GUID *pguidVendor,
    DWORD dwDesiredAccess,
    WICDecodeOptions metadataOptions,
    IWICBitmapDecoder **ppIDecoder);
void __RPC_STUB IWICImagingFactory_CreateDecoderFromFilename_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateDecoderFromStream_Proxy(
    IWICImagingFactory* This,
    IStream *pIStream,
    const GUID *pguidVendor,
    WICDecodeOptions metadataOptions,
    IWICBitmapDecoder **ppIDecoder);
void __RPC_STUB IWICImagingFactory_CreateDecoderFromStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateDecoderFromFileHandle_Proxy(
    IWICImagingFactory* This,
    ULONG_PTR hFile,
    const GUID *pguidVendor,
    WICDecodeOptions metadataOptions,
    IWICBitmapDecoder **ppIDecoder);
void __RPC_STUB IWICImagingFactory_CreateDecoderFromFileHandle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateComponentInfo_Proxy(
    IWICImagingFactory* This,
    REFCLSID clsidComponent,
    IWICComponentInfo **ppIInfo);
void __RPC_STUB IWICImagingFactory_CreateComponentInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateDecoder_Proxy(
    IWICImagingFactory* This,
    REFGUID guidContainerFormat,
    const GUID *pguidVendor,
    IWICBitmapDecoder **ppIDecoder);
void __RPC_STUB IWICImagingFactory_CreateDecoder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateEncoder_Proxy(
    IWICImagingFactory* This,
    REFGUID guidContainerFormat,
    const GUID *pguidVendor,
    IWICBitmapEncoder **ppIEncoder);
void __RPC_STUB IWICImagingFactory_CreateEncoder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreatePalette_Proxy(
    IWICImagingFactory* This,
    IWICPalette **ppIPalette);
void __RPC_STUB IWICImagingFactory_CreatePalette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateFormatConverter_Proxy(
    IWICImagingFactory* This,
    IWICFormatConverter **ppIFormatConverter);
void __RPC_STUB IWICImagingFactory_CreateFormatConverter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapScaler_Proxy(
    IWICImagingFactory* This,
    IWICBitmapScaler **ppIBitmapScaler);
void __RPC_STUB IWICImagingFactory_CreateBitmapScaler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapClipper_Proxy(
    IWICImagingFactory* This,
    IWICBitmapClipper **ppIBitmapClipper);
void __RPC_STUB IWICImagingFactory_CreateBitmapClipper_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapFlipRotator_Proxy(
    IWICImagingFactory* This,
    IWICBitmapFlipRotator **ppIBitmapFlipRotator);
void __RPC_STUB IWICImagingFactory_CreateBitmapFlipRotator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateStream_Proxy(
    IWICImagingFactory* This,
    IWICStream **ppIWICStream);
void __RPC_STUB IWICImagingFactory_CreateStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateColorContext_Proxy(
    IWICImagingFactory* This,
    IWICColorContext **ppIWICColorContext);
void __RPC_STUB IWICImagingFactory_CreateColorContext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateColorTransformer_Proxy(
    IWICImagingFactory* This,
    IWICColorTransform **ppIWICColorTransform);
void __RPC_STUB IWICImagingFactory_CreateColorTransformer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmap_Proxy(
    IWICImagingFactory* This,
    UINT uiWidth,
    UINT uiHeight,
    REFWICPixelFormatGUID pixelFormat,
    WICBitmapCreateCacheOption option,
    IWICBitmap **ppIBitmap);
void __RPC_STUB IWICImagingFactory_CreateBitmap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapFromSource_Proxy(
    IWICImagingFactory* This,
    IWICBitmapSource *piBitmapSource,
    WICBitmapCreateCacheOption option,
    IWICBitmap **ppIBitmap);
void __RPC_STUB IWICImagingFactory_CreateBitmapFromSource_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapFromSourceRect_Proxy(
    IWICImagingFactory* This,
    IWICBitmapSource *piBitmapSource,
    UINT x,
    UINT y,
    UINT width,
    UINT height,
    IWICBitmap **ppIBitmap);
void __RPC_STUB IWICImagingFactory_CreateBitmapFromSourceRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapFromMemory_Proxy(
    IWICImagingFactory* This,
    UINT uiWidth,
    UINT uiHeight,
    REFWICPixelFormatGUID pixelFormat,
    UINT cbStride,
    UINT cbBufferSize,
    BYTE *pbBuffer,
    IWICBitmap **ppIBitmap);
void __RPC_STUB IWICImagingFactory_CreateBitmapFromMemory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapFromHBITMAP_Proxy(
    IWICImagingFactory* This,
    HBITMAP hBitmap,
    HPALETTE hPalette,
    WICBitmapAlphaChannelOption options,
    IWICBitmap **ppIBitmap);
void __RPC_STUB IWICImagingFactory_CreateBitmapFromHBITMAP_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateBitmapFromHICON_Proxy(
    IWICImagingFactory* This,
    HICON hIcon,
    IWICBitmap **ppIBitmap);
void __RPC_STUB IWICImagingFactory_CreateBitmapFromHICON_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateComponentEnumerator_Proxy(
    IWICImagingFactory* This,
    DWORD componentTypes,
    DWORD options,
    IEnumUnknown **ppIEnumUnknown);
void __RPC_STUB IWICImagingFactory_CreateComponentEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateFastMetadataEncoderFromDecoder_Proxy(
    IWICImagingFactory* This,
    IWICBitmapDecoder *pIDecoder,
    IWICFastMetadataEncoder **ppIFastEncoder);
void __RPC_STUB IWICImagingFactory_CreateFastMetadataEncoderFromDecoder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateFastMetadataEncoderFromFrameDecode_Proxy(
    IWICImagingFactory* This,
    IWICBitmapFrameDecode *pIFrameDecoder,
    IWICFastMetadataEncoder **ppIFastEncoder);
void __RPC_STUB IWICImagingFactory_CreateFastMetadataEncoderFromFrameDecode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateQueryWriter_Proxy(
    IWICImagingFactory* This,
    REFGUID guidMetadataFormat,
    const GUID *pguidVendor,
    IWICMetadataQueryWriter **ppIQueryWriter);
void __RPC_STUB IWICImagingFactory_CreateQueryWriter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICImagingFactory_CreateQueryWriterFromReader_Proxy(
    IWICImagingFactory* This,
    IWICMetadataQueryReader *pIQueryReader,
    const GUID *pguidVendor,
    IWICMetadataQueryWriter **ppIQueryWriter);
void __RPC_STUB IWICImagingFactory_CreateQueryWriterFromReader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICImagingFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWICEnumMetadataItem interface
 */
#ifndef __IWICEnumMetadataItem_INTERFACE_DEFINED__
#define __IWICEnumMetadataItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWICEnumMetadataItem, 0xdc2bb46d, 0x3f07, 0x481e, 0x86,0x25, 0x22,0x0c,0x4a,0xed,0xbb,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dc2bb46d-3f07-481e-8625-220c4aedbb33")
IWICEnumMetadataItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PROPVARIANT *rgeltSchema,
        PROPVARIANT *rgeltId,
        PROPVARIANT *rgeltValue,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IWICEnumMetadataItem **ppIEnumMetadataItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWICEnumMetadataItem, 0xdc2bb46d, 0x3f07, 0x481e, 0x86,0x25, 0x22,0x0c,0x4a,0xed,0xbb,0x33)
#endif
#else
typedef struct IWICEnumMetadataItemVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWICEnumMetadataItem methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IWICEnumMetadataItem* This,
        ULONG celt,
        PROPVARIANT *rgeltSchema,
        PROPVARIANT *rgeltId,
        PROPVARIANT *rgeltValue,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IWICEnumMetadataItem* This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IWICEnumMetadataItem* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IWICEnumMetadataItem* This,
        IWICEnumMetadataItem **ppIEnumMetadataItem);

    END_INTERFACE
} IWICEnumMetadataItemVtbl;
interface IWICEnumMetadataItem {
    CONST_VTBL IWICEnumMetadataItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWICEnumMetadataItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWICEnumMetadataItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWICEnumMetadataItem_Release(This) (This)->lpVtbl->Release(This)
/*** IWICEnumMetadataItem methods ***/
#define IWICEnumMetadataItem_Next(This,celt,rgeltSchema,rgeltId,rgeltValue,pceltFetched) (This)->lpVtbl->Next(This,celt,rgeltSchema,rgeltId,rgeltValue,pceltFetched)
#define IWICEnumMetadataItem_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IWICEnumMetadataItem_Reset(This) (This)->lpVtbl->Reset(This)
#define IWICEnumMetadataItem_Clone(This,ppIEnumMetadataItem) (This)->lpVtbl->Clone(This,ppIEnumMetadataItem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWICEnumMetadataItem_QueryInterface(IWICEnumMetadataItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWICEnumMetadataItem_AddRef(IWICEnumMetadataItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWICEnumMetadataItem_Release(IWICEnumMetadataItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IWICEnumMetadataItem methods ***/
static FORCEINLINE HRESULT IWICEnumMetadataItem_Next(IWICEnumMetadataItem* This,ULONG celt,PROPVARIANT *rgeltSchema,PROPVARIANT *rgeltId,PROPVARIANT *rgeltValue,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgeltSchema,rgeltId,rgeltValue,pceltFetched);
}
static FORCEINLINE HRESULT IWICEnumMetadataItem_Skip(IWICEnumMetadataItem* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IWICEnumMetadataItem_Reset(IWICEnumMetadataItem* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IWICEnumMetadataItem_Clone(IWICEnumMetadataItem* This,IWICEnumMetadataItem **ppIEnumMetadataItem) {
    return This->lpVtbl->Clone(This,ppIEnumMetadataItem);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWICEnumMetadataItem_Next_Proxy(
    IWICEnumMetadataItem* This,
    ULONG celt,
    PROPVARIANT *rgeltSchema,
    PROPVARIANT *rgeltId,
    PROPVARIANT *rgeltValue,
    ULONG *pceltFetched);
void __RPC_STUB IWICEnumMetadataItem_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICEnumMetadataItem_Skip_Proxy(
    IWICEnumMetadataItem* This,
    ULONG celt);
void __RPC_STUB IWICEnumMetadataItem_Skip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICEnumMetadataItem_Reset_Proxy(
    IWICEnumMetadataItem* This);
void __RPC_STUB IWICEnumMetadataItem_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWICEnumMetadataItem_Clone_Proxy(
    IWICEnumMetadataItem* This,
    IWICEnumMetadataItem **ppIEnumMetadataItem);
void __RPC_STUB IWICEnumMetadataItem_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWICEnumMetadataItem_INTERFACE_DEFINED__ */

HRESULT WINAPI WICConvertBitmapSource(REFWICPixelFormatGUID dstFormat, IWICBitmapSource *pISrc, IWICBitmapSource **ppIDst);
DEFINE_GUID(CLSID_WICBmpDecoder, 0x6b462062,0x7cbf,0x400d,0x9f,0xdb,0x81,0x3d,0xd1,0x0f,0x27,0x78);
DEFINE_GUID(CLSID_WICPngDecoder, 0x389ea17b,0x5078,0x4cde,0xb6,0xef,0x25,0xc1,0x51,0x75,0xc7,0x51);
DEFINE_GUID(CLSID_WICIcoDecoder, 0xc61bfcdf,0x2e0f,0x4aad,0xa8,0xd7,0xe0,0x6b,0xaf,0xeb,0xcd,0xfe);
DEFINE_GUID(CLSID_WICJpegDecoder, 0x9456a480,0xe88b,0x43ea,0x9e,0x73,0x0b,0x2d,0x9b,0x71,0xb1,0xca);
DEFINE_GUID(CLSID_WICGifDecoder, 0x381dda3c,0x9ce9,0x4834,0xa2,0x3e,0x1f,0x98,0xf8,0xfc,0x52,0xbe);
DEFINE_GUID(CLSID_WICTiffDecoder, 0xb54e85d9,0xfe23,0x499f,0x8b,0x88,0x6a,0xce,0xa7,0x13,0x75,0x2b);
DEFINE_GUID(CLSID_WICWmpDecoder, 0xa26cec36,0x234c,0x4950,0xae,0x16,0xe3,0x4a,0xac,0xe7,0x1d,0x0d);
DEFINE_GUID(CLSID_WICBmpEncoder, 0x69be8bb4,0xd66d,0x47c8,0x86,0x5a,0xed,0x15,0x89,0x43,0x37,0x82);
DEFINE_GUID(CLSID_WICPngEncoder, 0x27949969,0x876a,0x41d7,0x94,0x47,0x56,0x8f,0x6a,0x35,0xa4,0xdc);
DEFINE_GUID(CLSID_WICJpegEncoder, 0x1a34f5c1,0x4a5a,0x46dc,0xb6,0x44,0x1f,0x45,0x67,0xe7,0xa6,0x76);
DEFINE_GUID(CLSID_WICGifEncoder, 0x114f5598,0x0b22,0x40a0,0x86,0xa1,0xc8,0x3e,0xa4,0x95,0xad,0xbd);
DEFINE_GUID(CLSID_WICTiffEncoder, 0x0131be10,0x2001,0x4c5f,0xa9,0xb0,0xcc,0x88,0xfa,0xb6,0x4c,0xe8);
DEFINE_GUID(CLSID_WICWmpEncoder, 0xac4ce3cb,0xe1c1,0x44cd,0x82,0x15,0x5a,0x16,0x65,0x50,0x9e,0xc2);
DEFINE_GUID(CLSID_WICDefaultFormatConverter, 0x1a3f11dc,0xb514,0x4b17,0x8c,0x5f,0x21,0x54,0x51,0x38,0x52,0xf1);
DEFINE_GUID(GUID_ContainerFormatBmp, 0x0af1d87e,0xfcfe,0x4188,0xbd,0xeb,0xa7,0x90,0x64,0x71,0xcb,0xe3);
DEFINE_GUID(GUID_ContainerFormatPng, 0x1b7cfaf4,0x713f,0x473c,0xbb,0xcd,0x61,0x37,0x42,0x5f,0xae,0xaf);
DEFINE_GUID(GUID_ContainerFormatIco, 0xa3a860c4,0x338f,0x4c17,0x91,0x9a,0xfb,0xa4,0xb5,0x62,0x8f,0x21);
DEFINE_GUID(GUID_ContainerFormatJpeg, 0x19e4a5aa,0x5662,0x4fc5,0xa0,0xc0,0x17,0x58,0x02,0x8e,0x10,0x57);
DEFINE_GUID(GUID_ContainerFormatTiff, 0x163bcc30,0xe2e9,0x4f0b,0x96,0x1d,0xa3,0xe9,0xfd,0xb7,0x88,0xa3);
DEFINE_GUID(GUID_ContainerFormatGif, 0x1f8a5601,0x7d4d,0x4cbd,0x9c,0x82,0x1b,0xc8,0xd4,0xee,0xb9,0xa5);
DEFINE_GUID(GUID_ContainerFormatWmp, 0x57a37caa,0x367a,0x4540,0x91,0x6b,0xf1,0x83,0xc5,0x09,0x3a,0x4b);
DEFINE_GUID(GUID_VendorMicrosoft, 0xf0e749ca,0xedef,0x4589,0xa7,0x3a,0xee,0x0e,0x62,0x6a,0x2a,0x2b);
DEFINE_GUID(CLSID_WICImagingCategories, 0xfae3d380,0xfea4,0x4623,0x8c,0x75,0xc6,0xb6,0x11,0x10,0xb6,0x81);
DEFINE_GUID(CATID_WICBitmapDecoders, 0x7ed96837,0x96f0,0x4812,0xb2,0x11,0xf1,0x3c,0x24,0x11,0x7e,0xd3);
DEFINE_GUID(CATID_WICBitmapEncoders, 0xac757296,0x3522,0x4e11,0x98,0x62,0xc1,0x7b,0xe5,0xa1,0x76,0x7e);
DEFINE_GUID(CATID_WICFormatConverters, 0x7835eae8,0xbf14,0x49d1,0x93,0xce,0x53,0x3a,0x40,0x7b,0x22,0x48);
DEFINE_GUID(CATID_WICMetadataReader, 0x05af94d8,0x7174,0x4cd2,0xbe,0x4a,0x41,0x24,0xb8,0x0e,0xe4,0xb8);
DEFINE_GUID(CATID_WICPixelFormats, 0x2b46e70f,0xcda7,0x473e,0x89,0xf6,0xdc,0x96,0x30,0xa2,0x39,0x0b);
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER LPSAFEARRAY_UserSize     (ULONG *, ULONG, LPSAFEARRAY *);
unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal  (ULONG *, unsigned char *, LPSAFEARRAY *);
unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(ULONG *, unsigned char *, LPSAFEARRAY *);
void            __RPC_USER LPSAFEARRAY_UserFree     (ULONG *, LPSAFEARRAY *);
ULONG           __RPC_USER HBITMAP_UserSize     (ULONG *, ULONG, HBITMAP *);
unsigned char * __RPC_USER HBITMAP_UserMarshal  (ULONG *, unsigned char *, HBITMAP *);
unsigned char * __RPC_USER HBITMAP_UserUnmarshal(ULONG *, unsigned char *, HBITMAP *);
void            __RPC_USER HBITMAP_UserFree     (ULONG *, HBITMAP *);
ULONG           __RPC_USER HPALETTE_UserSize     (ULONG *, ULONG, HPALETTE *);
unsigned char * __RPC_USER HPALETTE_UserMarshal  (ULONG *, unsigned char *, HPALETTE *);
unsigned char * __RPC_USER HPALETTE_UserUnmarshal(ULONG *, unsigned char *, HPALETTE *);
void            __RPC_USER HPALETTE_UserFree     (ULONG *, HPALETTE *);
ULONG           __RPC_USER HICON_UserSize     (ULONG *, ULONG, HICON *);
unsigned char * __RPC_USER HICON_UserMarshal  (ULONG *, unsigned char *, HICON *);
unsigned char * __RPC_USER HICON_UserUnmarshal(ULONG *, unsigned char *, HICON *);
void            __RPC_USER HICON_UserFree     (ULONG *, HICON *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wincodec_h__ */
