/*++ BUILD Version: 0002    // Increment this if a change has global effects

Copyright (c) 2000 Microsoft Corporation

Module Name:

    wincodec.idl

Abstract:

    This module contains the public data structures and API definitions
    needed for the Windows still image codecs.

Revision History:

--*/

import "wtypes.idl";
import "propidl.idl";
import "objidl.idl";
import "ocidl.idl";

/*=========================================================================*\
    Includes
\*=========================================================================*/

cpp_quote("#include <intsafe.h>")
cpp_quote("#include <dcommon.h>")

/*=========================================================================*\
    SDK Version
\*=========================================================================*/

cpp_quote("#define WINCODEC_SDK_VERSION1 0x0236")
cpp_quote("#define WINCODEC_SDK_VERSION2 0x0237")

cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory,  0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0xa);")
cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory1, 0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0xa);")
cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory2, 0x317d06e8, 0x5f24, 0x433d, 0xbd, 0xf7, 0x79, 0xce, 0x68, 0xd8, 0xab, 0xc2);")

cpp_quote("#if(_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
cpp_quote("#define WINCODEC_SDK_VERSION WINCODEC_SDK_VERSION2")
cpp_quote("#define CLSID_WICImagingFactory CLSID_WICImagingFactory2")
cpp_quote("#else")
cpp_quote("#define WINCODEC_SDK_VERSION WINCODEC_SDK_VERSION1")
cpp_quote("#endif")

/*=========================================================================*\
    GUID Identifiers for the vendors
\*=========================================================================*/

cpp_quote("DEFINE_GUID(GUID_VendorMicrosoft, 0xf0e749ca, 0xedef, 0x4589, 0xa7, 0x3a, 0xee, 0xe, 0x62, 0x6a, 0x2a, 0x2b);")
cpp_quote("DEFINE_GUID(GUID_VendorMicrosoftBuiltIn, 0x257a30fd, 0x6b6, 0x462b, 0xae, 0xa4, 0x63, 0xf7, 0xb, 0x86, 0xe5, 0x33);")


/*=========================================================================*\
    GUID Identifiers for the codecs
\*=========================================================================*/

cpp_quote("DEFINE_GUID(CLSID_WICPngDecoder,   0x389ea17b, 0x5078, 0x4cde, 0xb6, 0xef, 0x25, 0xc1, 0x51, 0x75, 0xc7, 0x51);")
cpp_quote("DEFINE_GUID(CLSID_WICPngDecoder1,  0x389ea17b, 0x5078, 0x4cde, 0xb6, 0xef, 0x25, 0xc1, 0x51, 0x75, 0xc7, 0x51);")
cpp_quote("DEFINE_GUID(CLSID_WICPngDecoder2,  0xe018945b, 0xaa86, 0x4008, 0x9b, 0xd4, 0x67, 0x77, 0xa1, 0xe4, 0x0c, 0x11);")

cpp_quote("#if(_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
cpp_quote("#define CLSID_WICPngDecoder CLSID_WICPngDecoder2")
cpp_quote("#endif")

cpp_quote("DEFINE_GUID(CLSID_WICBmpDecoder,  0x6b462062, 0x7cbf, 0x400d, 0x9f, 0xdb, 0x81, 0x3d, 0xd1, 0x0f, 0x27, 0x78);")
cpp_quote("DEFINE_GUID(CLSID_WICIcoDecoder,  0xc61bfcdf, 0x2e0f, 0x4aad, 0xa8, 0xd7, 0xe0, 0x6b, 0xaf, 0xeb, 0xcd, 0xfe);")
cpp_quote("DEFINE_GUID(CLSID_WICJpegDecoder, 0x9456a480, 0xe88b, 0x43ea, 0x9e, 0x73, 0x0b, 0x2d, 0x9b, 0x71, 0xb1, 0xca);")
cpp_quote("DEFINE_GUID(CLSID_WICGifDecoder,  0x381dda3c, 0x9ce9, 0x4834, 0xa2, 0x3e, 0x1f, 0x98, 0xf8, 0xfc, 0x52, 0xbe);")
cpp_quote("DEFINE_GUID(CLSID_WICTiffDecoder, 0xb54e85d9, 0xfe23, 0x499f, 0x8b, 0x88, 0x6a, 0xce, 0xa7, 0x13, 0x75, 0x2b);")
cpp_quote("DEFINE_GUID(CLSID_WICWmpDecoder,  0xa26cec36, 0x234c, 0x4950, 0xae, 0x16, 0xe3, 0x4a, 0xac, 0xe7, 0x1d, 0x0d);")

cpp_quote("DEFINE_GUID(CLSID_WICBmpEncoder,  0x69be8bb4, 0xd66d, 0x47c8, 0x86, 0x5a, 0xed, 0x15, 0x89, 0x43, 0x37, 0x82);")
cpp_quote("DEFINE_GUID(CLSID_WICPngEncoder,  0x27949969, 0x876a, 0x41d7, 0x94, 0x47, 0x56, 0x8f, 0x6a, 0x35, 0xa4, 0xdc);")
cpp_quote("DEFINE_GUID(CLSID_WICJpegEncoder, 0x1a34f5c1, 0x4a5a, 0x46dc, 0xb6, 0x44, 0x1f, 0x45, 0x67, 0xe7, 0xa6, 0x76);")
cpp_quote("DEFINE_GUID(CLSID_WICGifEncoder,  0x114f5598, 0x0b22, 0x40a0, 0x86, 0xa1, 0xc8, 0x3e, 0xa4, 0x95, 0xad, 0xbd);")
cpp_quote("DEFINE_GUID(CLSID_WICTiffEncoder, 0x0131be10, 0x2001, 0x4c5f, 0xa9, 0xb0, 0xcc, 0x88, 0xfa, 0xb6, 0x4c, 0xe8);")
cpp_quote("DEFINE_GUID(CLSID_WICWmpEncoder,  0xac4ce3cb, 0xe1c1, 0x44cd, 0x82, 0x15, 0x5a, 0x16, 0x65, 0x50, 0x9e, 0xc2);")


/*=========================================================================*\
    GUID Identifiers for the image container formats
\*=========================================================================*/

cpp_quote("DEFINE_GUID(GUID_ContainerFormatBmp,  0x0af1d87e, 0xfcfe, 0x4188, 0xbd, 0xeb, 0xa7, 0x90, 0x64, 0x71, 0xcb, 0xe3);")
cpp_quote("DEFINE_GUID(GUID_ContainerFormatPng,  0x1b7cfaf4, 0x713f, 0x473c, 0xbb, 0xcd, 0x61, 0x37, 0x42, 0x5f, 0xae, 0xaf);")
cpp_quote("DEFINE_GUID(GUID_ContainerFormatIco,  0xa3a860c4, 0x338f, 0x4c17, 0x91, 0x9a, 0xfb, 0xa4, 0xb5, 0x62, 0x8f, 0x21);")
cpp_quote("DEFINE_GUID(GUID_ContainerFormatJpeg, 0x19e4a5aa, 0x5662, 0x4fc5, 0xa0, 0xc0, 0x17, 0x58, 0x02, 0x8e, 0x10, 0x57);")
cpp_quote("DEFINE_GUID(GUID_ContainerFormatTiff, 0x163bcc30, 0xe2e9, 0x4f0b, 0x96, 0x1d, 0xa3, 0xe9, 0xfd, 0xb7, 0x88, 0xa3);")
cpp_quote("DEFINE_GUID(GUID_ContainerFormatGif,  0x1f8a5601, 0x7d4d, 0x4cbd, 0x9c, 0x82, 0x1b, 0xc8, 0xd4, 0xee, 0xb9, 0xa5);")
cpp_quote("DEFINE_GUID(GUID_ContainerFormatWmp,  0x57a37caa, 0x367a, 0x4540, 0x91, 0x6b, 0xf1, 0x83, 0xc5, 0x09, 0x3a, 0x4b);")


/*=========================================================================*\
    Category Identifiers
\*=========================================================================*/

cpp_quote("DEFINE_GUID(CLSID_WICImagingCategories, 0xfae3d380, 0xfea4, 0x4623, 0x8c, 0x75, 0xc6, 0xb6, 0x11, 0x10, 0xb6, 0x81);")
cpp_quote("DEFINE_GUID(CATID_WICBitmapDecoders,    0x7ed96837, 0x96f0, 0x4812, 0xb2, 0x11, 0xf1, 0x3c, 0x24, 0x11, 0x7e, 0xd3);")
cpp_quote("DEFINE_GUID(CATID_WICBitmapEncoders,    0xac757296, 0x3522, 0x4e11, 0x98, 0x62, 0xc1, 0x7b, 0xe5, 0xa1, 0x76, 0x7e);")
cpp_quote("DEFINE_GUID(CATID_WICPixelFormats,      0x2b46e70f, 0xcda7, 0x473e, 0x89, 0xf6, 0xdc, 0x96, 0x30, 0xa2, 0x39, 0x0b);")
cpp_quote("DEFINE_GUID(CATID_WICFormatConverters,  0x7835eae8, 0xbf14, 0x49d1, 0x93, 0xce, 0x53, 0x3a, 0x40, 0x7b, 0x22, 0x48);")
cpp_quote("DEFINE_GUID(CATID_WICMetadataReader,    0x05af94d8, 0x7174, 0x4cd2, 0xbe, 0x4a, 0x41, 0x24, 0xb8, 0x0e, 0xe4, 0xb8);")
cpp_quote("DEFINE_GUID(CATID_WICMetadataWriter,    0xabe3b9a4, 0x257d, 0x4b97, 0xbd, 0x1a, 0x29, 0x4a, 0xf4, 0x96, 0x22, 0x2e);")


/*=========================================================================*\
    Format converters
\*=========================================================================*/

cpp_quote("DEFINE_GUID(CLSID_WICDefaultFormatConverter, 0x1a3f11dc, 0xb514, 0x4b17, 0x8c, 0x5f, 0x21, 0x54, 0x51, 0x38, 0x52, 0xf1);")
cpp_quote("DEFINE_GUID(CLSID_WICFormatConverterHighColor, 0xac75d454, 0x9f37, 0x48f8, 0xb9, 0x72, 0x4e, 0x19, 0xbc, 0x85, 0x60, 0x11);")
cpp_quote("DEFINE_GUID(CLSID_WICFormatConverterNChannel, 0xc17cabb2, 0xd4a3, 0x47d7, 0xa5, 0x57, 0x33, 0x9b, 0x2e, 0xfb, 0xd4, 0xf1);")
cpp_quote("DEFINE_GUID(CLSID_WICFormatConverterWMPhoto, 0x9cb5172b, 0xd600, 0x46ba, 0xab, 0x77, 0x77, 0xbb, 0x7e, 0x3a, 0x00, 0xd9);")


/*=========================================================================*\
    Interface forward declarations :
\*=========================================================================*/

interface IWICImagingFactory;
interface IWICImagingFactory2;
interface IWICPalette;
interface IWICBitmap;
interface IWICBitmapLock;
interface IWICBitmapSource;
interface IWICFastMetadataEncoder;
interface IWICBitmapCodecInfo;
interface IWICBitmapDecoderInfo;
interface IWICBitmapEncoderInfo;
interface IWICBitmapDecoder;
interface IWICBitmapEncoder;
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
interface IWICImageEncoder;
cpp_quote("#endif")
interface IWICBitmapFrameDecode;
interface IWICBitmapFrameEncode;
interface IWICBitmapSourceTransform;
interface IWICBitmapScaler;
interface IWICBitmapClipper;
interface IWICBitmapFlipRotator;
interface IWICFormatConverter;
interface IWICComponentInfo;
interface IWICStream;
interface IWICEnumMetadataItem;
interface IWICMetadataQueryReader;
interface IWICMetadataQueryWriter;

cpp_quote("#if 0")
// IDImageContxt and ID2D1Image are interfaces that don't have proxies and aren't 
// described in an idl.  For the idl compiler, typedefing as DWORD * suppresses 
// midl compiler errors.  The generated header file will use the forward
// declarations below.
typedef DWORD *ID2D1Device;
typedef DWORD *ID2D1Image;
typedef DWORD *D2D1_PIXEL_FORMAT;
cpp_quote ("#endif")

cpp_quote ("typedef interface ID2D1Device ID2D1Device;")
cpp_quote ("typedef interface ID2D1Image ID2D1Image;")

/*=========================================================================*\
    Color
\*=========================================================================*/

typedef UINT32 WICColor;


/*=========================================================================*\
    Rect
\*=========================================================================*/

typedef [public] struct WICRect
{
    INT X;
    INT Y;
    INT Width;
    INT Height;
} WICRect;


/*=========================================================================*\
    Definition of a wire pointer.
\*=========================================================================*/

cpp_quote("typedef BYTE* WICInProcPointer;")
cpp_quote("#if 0")
typedef [wire_marshal(UINT_PTR)] void* WICInProcPointer;
cpp_quote("#endif")


/*=========================================================================*\
    WICColorContextType
\*=========================================================================*/

typedef [public] enum WICColorContextType
{
    WICColorContextUninitialized = 0x00000000,
    WICColorContextProfile  = 0x00000001,
    WICColorContextExifColorSpace = 0x00000002,
} WICColorContextType;


#define CODEC_FORCE_DWORD 0x7FFFFFFF


/*=========================================================================*\
    Pixel Format GUIDs
\*=========================================================================*/

typedef [public] REFGUID REFWICPixelFormatGUID;
typedef [public] GUID WICPixelFormatGUID;

/* Undefined formats */
cpp_quote("#define GUID_WICPixelFormatUndefined GUID_WICPixelFormatDontCare" )
cpp_quote("DEFINE_GUID(GUID_WICPixelFormatDontCare, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x00);")

/* Indexed formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat1bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x01);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat2bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x02);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat4bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x03);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat8bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x04);")

/* Grayscale formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormatBlackWhite, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x05);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat2bppGray,   0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x06);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat4bppGray,   0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x07);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat8bppGray,   0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x08);")

/* Alpha only format */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat8bppAlpha, 0xe6cd0116, 0xeeba, 0x4161, 0xaa, 0x85, 0x27, 0xdd, 0x9f, 0xb3, 0xa8, 0x95);")

/* sRGB formats (gamma is approx. 2.2) */
/* For a full definition, see the sRGB spec */

/* 16bpp formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat16bppBGR555, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x09);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat16bppBGR565, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0a);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat16bppBGRA5551, 0x05ec7c2b, 0xf1e6, 0x4961, 0xad, 0x46, 0xe1, 0xcc, 0x81, 0x0a, 0x87, 0xd2);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat16bppGray,   0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0b);")

/* 24bpp formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat24bppBGR, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat24bppRGB, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0d);")

/* 32bpp format */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppBGR,   0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0e);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppBGRA,  0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0f);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppPBGRA, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x10);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppGrayFloat,  0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x11);")
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppRGB,  0xd98c6b95, 0x3efe, 0x47d6, 0xbb, 0x25, 0xeb, 0x17, 0x48, 0xab, 0x0c, 0xf1);")
cpp_quote("#endif")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppRGBA, 0xf5c7ad2d, 0x6a8d, 0x43dd, 0xa7, 0xa8, 0xa2, 0x99, 0x35, 0x26, 0x1a, 0xe9);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppPRGBA, 0x3cc4a650, 0xa527, 0x4d37, 0xa9, 0x16, 0x31, 0x42, 0xc7, 0xeb, 0xed, 0xba);")

/* 48bpp formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppRGB, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x15);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppBGR, 0xe605a384, 0xb468, 0x46ce, 0xbb, 0x2e, 0x36, 0xf1, 0x80, 0xe6, 0x43, 0x13);")

/* 64bpp format */
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGB,   0xa1182111, 0x186d, 0x4d42, 0xbc, 0x6a, 0x9c, 0x83, 0x03, 0xa8, 0xdf, 0xf9);")
cpp_quote("#endif")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBA,  0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x16);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppBGRA,  0x1562ff7c, 0xd352, 0x46f9, 0x97, 0x9e, 0x42, 0x97, 0x6b, 0x79, 0x22, 0x46);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppPRGBA, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x17);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppPBGRA, 0x8c518e8e, 0xa4ec, 0x468b, 0xae, 0x70, 0xc9, 0xa3, 0x5a, 0x9c, 0x55, 0x30);")

/* scRGB formats. Gamma is 1.0 */
/* For a full definition, see the scRGB spec */

/* 16bpp format */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat16bppGrayFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x13);")

/* 32bpp format */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppBGR101010, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x14);")

/* 48bpp format */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x12);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppBGRFixedPoint, 0x49ca140e, 0xcab6, 0x493b, 0x9d, 0xdf, 0x60, 0x18, 0x7c, 0x37, 0x53, 0x2a);")

/* 96bpp format */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat96bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x18);")
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat96bppRGBFloat, 0xe3fed78f, 0xe8db, 0x4acf, 0x84, 0xc1, 0xe9, 0x7f, 0x61, 0x36, 0xb3, 0x27);")
cpp_quote("#endif")

/* Floating point scRGB formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bppRGBAFloat,  0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x19);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bppPRGBAFloat, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1a);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bppRGBFloat,   0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1b);")

/* CMYK formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppCMYK, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1c);")

/* Extended formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBAFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1d);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppBGRAFixedPoint, 0x356de33c, 0x54d2, 0x4a23, 0xbb, 0x4, 0x9b, 0x7b, 0xf9, 0xb1, 0xd4, 0x2d);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x40);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bppRGBAFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1e);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x41);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBAHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3a);")
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppPRGBAHalf, 0x58ad26c2, 0xc623, 0x4d9d, 0xb3, 0x20, 0x38, 0x7e, 0x49, 0xf8, 0xc4, 0x42);")
cpp_quote("#endif")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x42);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppRGBHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3b);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppRGBE, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3d);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat16bppGrayHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3e);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppGrayFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3f);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppRGBA1010102, 0x25238D72, 0xFCF9, 0x4522, 0xb5, 0x14, 0x55, 0x78, 0xe5, 0xad, 0x55, 0xe0);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppRGBA1010102XR, 0x00DE6B9A, 0xC101, 0x434b, 0xb5, 0x02, 0xd0, 0x16, 0x5e, 0xe1, 0x12, 0x2c);")

/* More CMYK formats and n-Channel formats */
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppCMYK, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1f);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat24bpp3Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x20);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bpp4Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x21);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat40bpp5Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x22);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bpp6Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x23);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat56bpp7Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x24);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bpp8Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x25);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bpp3Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x26);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bpp4Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x27);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat80bpp5Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x28);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat96bpp6Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x29);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat112bpp7Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2a);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bpp8Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2b);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat40bppCMYKAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2c);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat80bppCMYKAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2d);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bpp3ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2e);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat40bpp4ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2f);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bpp5ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x30);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat56bpp6ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x31);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bpp7ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x32);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat72bpp8ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x33);")

cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bpp3ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x34);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat80bpp4ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x35);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat96bpp5ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x36);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat112bpp6ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x37);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat128bpp7ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x38);")
cpp_quote("DEFINE_GUID(GUID_WICPixelFormat144bpp8ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x39);")


/*=========================================================================*\
    WICBitmapCreateCacheOptions
\*=========================================================================*/

typedef [public] enum WICBitmapCreateCacheOption
{
    WICBitmapNoCache                       = 0x00000000,
    WICBitmapCacheOnDemand                 = 0x00000001,
    WICBitmapCacheOnLoad                   = 0x00000002,
    WICBITMAPCREATECACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICBitmapCreateCacheOption;


/*=========================================================================*\
    WICDecodeOptions
\*=========================================================================*/

typedef [public] enum WICDecodeOptions
{
    WICDecodeMetadataCacheOnDemand     = 0x00000000,
    WICDecodeMetadataCacheOnLoad       = 0x00000001,
    WICMETADATACACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICDecodeOptions;


/*=========================================================================*\
    WICBitmapEncoderCacheOption
\*=========================================================================*/

typedef [public] enum WICBitmapEncoderCacheOption
{
   WICBitmapEncoderCacheInMemory           = 0x00000000,
   WICBitmapEncoderCacheTempFile           = 0x00000001,
   WICBitmapEncoderNoCache                 = 0x00000002,
   WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICBitmapEncoderCacheOption;


/*=========================================================================*\
    WICComponentType
\*=========================================================================*/

typedef [public] enum WICComponentType
{
    WICDecoder                   = 0x00000001,
    WICEncoder                   = 0x00000002,
    WICPixelFormatConverter      = 0x00000004,
    WICMetadataReader            = 0x00000008,
    WICMetadataWriter            = 0x00000010,
    WICPixelFormat               = 0x00000020,
    WICAllComponents             = 0x0000003F,
    WICCOMPONENTTYPE_FORCE_DWORD = CODEC_FORCE_DWORD
} WICComponentType;


/*=========================================================================*\
    WICComponentEnumerateOptions
\*=========================================================================*/

typedef [public] enum WICComponentEnumerateOptions
{
    WICComponentEnumerateDefault             = 0x00000000,
    WICComponentEnumerateRefresh             = 0x00000001,
    WICComponentEnumerateDisabled            = 0x80000000,
    WICComponentEnumerateUnsigned            = 0x40000000,
    WICComponentEnumerateBuiltInOnly         = 0x20000000,
    WICCOMPONENTENUMERATEOPTIONS_FORCE_DWORD = CODEC_FORCE_DWORD
} WICComponentEnumerateOptions;


/*=========================================================================*\
    WICBitmapPattern
\*=========================================================================*/

typedef [public] struct WICBitmapPattern
{
    ULARGE_INTEGER Position;
    ULONG Length;
    [size_is(Length)] BYTE *Pattern;
    [size_is(Length)] BYTE *Mask;
    BOOL  EndOfStream;

}   WICBitmapPattern;


/*=========================================================================*\
    WICBitmapInterpolationMode
\*=========================================================================*/

typedef [public] enum WICBitmapInterpolationMode
{
    // Nearest Neighbor filtering. Also known as nearest pixel or nearest point
    // sampling.

    WICBitmapInterpolationModeNearestNeighbor = 0x00000000,

    // Linear filtering.

    WICBitmapInterpolationModeLinear          = 0x00000001,

    // Cubic filtering. May include linear pre-filtering or decimation.

    WICBitmapInterpolationModeCubic           = 0x00000002,

    // Fant filtering.

    WICBitmapInterpolationModeFant            = 0x00000003,

    WICBITMAPINTERPOLATIONMODE_FORCE_DWORD    = CODEC_FORCE_DWORD
} WICBitmapInterpolationMode;


/*=========================================================================*\
    WICBitmapPaletteType
\*=========================================================================*/

typedef [public] enum WICBitmapPaletteType
{
    // Arbitrary custom palette provided by caller.

    WICBitmapPaletteTypeCustom           = 0x00000000,

    // Optimal palette generated using a median-cut algorithm.

    WICBitmapPaletteTypeMedianCut        = 0x00000001,

    // Black and white palette.

    WICBitmapPaletteTypeFixedBW          = 0x00000002,

    // Symmetric halftone palettes.
    // Each of these halftone palettes will be a superset of the system palette.
    // E.g. Halftone8 will have it's 8-color on-off primaries and the 16 system
    // colors added. With duplicates removed, that leaves 16 colors.

    WICBitmapPaletteTypeFixedHalftone8   = 0x00000003, // 8-color, on-off primaries
    WICBitmapPaletteTypeFixedHalftone27  = 0x00000004, // 3 intensity levels of each color
    WICBitmapPaletteTypeFixedHalftone64  = 0x00000005, // 4 intensity levels of each color
    WICBitmapPaletteTypeFixedHalftone125 = 0x00000006, // 5 intensity levels of each color
    WICBitmapPaletteTypeFixedHalftone216 = 0x00000007, // 6 intensity levels of each color

    // Convenient web palette, same as WICBitmapPaletteTypeFixedHalftone216

    WICBitmapPaletteTypeFixedWebPalette  = WICBitmapPaletteTypeFixedHalftone216,

    // Assymetric halftone palettes.
    // These are somewhat less useful than the symmetric ones, but are
    // included for completeness. These do not include all of the system
    // colors.

    WICBitmapPaletteTypeFixedHalftone252 = 0x00000008, // 6-red, 7-green, 6-blue intensities
    WICBitmapPaletteTypeFixedHalftone256 = 0x00000009, // 8-red, 8-green, 4-blue intensities

    WICBitmapPaletteTypeFixedGray4       = 0x0000000A, //   4 shades of gray
    WICBitmapPaletteTypeFixedGray16      = 0x0000000B, //  16 shades of gray
    WICBitmapPaletteTypeFixedGray256     = 0x0000000C, // 256 shades of gray

    WICBITMAPPALETTETYPE_FORCE_DWORD     = CODEC_FORCE_DWORD
} WICBitmapPaletteType;


/*=========================================================================*\
    WICBitmapDitherType
\*=========================================================================*/

typedef [public] enum WICBitmapDitherType
{
    // Solid color - picks the nearest matching color with no attempt to
    // halftone or dither. May be used on an arbitrary palette.

    WICBitmapDitherTypeNone           = 0x00000000,
    WICBitmapDitherTypeSolid          = 0x00000000,

    // Ordered dithers and spiral dithers must be used with a fixed palette or
    // a fixed palette translation.

    // NOTE: DitherOrdered4x4 is unique in that it may apply to 16bpp
    // conversions also.

    WICBitmapDitherTypeOrdered4x4     = 0x00000001,

    WICBitmapDitherTypeOrdered8x8     = 0x00000002,
    WICBitmapDitherTypeOrdered16x16   = 0x00000003,
    WICBitmapDitherTypeSpiral4x4      = 0x00000004,
    WICBitmapDitherTypeSpiral8x8      = 0x00000005,
    WICBitmapDitherTypeDualSpiral4x4  = 0x00000006,
    WICBitmapDitherTypeDualSpiral8x8  = 0x00000007,

    // Error diffusion. May be used with any palette.

    WICBitmapDitherTypeErrorDiffusion = 0x00000008,

    WICBITMAPDITHERTYPE_FORCE_DWORD   = CODEC_FORCE_DWORD
} WICBitmapDitherType;


/*=========================================================================*\
    WICBitmapAlphaChannelOption
\*=========================================================================*/

typedef [public] enum WICBitmapAlphaChannelOption
{
    WICBitmapUseAlpha                        = 0x00000000,
    WICBitmapUsePremultipliedAlpha           = 0x00000001,
    WICBitmapIgnoreAlpha                     = 0x00000002,
    WICBITMAPALPHACHANNELOPTIONS_FORCE_DWORD = CODEC_FORCE_DWORD
} WICBitmapAlphaChannelOption;


/*=========================================================================*\
    WICBitmapTransformOptions
\*=========================================================================*/

typedef [public] enum WICBitmapTransformOptions
{
    WICBitmapTransformRotate0             = 0x00000000,
    WICBitmapTransformRotate90            = 0x00000001,
    WICBitmapTransformRotate180           = 0x00000002,
    WICBitmapTransformRotate270           = 0x00000003,
    WICBitmapTransformFlipHorizontal      = 0x00000008,
    WICBitmapTransformFlipVertical        = 0x00000010,
    WICBITMAPTRANSFORMOPTIONS_FORCE_DWORD = CODEC_FORCE_DWORD
} WICBitmapTransformOptions;


/*=========================================================================*\
    WICBitmapLockFlags
\*=========================================================================*/

typedef [public] enum WICBitmapLockFlags
{
   WICBitmapLockRead              = 0x00000001,
   WICBitmapLockWrite             = 0x00000002,
   WICBITMAPLOCKFLAGS_FORCE_DWORD = CODEC_FORCE_DWORD
} WICBitmapLockFlags;


/*=========================================================================*\
    WICBitmapDecoderCapabilities
\*=========================================================================*/

typedef [public] enum WICBitmapDecoderCapabilities
{
    WICBitmapDecoderCapabilitySameEncoder          = 0x00000001,
    WICBitmapDecoderCapabilityCanDecodeAllImages   = 0x00000002,
    WICBitmapDecoderCapabilityCanDecodeSomeImages  = 0x00000004,
    WICBitmapDecoderCapabilityCanEnumerateMetadata = 0x00000008,
    WICBitmapDecoderCapabilityCanDecodeThumbnail   = 0x00000010,
    WICBITMAPDECODERCAPABILITIES_FORCE_DWORD       = CODEC_FORCE_DWORD
} WICBitmapDecoderCapabilities;


/*=========================================================================*\
    WICProgressOperation
\*=========================================================================*/

typedef [public] enum WICProgressOperation
{
    WICProgressOperationCopyPixels   = 0x00000001,
    WICProgressOperationWritePixels  = 0x00000002,
    WICProgressOperationAll          = 0x0000FFFF,
    WICPROGRESSOPERATION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICProgressOperation;


/*=========================================================================*\
    WICProgressNotification
\*=========================================================================*/

typedef [public] enum WICProgressNotification
{
    WICProgressNotificationBegin        = 0x00010000,
    WICProgressNotificationEnd          = 0x00020000,
    WICProgressNotificationFrequent     = 0x00040000,
    WICProgressNotificationAll          = 0xFFFF0000,
    WICPROGRESSNOTIFICATION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICProgressNotification;


/*=========================================================================*\
    WICComponentSigning
\*=========================================================================*/

typedef [public] enum WICComponentSigning
{
    WICComponentSigned              = 0x00000001,
    WICComponentUnsigned            = 0x00000002,
    WICComponentSafe                = 0x00000004,
    WICComponentDisabled            = 0x80000000,
    WICCOMPONENTSIGNING_FORCE_DWORD = CODEC_FORCE_DWORD
} WICComponentSigning;


/*=========================================================================*\
    WICGifLogicalScreenDescriptorProperties 
\*=========================================================================*/

typedef [public] enum WICGifLogicalScreenDescriptorProperties
{
    // This part is for Logical Screen Descriptor
    WICGifLogicalScreenSignature                        = 0x00000001,	
    WICGifLogicalScreenDescriptorWidth                  = 0x00000002,
    WICGifLogicalScreenDescriptorHeight                 = 0x00000003,
    WICGifLogicalScreenDescriptorGlobalColorTableFlag   = 0x00000004,
    WICGifLogicalScreenDescriptorColorResolution        = 0x00000005,
    WICGifLogicalScreenDescriptorSortFlag               = 0x00000006,
    WICGifLogicalScreenDescriptorGlobalColorTableSize   = 0x00000007,
    WICGifLogicalScreenDescriptorBackgroundColorIndex   = 0x00000008,
    WICGifLogicalScreenDescriptorPixelAspectRatio       = 0x00000009,
    WICGifLogicalScreenDescriptorProperties_FORCE_DWORD = CODEC_FORCE_DWORD

} WICGifLogicalScreenDescriptorProperties;


/*=========================================================================*\
    WICGifImageDescriptorProperties 
\*=========================================================================*/

typedef [public] enum WICGifImageDescriptorProperties
{
    // This part is for Image Descriptor
    WICGifImageDescriptorLeft                   = 0x00000001,
    WICGifImageDescriptorTop                    = 0x00000002,
    WICGifImageDescriptorWidth                  = 0x00000003,
    WICGifImageDescriptorHeight                 = 0x00000004,
    WICGifImageDescriptorLocalColorTableFlag    = 0x00000005,
    WICGifImageDescriptorInterlaceFlag          = 0x00000006,
    WICGifImageDescriptorSortFlag               = 0x00000007,
    WICGifImageDescriptorLocalColorTableSize    = 0x00000008,
    WICGifImageDescriptorProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICGifImageDescriptorProperties;


/*=========================================================================*\
    WICGifGraphicControlExtensionProperties 
\*=========================================================================*/

typedef [public] enum WICGifGraphicControlExtensionProperties
{
    // This part is for Graphic Control Extension
    WICGifGraphicControlExtensionDisposal               = 0x00000001,
    WICGifGraphicControlExtensionUserInputFlag          = 0x00000002,
    WICGifGraphicControlExtensionTransparencyFlag       = 0x00000003,
    WICGifGraphicControlExtensionDelay                  = 0x00000004,
    WICGifGraphicControlExtensionTransparentColorIndex  = 0x00000005,
    WICGifGraphicControlExtensionProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICGifGraphicControlExtensionProperties;


/*=========================================================================*\
    WICGifApplicationExtensionProperties 
\*=========================================================================*/

typedef [public] enum WICGifApplicationExtensionProperties
{
    // This part is for Application Extension	 
    WICGifApplicationExtensionApplication            = 0x00000001,
    WICGifApplicationExtensionData                   = 0x00000002,
    WICGifApplicationExtensionProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICGifApplicationExtensionProperties;


/*=========================================================================*\
    WICGifCommentExtensionProperties
\*=========================================================================*/

typedef [public] enum WICGifCommentExtensionProperties
{
    WICGifCommentExtensionText                   = 0x00000001,
    WICGifCommentExtensionProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICGifCommentExtensionProperties;

/*=========================================================================*\
    WICJpegCommentProperties
\*=========================================================================*/

typedef [public] enum WICJpegCommentProperties
{
    WICJpegCommentText                   = 0x00000001,
    WICJpegCommentProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICJpegCommentProperties;

/*=========================================================================*\
    WICJpegLuminanceProperties
\*=========================================================================*/

typedef [public] enum WICJpegLuminanceProperties
{
    WICJpegLuminanceTable                  = 0x00000001,
    WICJpegLuminanceProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICJpegLuminanceProperties;

/*=========================================================================*\
    WICJpegChrominanceProperties
\*=========================================================================*/

typedef [public] enum WICJpegChrominanceProperties
{
    WICJpegChrominanceTable                  = 0x00000001,
    WICJpegChrominanceProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICJpegChrominanceProperties;

/*=========================================================================*\
    WIC8BIMIptcProperties
\*=========================================================================*/

typedef [public] enum WIC8BIMIptcProperties
{
    WIC8BIMIptcPString                      = 0x00000000,
    WIC8BIMIptcEmbeddedIPTC                 = 0x00000001,
    WIC8BIMIptcProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WIC8BIMIptcProperties;

/*=========================================================================*\
    WIC8BIMResolutionInfoProperties
\*=========================================================================*/

typedef [public] enum WIC8BIMResolutionInfoProperties
{
    WIC8BIMResolutionInfoPString            = 0x00000001,
    WIC8BIMResolutionInfoHResolution        = 0x00000002,
    WIC8BIMResolutionInfoHResolutionUnit    = 0x00000003,
    WIC8BIMResolutionInfoWidthUnit          = 0x00000004,
    WIC8BIMResolutionInfoVResolution        = 0x00000005,
    WIC8BIMResolutionInfoVResolutionUnit    = 0x00000006,
    WIC8BIMResolutionInfoHeightUnit         = 0x00000007,
    WIC8BIMResolutionInfoProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WIC8BIMResolutionInfoProperties;

/*=========================================================================*\
    WIC8BIMIptcDigestProperties
\*=========================================================================*/

typedef [public] enum WIC8BIMIptcDigestProperties
{
    WIC8BIMIptcDigestPString                    = 0x00000001,
    WIC8BIMIptcDigestIptcDigest                 = 0x00000002,
    WIC8BIMIptcDigestProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WIC8BIMIptcDigestProperties;

/*=========================================================================*\
    WICPngGamaProperties
\*=========================================================================*/

typedef [public] enum WICPngGamaProperties
{
    WICPngGamaGamma                  = 0x00000001,
    WICPngGamaProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngGamaProperties;


/*=========================================================================*\
    WICPngBkgdProperties
\*=========================================================================*/

typedef [public] enum WICPngBkgdProperties
{
    WICPngBkgdBackgroundColor        = 0x00000001,
    WICPngBkgdProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngBkgdProperties;


/*=========================================================================*\
    WICPngItxtProperties
\*=========================================================================*/

typedef [public] enum WICPngItxtProperties
{
    WICPngItxtKeyword                = 0x00000001,
    WICPngItxtCompressionFlag        = 0x00000002,
    WICPngItxtLanguageTag            = 0x00000003,
    WICPngItxtTranslatedKeyword      = 0x00000004,
    WICPngItxtText                   = 0x00000005,
    WICPngItxtProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngItxtProperties;


/*=========================================================================*\
    WICPngChrmProperties
\*=========================================================================*/

typedef [public] enum WICPngChrmProperties
{
    WICPngChrmWhitePointX            = 0x00000001,
    WICPngChrmWhitePointY            = 0x00000002,
    WICPngChrmRedX                   = 0x00000003,
    WICPngChrmRedY                   = 0x00000004,
    WICPngChrmGreenX                 = 0x00000005,
    WICPngChrmGreenY                 = 0x00000006,
    WICPngChrmBlueX                  = 0x00000007,
    WICPngChrmBlueY                  = 0x0000008,
    WICPngChrmProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngChrmProperties;


/*=========================================================================*\
    WICPngHistProperties
\*=========================================================================*/

typedef [public] enum WICPngHistProperties
{
    WICPngHistFrequencies            = 0x00000001,
    WICPngHistProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngHistProperties;


/*=========================================================================*\
    WICPngIccpProperties
\*=========================================================================*/

typedef [public] enum WICPngIccpProperties
{
    WICPngIccpProfileName            = 0x00000001,
    WICPngIccpProfileData            = 0x00000002,
    WICPngIccpProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngIccpProperties;


/*=========================================================================*\
    WICPngSrgbProperties
\*=========================================================================*/

typedef [public] enum WICPngSrgbProperties
{
    WICPngSrgbRenderingIntent        = 0x00000001,
    WICPngSrgbProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngSrgbProperties;


/*=========================================================================*\
    WICPngTimeProperties
\*=========================================================================*/

typedef [public] enum WICPngTimeProperties
{
    WICPngTimeYear                   = 0x00000001,
    WICPngTimeMonth                  = 0x00000002,
    WICPngTimeDay                    = 0x00000003,
    WICPngTimeHour                   = 0x00000004,
    WICPngTimeMinute                 = 0x00000005,
    WICPngTimeSecond                 = 0x00000006,
    WICPngTimeProperties_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngTimeProperties;


/*=========================================================================*\
    WICSectionAccessLevel
\*=========================================================================*/

typedef [public] enum WICSectionAccessLevel
{
    WICSectionAccessLevelRead         = 0x00000001,
    WICSectionAccessLevelReadWrite    = 0x00000003,
    WICSectionAccessLevel_FORCE_DWORD = CODEC_FORCE_DWORD
} WICSectionAccessLevel;


/*=========================================================================*\
    WICPixelFormatNumericRepresentation
\*=========================================================================*/

typedef [public] enum WICPixelFormatNumericRepresentation
{
    WICPixelFormatNumericRepresentationUnspecified     = 0x00000000,
    WICPixelFormatNumericRepresentationIndexed         = 0x00000001,
    WICPixelFormatNumericRepresentationUnsignedInteger = 0x00000002,
    WICPixelFormatNumericRepresentationSignedInteger   = 0x00000003,
    WICPixelFormatNumericRepresentationFixed           = 0x00000004,
    WICPixelFormatNumericRepresentationFloat           = 0x00000005,
    WICPixelFormatNumericRepresentation_FORCE_DWORD    = CODEC_FORCE_DWORD
} WICPixelFormatNumericRepresentation;

/*=========================================================================*\
    WICImageParameters
\*=========================================================================*/
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
typedef [public] struct WICImageParameters
{
    D2D1_PIXEL_FORMAT PixelFormat;
    FLOAT DpiX;
    FLOAT DpiY;
    FLOAT Top;
    FLOAT Left;
    UINT32 PixelWidth;
    UINT32 PixelHeight;
} WICImageParameters;
cpp_quote("#endif")

/*=========================================================================*\
    IWICPalette -  Palette
\*=========================================================================*/

[
   object,
   uuid(00000040-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICPalette : IUnknown
{
    // Initialize the palette to one of the pre-defined palette types in
    // the PaletteType enumeration. A transparent color can be included
    // if desired. If the pre-defined palette has fewer than 256 entries,
    // one entry is appended for the transparent color - otherwise index
    // 255 is replaced with the transparent color.

    HRESULT InitializePredefined(
        [in] WICBitmapPaletteType ePaletteType,
        [in] BOOL fAddTransparentColor
        );

    // Build a custom palette. If a transparent color is required it should be
    // included in the array of input colors.

    HRESULT InitializeCustom(
        [in, size_is(cCount)] WICColor *pColors,
        [in] UINT cCount
        );

    // Compute an optimal palette from a given surface. The number of colors to
    // generate is controlled by cColors. If a transparent color is desired,
    // one of the cColors entries will be a transparent color - i.e. the count
    // will not be increased beyond cColors.

    HRESULT InitializeFromBitmap(
        [in] IWICBitmapSource *pISurface,
        [in] UINT cCount,
        [in] BOOL fAddTransparentColor
        );

    // Initialize the palette to be a copy of an existing palette.

    HRESULT InitializeFromPalette(
        [in] IWICPalette *pIPalette
        );

    HRESULT GetType(
        [out] WICBitmapPaletteType *pePaletteType
        );

    HRESULT GetColorCount(
        [out] UINT *pcCount
        );

    HRESULT GetColors(
        [in] UINT cCount,
        [out, size_is(cCount)] WICColor *pColors,
        [out] UINT *pcActualColors
        );

    HRESULT IsBlackWhite(
        [out] BOOL *pfIsBlackWhite
        );

    HRESULT IsGrayscale(
        [out] BOOL *pfIsGrayscale
        );

    HRESULT HasAlpha(
        [out] BOOL *pfHasAlpha
        );
};


/*=========================================================================*\
    IWICBitmapSource -  Source bitmap/imaging functionality
\*=========================================================================*/

[
   object,
   uuid(00000120-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICBitmapSource : IUnknown
{
    HRESULT GetSize(
        [out] UINT *puiWidth,
        [out] UINT *puiHeight
        );

    HRESULT GetPixelFormat(
        [out] WICPixelFormatGUID *pPixelFormat
        );

    HRESULT GetResolution(
        [out] double *pDpiX,
        [out] double *pDpiY
        );

    HRESULT CopyPalette(
        [in] IWICPalette *pIPalette
        );

    HRESULT CopyPixels(
        [in, unique] const WICRect *prc,
        [in] UINT cbStride,
        [in] UINT cbBufferSize,
        [out, size_is(cbBufferSize)] BYTE *pbBuffer
        );
};


/*=========================================================================*\
    IWICFormatConverter
\*=========================================================================*/

[
   object,
   uuid(00000301-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICFormatConverter : IWICBitmapSource
{
    HRESULT Initialize(
        [in] IWICBitmapSource *pISource,
        [in] REFWICPixelFormatGUID dstFormat,
        [in] WICBitmapDitherType dither,
        [in, unique] IWICPalette *pIPalette,
        [in] double alphaThresholdPercent,
        [in] WICBitmapPaletteType paletteTranslate
        );

    HRESULT CanConvert(
        [in] REFWICPixelFormatGUID srcPixelFormat,
        [in] REFWICPixelFormatGUID dstPixelFormat,
        [out] BOOL *pfCanConvert);

};


/*=========================================================================*\
    IWICBitmapScaler
\*=========================================================================*/

[
   object,
   uuid(00000302-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICBitmapScaler : IWICBitmapSource
{
    HRESULT Initialize(
        [in] IWICBitmapSource *pISource,
        [in] UINT uiWidth,
        [in] UINT uiHeight,
        [in] WICBitmapInterpolationMode mode
        );
};


/*=========================================================================*\
    IWICBitmapClipper
\*=========================================================================*/

[
   object,
   uuid(E4FBCF03-223D-4e81-9333-D635556DD1B5)
]
interface IWICBitmapClipper : IWICBitmapSource
{
    HRESULT Initialize(
        [in] IWICBitmapSource *pISource,
        [in] const WICRect *prc
        );
};


/*=========================================================================*\
    IWICBitmapFlipRotator
\*=========================================================================*/

[
   object,
   uuid(5009834F-2D6A-41ce-9E1B-17C5AFF7A782)
]
interface IWICBitmapFlipRotator : IWICBitmapSource
{
    HRESULT Initialize(
        [in] IWICBitmapSource *pISource,
        [in] WICBitmapTransformOptions options
        );
};


/*=========================================================================*\
    IWICBitmapLock - WIC Lock object for bitmaps.
\*=========================================================================*/

[
   object,
   uuid(00000123-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICBitmapLock : IUnknown
{
    HRESULT GetSize(
        [out] UINT *puiWidth,
        [out] UINT *puiHeight
        );

    HRESULT GetStride(
        [out] UINT *pcbStride
        );

    HRESULT GetDataPointer(
        [out] UINT *pcbBufferSize,
        [out, size_is( , *pcbBufferSize)] WICInProcPointer *ppbData
        );

    HRESULT GetPixelFormat(
        [out] WICPixelFormatGUID *pPixelFormat
        );
};


/*=========================================================================*\
    IWICBitmap - WIC Bitmap cache interface
\*=========================================================================*/

[
   object,
   uuid(00000121-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICBitmap : IWICBitmapSource
{
    HRESULT Lock(
        [in, unique] const WICRect *prcLock,
        [in] DWORD flags,
        [out] IWICBitmapLock **ppILock
        );

    HRESULT SetPalette(
        [in] IWICPalette *pIPalette
        );

    HRESULT SetResolution(
        [in] double dpiX,
        [in] double dpiY
        );
};


/*=========================================================================*\
    IWICColorContext - WIC color context
\*=========================================================================*/

[
   object,
   uuid(3C613A02-34B2-44ea-9A7C-45AEA9C6FD6D)
]
interface IWICColorContext : IUnknown
{
    HRESULT InitializeFromFilename(
        [in] LPCWSTR wzFilename
        );

    HRESULT InitializeFromMemory(
        [in, size_is(cbBufferSize)] const BYTE *pbBuffer,
        [in] UINT cbBufferSize
        );

    HRESULT InitializeFromExifColorSpace(
        [in] UINT value
        );

    HRESULT GetType(
        [out] WICColorContextType *pType
        );

    HRESULT GetProfileBytes(
        [in] UINT cbBuffer,
        [in, out, unique, size_is(cbBuffer)] BYTE *pbBuffer,
        [out] UINT *pcbActual
        );

    HRESULT GetExifColorSpace(
        [out] UINT *pValue
        );

};


/*=========================================================================*\
    IWICColorTransform - WIC color transform
\*=========================================================================*/

[
   object,
   uuid(B66F034F-D0E2-40ab-B436-6DE39E321A94)
]
interface IWICColorTransform : IWICBitmapSource
{
    HRESULT Initialize(
         [in] IWICBitmapSource *pIBitmapSource,
         [in] IWICColorContext *pIContextSource,
         [in] IWICColorContext *pIContextDest,
         [in] REFWICPixelFormatGUID pixelFmtDest
         );
};


/*=========================================================================*\
    IWICFastMetadataEncoder
\*=========================================================================*/

[
   object,
   uuid(B84E2C09-78C9-4AC4-8BD3-524AE1663A2F)
]
interface IWICFastMetadataEncoder  : IUnknown
{
    HRESULT Commit(
        );

    HRESULT GetMetadataQueryWriter(
        [out] IWICMetadataQueryWriter **ppIMetadataQueryWriter
        );
};


/*=========================================================================*\
    IWICStream - WIC Bitmap Stream
\*=========================================================================*/

[
   object,
   uuid(135FF860-22B7-4ddf-B0F6-218F4F299A43)
]
interface IWICStream : IStream
{
    HRESULT InitializeFromIStream(
        [in] IStream *pIStream
        );

    HRESULT InitializeFromFilename(
        [in] LPCWSTR wzFileName,
        [in] DWORD dwDesiredAccess
        );

    HRESULT InitializeFromMemory(
        [in, size_is(cbBufferSize)] WICInProcPointer pbBuffer,
        [in] DWORD cbBufferSize
        );

    HRESULT InitializeFromIStreamRegion(
        [in] IStream *pIStream,
        [in] ULARGE_INTEGER ulOffset,
        [in] ULARGE_INTEGER ulMaxSize
        );
};


/*=========================================================================*\
    IWICEnumMetadataItem
\*=========================================================================*/

[
   object,
   uuid(DC2BB46D-3F07-481E-8625-220C4AEDBB33)
]
interface IWICEnumMetadataItem : IUnknown
{
     HRESULT Next(
        [in] ULONG celt,
        [in, out, unique, size_is(celt)] PROPVARIANT *rgeltSchema,
        [in, out, size_is(celt)] PROPVARIANT *rgeltId,
        [in, out, optional, size_is(celt)] PROPVARIANT *rgeltValue,
        [out, optional] ULONG *pceltFetched
        );

    HRESULT Skip(
        [in] ULONG celt
        ) ;

    HRESULT Reset();

    HRESULT Clone(
        [out] IWICEnumMetadataItem **ppIEnumMetadataItem
        );
}


/*=========================================================================*\
    IWICMetadataQueryReader - Metadata Query Reader
\*=========================================================================*/

[
   object,
   uuid(30989668-E1C9-4597-B395-458EEDB808DF)
]
interface IWICMetadataQueryReader : IUnknown
{
    HRESULT GetContainerFormat(
        [out] GUID *pguidContainerFormat
        );

    HRESULT GetLocation(
        [in] UINT cchMaxLength,
        [in, out, unique, size_is(cchMaxLength)] WCHAR *wzNamespace,
        [out] UINT *pcchActualLength
        );

    HRESULT GetMetadataByName(
        [in] LPCWSTR wzName,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetEnumerator(
        [out] IEnumString **ppIEnumString
        );
}


/*=========================================================================*\
    IWICMetadataQueryWriter - Metadata Query Writer
\*=========================================================================*/

[
   object,
   uuid(A721791A-0DEF-4d06-BD91-2118BF1DB10B)
]
interface IWICMetadataQueryWriter : IWICMetadataQueryReader
{
    HRESULT SetMetadataByName(
       [in] LPCWSTR wzName,
       [in] const PROPVARIANT *pvarValue
       );

    HRESULT RemoveMetadataByName(
       [in] LPCWSTR wzName
       );
}


/*=========================================================================*\
    IWICBitmapEncoder -  Bitmap Encoder
\*=========================================================================*/

[
   object,
   uuid(00000103-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICBitmapEncoder : IUnknown
{
    HRESULT Initialize(
        [in] IStream *pIStream,
        [in] WICBitmapEncoderCacheOption cacheOption
        );

    HRESULT GetContainerFormat(
        [out] GUID *pguidContainerFormat
        );

    HRESULT GetEncoderInfo(
        [out] IWICBitmapEncoderInfo **ppIEncoderInfo
        );

    HRESULT SetColorContexts(
        [in] UINT cCount,
        [in, size_is(cCount)] IWICColorContext **ppIColorContext
        );

    HRESULT SetPalette(
        [in] IWICPalette *pIPalette
        );

    HRESULT SetThumbnail(
        [in] IWICBitmapSource *pIThumbnail
        );

    HRESULT SetPreview(
        [in] IWICBitmapSource *pIPreview
        );

    HRESULT CreateNewFrame(
        [out] IWICBitmapFrameEncode **ppIFrameEncode,
        [in, out, unique] IPropertyBag2 **ppIEncoderOptions
        );

    HRESULT Commit(
        );

    HRESULT GetMetadataQueryWriter(
        [out] IWICMetadataQueryWriter **ppIMetadataQueryWriter
        );
};


/*=========================================================================*\
    IWICBitmapFrameEncode -  Bitmap Frame Encoder
\*=========================================================================*/

[
   object,
   uuid(00000105-a8f2-4877-ba0a-fd2b6645fb94)
]
interface IWICBitmapFrameEncode : IUnknown
{
    HRESULT Initialize(
        [in, unique] IPropertyBag2 *pIEncoderOptions
        );

    HRESULT SetSize(
        [in] UINT uiWidth,
        [in] UINT uiHeight
        );

    HRESULT SetResolution(
        [in] double dpiX,
        [in] double dpiY
        );

    HRESULT SetPixelFormat(
        [in, out] WICPixelFormatGUID *pPixelFormat
        );

    HRESULT SetColorContexts(
        [in] UINT cCount,
        [in, size_is(cCount)] IWICColorContext **ppIColorContext
        );

    HRESULT SetPalette(
        [in] IWICPalette *pIPalette
        );

    HRESULT SetThumbnail(
        [in] IWICBitmapSource *pIThumbnail
        );

    HRESULT WritePixels(
        [in] UINT lineCount,
        [in] UINT cbStride,
        [in] UINT cbBufferSize,
        [in, size_is(cbBufferSize)] BYTE *pbPixels
        );

    HRESULT WriteSource(
        [in] IWICBitmapSource *pIBitmapSource,
        [in, unique] WICRect *prc
        );

    HRESULT Commit(
        );

    HRESULT GetMetadataQueryWriter(
        [out] IWICMetadataQueryWriter **ppIMetadataQueryWriter
        );
};

/*=========================================================================*\
    IWICImageEncoder -  ID2D1Image Encoder 
\*=========================================================================*/
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
[
    object,
    uuid(04C75BF8-3CE1-473B-ACC5-3CC4F5E94999),
    local
]
interface IWICImageEncoder : IUnknown
{
    HRESULT WriteFrame(
        [in] ID2D1Image *pImage,
        [in] IWICBitmapFrameEncode *pFrameEncode,
        [in, unique] const WICImageParameters *pImageParameters
        );

    HRESULT WriteFrameThumbnail(
        [in] ID2D1Image *pImage,
        [in] IWICBitmapFrameEncode *pFrameEncode,
        [in, unique] const WICImageParameters *pImageParameters
        );

    HRESULT WriteThumbnail(
        [in] ID2D1Image *pImage,
        [in] IWICBitmapEncoder *pEncoder,
        [in, unique] const WICImageParameters *pImageParameters
        );
};
cpp_quote("#endif")

/*=========================================================================*\
    IWICBitmapDecoder -  Bitmap Decoder
\*=========================================================================*/

[
   object,
   uuid(9EDDE9E7-8DEE-47ea-99DF-E6FAF2ED44BF)
]
interface IWICBitmapDecoder : IUnknown
{
    HRESULT QueryCapability(
        [in] IStream *pIStream,
        [out] DWORD *pdwCapability
        );

    HRESULT Initialize(
        [in] IStream *pIStream,
        [in] WICDecodeOptions cacheOptions
        );

    HRESULT GetContainerFormat(
        [out] GUID *pguidContainerFormat
        );

    HRESULT GetDecoderInfo(
        [out] IWICBitmapDecoderInfo **ppIDecoderInfo
        );

    HRESULT CopyPalette(
        [in] IWICPalette *pIPalette
        );

    HRESULT GetMetadataQueryReader(
        [out] IWICMetadataQueryReader **ppIMetadataQueryReader
        );

    HRESULT GetPreview(
        [out] IWICBitmapSource **ppIBitmapSource
        );

    HRESULT GetColorContexts(
        [in] UINT cCount,
        [in, out, unique, size_is(cCount)]  IWICColorContext **ppIColorContexts,
        [out] UINT *pcActualCount);


    HRESULT GetThumbnail(
        [out] IWICBitmapSource **ppIThumbnail
        );

    HRESULT GetFrameCount(
        [out] UINT *pCount
        );

    HRESULT GetFrame(
        [in] UINT index,
        [out] IWICBitmapFrameDecode **ppIBitmapFrame
        );
};


/*=========================================================================*\
    IWICBitmapSourceTransform
\*=========================================================================*/

[
   object,
   uuid(3B16811B-6A43-4ec9-B713-3D5A0C13B940)
]
interface IWICBitmapSourceTransform : IUnknown
{
    HRESULT CopyPixels(
       [in, unique] const WICRect *prc,
       [in] UINT uiWidth,
       [in] UINT uiHeight,
       [in, unique] WICPixelFormatGUID *pguidDstFormat,
       [in] WICBitmapTransformOptions dstTransform,
       [in] UINT nStride,
       [in] UINT cbBufferSize,
       [out, size_is(cbBufferSize)] BYTE *pbBuffer
       );

    HRESULT GetClosestSize(
       [in, out] UINT *puiWidth,
       [in, out] UINT *puiHeight
       );

    HRESULT GetClosestPixelFormat(
       [in, out] WICPixelFormatGUID *pguidDstFormat
       );

    HRESULT DoesSupportTransform(
       [in] WICBitmapTransformOptions dstTransform,
       [out] BOOL *pfIsSupported
       );
};


/*=========================================================================*\
    IWICBitmapFrameDecode -  Bitmap Decoder
\*=========================================================================*/

[
   object,
   uuid(3B16811B-6A43-4ec9-A813-3D930C13B940)
]
interface IWICBitmapFrameDecode : IWICBitmapSource
{
   HRESULT GetMetadataQueryReader(
       [out] IWICMetadataQueryReader **ppIMetadataQueryReader
       );

   HRESULT GetColorContexts(
        [in] UINT cCount,
        [in, out, unique, size_is(cCount)]  IWICColorContext **ppIColorContexts,
        [out] UINT *pcActualCount);

   HRESULT GetThumbnail(
       [out] IWICBitmapSource **ppIThumbnail
       );
};


/*=========================================================================*\
    IWICProgressiveLevelControl -  Progressive Decoding
\*=========================================================================*/

[
    object,
    uuid(DAAC296F-7AA5-4dbf-8D15-225C5976F891)
]
interface IWICProgressiveLevelControl : IUnknown
{
    HRESULT GetLevelCount( 
        [out, retval] UINT * pcLevels 
        );

    HRESULT GetCurrentLevel(
        [out, retval] UINT * pnLevel
        );

    HRESULT SetCurrentLevel(
        [in] UINT nLevel
        );
}


/*=========================================================================*\
    IWICProgressCallback - Cross apartment callback interface
\*=========================================================================*/

[
   object,
   uuid(4776F9CD-9517-45FA-BF24-E89C5EC5C60C)
]
interface IWICProgressCallback : IUnknown
{
    HRESULT Notify(
        [in] ULONG uFrameNum,
        [in] WICProgressOperation operation,
        [in] double dblProgress
        );
}


/*=========================================================================*\
    IWICBitmapCodecProgressNotification - Register Progress Notifications
\*=========================================================================*/

[
   object,
   uuid(64C1024E-C3CF-4462-8078-88C2B11C46D9)
]
interface IWICBitmapCodecProgressNotification : IUnknown
{
    typedef [unique] HRESULT __stdcall (*PFNProgressNotification)(
        LPVOID pvData,
        ULONG uFrameNum,
        WICProgressOperation operation,
        double dblProgress
        );

    [local]
    HRESULT RegisterProgressNotification(
            [in, unique, annotation("_In_opt_")] PFNProgressNotification pfnProgressNotification,
            [in, unique, annotation("_In_opt_")] LPVOID pvData,
            [in] DWORD dwProgressFlags /* WICProgressOperation | WICProgressNotification */
            );

    [call_as(RegisterProgressNotification)]
    HRESULT Remote_RegisterProgressNotification(
        [in, unique] IWICProgressCallback *pICallback,
        [in] DWORD dwProgressFlags
        );
};


/*=========================================================================*\
    IWICComponentInfo
\*=========================================================================*/

[
   object,
   uuid(23BC3F0A-698B-4357-886B-F24D50671334)
]
interface IWICComponentInfo : IUnknown
{
    HRESULT GetComponentType(
        [out] WICComponentType *pType
        );

    HRESULT GetCLSID(
        [out] CLSID *pclsid
        );

    HRESULT GetSigningStatus(
        [out] DWORD * pStatus   // WICComponentSigning flags
        );

    HRESULT GetAuthor(
        [in] UINT cchAuthor,
        [in, out, unique, size_is(cchAuthor)] WCHAR *wzAuthor,
        [out] UINT *pcchActual
        );

    HRESULT GetVendorGUID(
        [out] GUID *pguidVendor
        );

    HRESULT GetVersion(
        [in] UINT cchVersion,
        [in, out, unique, size_is(cchVersion)] WCHAR *wzVersion,
        [out]  UINT *pcchActual
        );

    HRESULT GetSpecVersion(
        [in] UINT cchSpecVersion,
        [in, out, unique, size_is(cchSpecVersion)] WCHAR *wzSpecVersion,
        [out] UINT *pcchActual
        );

    HRESULT GetFriendlyName(
        [in] UINT cchFriendlyName,
        [in, out, unique, size_is(cchFriendlyName)] WCHAR *wzFriendlyName,
        [out] UINT *pcchActual
        );
};


/*=========================================================================*\
    IWICFormatConverterInfo
\*=========================================================================*/

[
   object,
   uuid(9F34FB65-13F4-4f15-BC57-3726B5E53D9F)
]
interface IWICFormatConverterInfo : IWICComponentInfo
{
    HRESULT GetPixelFormats(
        [in] UINT cFormats,
        [in, out, unique, size_is(cFormats)] WICPixelFormatGUID * pPixelFormatGUIDs,
        [out] UINT *pcActual);

    HRESULT CreateInstance(
        [out] IWICFormatConverter **ppIConverter);
}


/*=========================================================================*\
    IWICBitmapCodecInfo
\*=========================================================================*/

[
   object,
   uuid(E87A44C4-B76E-4c47-8B09-298EB12A2714)
]
interface IWICBitmapCodecInfo : IWICComponentInfo
{
    HRESULT GetContainerFormat(
        [out] GUID *pguidContainerFormat
        );

    HRESULT GetPixelFormats(
        [in] UINT cFormats,
        [in, out, unique, size_is(cFormats)] GUID *pguidPixelFormats,
        [out] UINT *pcActual);

    HRESULT GetColorManagementVersion(
        [in] UINT cchColorManagementVersion,
        [in, out, unique, size_is(cchColorManagementVersion)] WCHAR *wzColorManagementVersion,
        [out] UINT *pcchActual
        );

    HRESULT GetDeviceManufacturer(
        [in] UINT cchDeviceManufacturer,
        [in, out, unique, size_is(cchDeviceManufacturer)] WCHAR *wzDeviceManufacturer,
        [out] UINT *pcchActual
        );

    HRESULT GetDeviceModels(
        [in] UINT cchDeviceModels,
        [in, out, unique, size_is(cchDeviceModels)] WCHAR *wzDeviceModels,
        [out] UINT *pcchActual
        );

    HRESULT GetMimeTypes(
        [in] UINT cchMimeTypes,
        [in, out, unique, size_is(cchMimeTypes)] WCHAR *wzMimeTypes,
        [out] UINT *pcchActual
        );

    HRESULT GetFileExtensions(
        [in] UINT cchFileExtensions,
        [in, out, unique, size_is(cchFileExtensions)] WCHAR *wzFileExtensions,
        [out] UINT *pcchActual
        );

    HRESULT DoesSupportAnimation(
        [out] BOOL *pfSupportAnimation
        );

    HRESULT DoesSupportChromakey(
        [out] BOOL *pfSupportChromakey
        );

    HRESULT DoesSupportLossless(
        [out] BOOL *pfSupportLossless
        );

    HRESULT DoesSupportMultiframe(
        [out] BOOL *pfSupportMultiframe
        );

    HRESULT MatchesMimeType(
        [in] LPCWSTR wzMimeType,
        [out] BOOL *pfMatches
        );
};


/*=========================================================================*\
    IWICBitmapEncoderInfo
\*=========================================================================*/

[
   object,
   uuid(94C9B4EE-A09F-4f92-8A1E-4A9BCE7E76FB)
]
interface IWICBitmapEncoderInfo : IWICBitmapCodecInfo
{
    HRESULT CreateInstance(
        [out] IWICBitmapEncoder **ppIBitmapEncoder
        );
};


/*=========================================================================*\
    IWICBitmapDecoderInfo
\*=========================================================================*/

[
   object,
   uuid(D8CD007F-D08F-4191-9BFC-236EA7F0E4B5)
]
interface IWICBitmapDecoderInfo : IWICBitmapCodecInfo
{
    [local]
    HRESULT GetPatterns(
        [in] UINT cbSizePatterns,
        [out, size_is(*pcPatterns), unique, annotation("_Out_writes_bytes_to_opt_(cbSizePatterns, *pcbPatternsActual)")] WICBitmapPattern *pPatterns,
        [out, unique, annotation("_Inout_opt_")] UINT *pcPatterns,
        [out, annotation("_Inout_opt_")] UINT *pcbPatternsActual
        );

    [call_as(GetPatterns)]
    HRESULT Remote_GetPatterns(
        [out, size_is(, *pcPatterns)] WICBitmapPattern **ppPatterns,
        [out] UINT *pcPatterns 
        );

    HRESULT MatchesPattern(
        [in] IStream *pIStream,
        [out] BOOL *pfMatches
        );

    HRESULT CreateInstance(
        [out] IWICBitmapDecoder **ppIBitmapDecoder
        );
};


/*=========================================================================*\
    IWICPixelFormatInfo
\*=========================================================================*/

[
   object,
   uuid(E8EDA601-3D48-431a-AB44-69059BE88BBE)
]
interface IWICPixelFormatInfo : IWICComponentInfo
{
    HRESULT GetFormatGUID(
        [out] GUID* pFormat
        );

    HRESULT GetColorContext(
        [out] IWICColorContext **ppIColorContext
        );

    HRESULT GetBitsPerPixel(
        [out] UINT *puiBitsPerPixel
        );

    HRESULT GetChannelCount(
        [out] UINT *puiChannelCount
        );

    HRESULT GetChannelMask(
        [in] UINT uiChannelIndex,
        [in] UINT cbMaskBuffer,
        [in, out, unique, size_is(cbMaskBuffer)] BYTE *pbMaskBuffer,
        [out] UINT *pcbActual
        );
}


/*=========================================================================*\
    IWICPixelFormatInfo2
\*=========================================================================*/

[
   object,
   uuid(A9DB33A2-AF5F-43C7-B679-74F5984B5AA4)
]
interface IWICPixelFormatInfo2 : IWICPixelFormatInfo
{
    HRESULT SupportsTransparency(
        [out] BOOL *pfSupportsTransparency
        );

    HRESULT GetNumericRepresentation(
        [out] WICPixelFormatNumericRepresentation *pNumericRepresentation
        );
}


/*=========================================================================*\
    IWICImagingFactory
\*=========================================================================*/

[
   object,
   uuid(ec5ec8a9-c395-4314-9c77-54d7a935ff70)
]
interface IWICImagingFactory : IUnknown
{
    HRESULT CreateDecoderFromFilename(
        [in] LPCWSTR wzFilename,
        [in, unique] const GUID *pguidVendor,
        [in]  DWORD dwDesiredAccess,
        [in] WICDecodeOptions metadataOptions,
        [out, retval] IWICBitmapDecoder **ppIDecoder
        );

    HRESULT CreateDecoderFromStream(
        [in] IStream *pIStream,
        [in, unique] const GUID *pguidVendor,
        [in] WICDecodeOptions metadataOptions,
        [out, retval] IWICBitmapDecoder **ppIDecoder
        );

    HRESULT CreateDecoderFromFileHandle(
        [in] ULONG_PTR hFile,
        [in, unique] const GUID *pguidVendor,
        [in] WICDecodeOptions metadataOptions,
        [out, retval] IWICBitmapDecoder **ppIDecoder
        );

    HRESULT CreateComponentInfo(
        [in] REFCLSID clsidComponent,
        [out] IWICComponentInfo **ppIInfo
        );

    HRESULT CreateDecoder(
        [in] REFGUID guidContainerFormat,
        [in, unique] const GUID *pguidVendor,
        [out, retval] IWICBitmapDecoder **ppIDecoder
        );

    HRESULT CreateEncoder(
        [in] REFGUID guidContainerFormat,
        [in, unique] const GUID *pguidVendor,
        [out, retval] IWICBitmapEncoder **ppIEncoder
        );

    HRESULT CreatePalette(
        [out] IWICPalette **ppIPalette
        );

    HRESULT CreateFormatConverter(
        [out] IWICFormatConverter **ppIFormatConverter
        );

    HRESULT CreateBitmapScaler(
        [out] IWICBitmapScaler **ppIBitmapScaler
        );

    HRESULT CreateBitmapClipper(
        [out] IWICBitmapClipper **ppIBitmapClipper
        );

    HRESULT CreateBitmapFlipRotator(
        [out] IWICBitmapFlipRotator **ppIBitmapFlipRotator
        );

    HRESULT CreateStream(
        [out] IWICStream **ppIWICStream
        );

    HRESULT CreateColorContext(
        [out] IWICColorContext **ppIWICColorContext
        );

    HRESULT CreateColorTransformer(
        [out] IWICColorTransform **ppIWICColorTransform
        );

    /* Bitmap creation */

    HRESULT CreateBitmap(
        [in] UINT uiWidth,
        [in] UINT uiHeight,
        [in] REFWICPixelFormatGUID pixelFormat,
        [in] WICBitmapCreateCacheOption option,
        [out] IWICBitmap **ppIBitmap
        );

    HRESULT CreateBitmapFromSource(
        [in] IWICBitmapSource *pIBitmapSource,
        [in] WICBitmapCreateCacheOption option,
        [out] IWICBitmap **ppIBitmap
        );

    HRESULT CreateBitmapFromSourceRect(
        [in] IWICBitmapSource *pIBitmapSource,
        [in] UINT x,
        [in] UINT y,
        [in] UINT width,
        [in] UINT height,
        [out] IWICBitmap **ppIBitmap
        );

    HRESULT CreateBitmapFromMemory(
        [in] UINT uiWidth,
        [in] UINT uiHeight,
        [in] REFWICPixelFormatGUID pixelFormat,
        [in] UINT cbStride,
        [in] UINT cbBufferSize,
        [in, size_is(cbBufferSize)] BYTE *pbBuffer,
        [out] IWICBitmap **ppIBitmap
        );

    HRESULT CreateBitmapFromHBITMAP(
        [in] HBITMAP hBitmap,
        [in, unique] HPALETTE hPalette,
        [in] WICBitmapAlphaChannelOption options,
        [out] IWICBitmap **ppIBitmap
        );

    HRESULT CreateBitmapFromHICON(
        [in] HICON hIcon,
        [out] IWICBitmap **ppIBitmap
        );

    HRESULT CreateComponentEnumerator(
        [in] DWORD componentTypes,           /* WICComponentType */
        [in] DWORD options,                  /* WICComponentEnumerateOptions */
        [out] IEnumUnknown **ppIEnumUnknown
        );

    HRESULT CreateFastMetadataEncoderFromDecoder(
        [in] IWICBitmapDecoder *pIDecoder,
        [out] IWICFastMetadataEncoder **ppIFastEncoder
        );

    HRESULT CreateFastMetadataEncoderFromFrameDecode(
        [in] IWICBitmapFrameDecode *pIFrameDecoder,
        [out] IWICFastMetadataEncoder **ppIFastEncoder
        );

    HRESULT CreateQueryWriter(
        [in] REFGUID guidMetadataFormat,
        [in, unique] const GUID *pguidVendor,
        [out] IWICMetadataQueryWriter **ppIQueryWriter
        );

    HRESULT CreateQueryWriterFromReader(
        [in] IWICMetadataQueryReader *pIQueryReader,
        [in, unique] const GUID *pguidVendor,
        [out] IWICMetadataQueryWriter **ppIQueryWriter
        );
};

/*=========================================================================*\
    IWICImagingFactory2
\*=========================================================================*/
cpp_quote("#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)")
[
   object,
   uuid(7B816B45-1996-4476-B132-DE9E247C8AF0),
   local
]
interface IWICImagingFactory2 : IWICImagingFactory
{
    HRESULT CreateImageEncoder(
        [in] ID2D1Device *pD2DDevice,
        [out] IWICImageEncoder **ppWICImageEncoder
        );
};
cpp_quote("#endif")

/*=========================================================================*\
    APIs
\*=========================================================================*/

cpp_quote("HRESULT WINAPI WICConvertBitmapSource(" )
cpp_quote("     _In_ REFWICPixelFormatGUID dstFormat, // Destination pixel format" )
cpp_quote("     _In_reads_(1) IWICBitmapSource  *pISrc,    // Source bitmap" )
cpp_quote("     _Outptr_result_buffer_(1) IWICBitmapSource **ppIDst   // Destination bitmap, a copy or addrefed source" )
cpp_quote("     );" )

cpp_quote("HRESULT WINAPI WICCreateBitmapFromSection(" )
cpp_quote("     _In_ UINT width," )
cpp_quote("     _In_ UINT height," )
cpp_quote("     _In_ REFWICPixelFormatGUID pixelFormat," )
cpp_quote("     _In_ HANDLE hSection," )
cpp_quote("     _In_ UINT stride," )
cpp_quote("     _In_ UINT offset," )
cpp_quote("     _Outptr_result_buffer_(1) IWICBitmap **ppIBitmap" )
cpp_quote("     );" )

cpp_quote("HRESULT WINAPI WICCreateBitmapFromSectionEx(" )
cpp_quote("     _In_ UINT width," )
cpp_quote("     _In_ UINT height," )
cpp_quote("     _In_ REFWICPixelFormatGUID pixelFormat," )
cpp_quote("     _In_ HANDLE hSection," )
cpp_quote("     _In_ UINT stride," )
cpp_quote("     _In_ UINT offset," )
cpp_quote("     _In_ WICSectionAccessLevel desiredAccessLevel," )
cpp_quote("     _Outptr_result_buffer_(1) IWICBitmap **ppIBitmap" )
cpp_quote("     );" )

cpp_quote("HRESULT WINAPI WICMapGuidToShortName(")
cpp_quote("    _In_reads_(1) REFGUID guid,")
cpp_quote("    _In_ UINT cchName,")
cpp_quote("    _Inout_updates_opt_(cchName) WCHAR *wzName,")
cpp_quote("    _Out_writes_(1) UINT *pcchActual")
cpp_quote("   );")

cpp_quote("HRESULT WINAPI WICMapShortNameToGuid(")
cpp_quote("    _In_ PCWSTR wzName,")
cpp_quote("    _Out_ GUID *pguid")
cpp_quote("   );")

cpp_quote("HRESULT WINAPI WICMapSchemaToName(")
cpp_quote("    _In_reads_(1) REFGUID guidMetadataFormat,")
cpp_quote("    _In_reads_(1) LPWSTR pwzSchema,")
cpp_quote("    _In_ UINT cchName,")
cpp_quote("    _Inout_updates_opt_(cchName) WCHAR *wzName,")
cpp_quote("    _Out_writes_(1) UINT *pcchActual")
cpp_quote("    );")


/*=========================================================================*\
    Errors
\*=========================================================================*/

cpp_quote("#define FACILITY_WINCODEC_ERR 0x898")
cpp_quote("#define WINCODEC_ERR_BASE 0x2000")

cpp_quote("#define MAKE_WINCODECHR(sev, code) MAKE_HRESULT(sev, FACILITY_WINCODEC_ERR, (WINCODEC_ERR_BASE + code))")
cpp_quote("#define MAKE_WINCODECHR_ERR(code) MAKE_WINCODECHR(1, code)")

cpp_quote("#define WINCODEC_ERR_GENERIC_ERROR                    E_FAIL")
cpp_quote("#define WINCODEC_ERR_INVALIDPARAMETER                 E_INVALIDARG")
cpp_quote("#define WINCODEC_ERR_OUTOFMEMORY                      E_OUTOFMEMORY")
cpp_quote("#define WINCODEC_ERR_NOTIMPLEMENTED                   E_NOTIMPL")
cpp_quote("#define WINCODEC_ERR_ABORTED                          E_ABORT")
cpp_quote("#define WINCODEC_ERR_ACCESSDENIED                     E_ACCESSDENIED")
cpp_quote("#define WINCODEC_ERR_VALUEOVERFLOW                    INTSAFE_E_ARITHMETIC_OVERFLOW")

/* WinCodec errors have moved to winerror.h */


/*=========================================================================*\
    Parameter Structures
\*=========================================================================*/


/*=========================================================================*\
    WICTiffCompressionOption
\*=========================================================================*/

typedef [public] enum WICTiffCompressionOption
{
    WICTiffCompressionDontCare           = 0x00000000,
    WICTiffCompressionNone               = 0x00000001,
    WICTiffCompressionCCITT3             = 0x00000002,
    WICTiffCompressionCCITT4             = 0x00000003,
    WICTiffCompressionLZW                = 0x00000004,
    WICTiffCompressionRLE                = 0x00000005,
    WICTiffCompressionZIP                = 0x00000006,
    WICTiffCompressionLZWHDifferencing   = 0x00000007,
    WICTIFFCOMPRESSIONOPTION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICTiffCompressionOption;

/*=========================================================================*\
    WICJpegYCrCbSubsamplingOption
\*=========================================================================*/

typedef [public] enum WICJpegYCrCbSubsamplingOption
{
    WICJpegYCrCbSubsamplingDefault      = 0x00000000,
    WICJpegYCrCbSubsampling420          = 0x00000001,
    WICJpegYCrCbSubsampling422          = 0x00000002,
    WICJpegYCrCbSubsampling444          = 0x00000003,
    WICJPEGYCRCBSUBSAMPLING_FORCE_DWORD = CODEC_FORCE_DWORD
} WICJpegYCrCbSubsamplingOption;


/*=========================================================================*\
    WICPngFilterOption
\*=========================================================================*/

typedef [public] enum WICPngFilterOption
{
    WICPngFilterUnspecified        = 0x00000000,
    WICPngFilterNone               = 0x00000001,
    WICPngFilterSub                = 0x00000002,
    WICPngFilterUp                 = 0x00000003,
    WICPngFilterAverage            = 0x00000004,
    WICPngFilterPaeth              = 0x00000005,
    WICPngFilterAdaptive           = 0x00000006,
    WICPNGFILTEROPTION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICPngFilterOption;


/*=========================================================================*\
    Raw Structures and Interfaces
\*=========================================================================*/


/*=========================================================================*\
    WICNamedWhitePoint
\*=========================================================================*/

typedef [public] enum WICNamedWhitePoint
{
    WICWhitePointDefault           = 0x00000001,
    WICWhitePointDaylight          = 0x00000002,
    WICWhitePointCloudy            = 0x00000004,
    WICWhitePointShade             = 0x00000008,
    WICWhitePointTungsten          = 0x00000010,
    WICWhitePointFluorescent       = 0x00000020,
    WICWhitePointFlash             = 0x00000040,
    WICWhitePointUnderwater        = 0x00000080,
    WICWhitePointCustom            = 0x00000100,   // when using a picture (grey-card) as white-balance
    WICWhitePointAutoWhiteBalance  = 0x00000200,
    WICWhitePointAsShot            = WICWhitePointDefault,
    WICNAMEDWHITEPOINT_FORCE_DWORD = CODEC_FORCE_DWORD
} WICNamedWhitePoint;


/*=========================================================================*\
    WICRawCapabilities
\*=========================================================================*/

typedef [public] enum WICRawCapabilities
{
    WICRawCapabilityNotSupported   = 0x00000000,
    WICRawCapabilityGetSupported   = 0x00000001,
    WICRawCapabilityFullySupported = 0x00000002,    // Get & Set supported
    WICRAWCAPABILITIES_FORCE_DWORD = CODEC_FORCE_DWORD
} WICRawCapabilities;


/*=========================================================================*\
    WICRawRotationCapabilities
\*=========================================================================*/

typedef [public] enum WICRawRotationCapabilities
{
    WICRawRotationCapabilityNotSupported           = 0x00000000,
    WICRawRotationCapabilityGetSupported           = 0x00000001,
    WICRawRotationCapabilityNinetyDegreesSupported = 0x00000002,    // Get & Set supported.  Only multiple of 90 degree angles supported.
    WICRawRotationCapabilityFullySupported         = 0x00000003,    // Get & Set supported.  Any rotation angle supported.
    WICRAWROTATIONCAPABILITIES_FORCE_DWORD         = CODEC_FORCE_DWORD
} WICRawRotationCapabilities;


/*=========================================================================*\
    WICRawCapabilitesInfo
\*=========================================================================*/

typedef [public] struct WICRawCapabilitiesInfo
{
    UINT                        cbSize;
    UINT                        CodecMajorVersion;
    UINT                        CodecMinorVersion;
    WICRawCapabilities          ExposureCompensationSupport;
    WICRawCapabilities          ContrastSupport;
    WICRawCapabilities          RGBWhitePointSupport;
    WICRawCapabilities          NamedWhitePointSupport;
    UINT                        NamedWhitePointSupportMask;
    WICRawCapabilities          KelvinWhitePointSupport;
    WICRawCapabilities          GammaSupport;
    WICRawCapabilities          TintSupport;
    WICRawCapabilities          SaturationSupport;
    WICRawCapabilities          SharpnessSupport;
    WICRawCapabilities          NoiseReductionSupport;
    WICRawCapabilities          DestinationColorProfileSupport;
    WICRawCapabilities          ToneCurveSupport;
    WICRawRotationCapabilities  RotationSupport;
    WICRawCapabilities          RenderModeSupport;
} WICRawCapabilitiesInfo;


/*=========================================================================*\
    WICRawParameterSet
\*=========================================================================*/

typedef [public] enum WICRawParameterSet
{
    WICAsShotParameterSet          = 0x00000001,
    WICUserAdjustedParameterSet    = 0x00000002,
    WICAutoAdjustedParameterSet    = 0x00000003,
    WICRAWPARAMETERSET_FORCE_DWORD = CODEC_FORCE_DWORD
} WICRawParameterSet;


/*=========================================================================*\
    WICRawRenderMode
\*=========================================================================*/

typedef [public] enum WICRawRenderMode
{
    WICRawRenderModeDraft        = 0x00000001,   // Favor speed over quality
    WICRawRenderModeNormal       = 0x00000002,   // Balance speed with quality
    WICRawRenderModeBestQuality  = 0x00000003,   // Favor quality over speed
    WICRAWRENDERMODE_FORCE_DWORD = CODEC_FORCE_DWORD
} WICRawRenderMode;


/*=========================================================================*\
    WICRawToneCurvePoint
\*=========================================================================*/

typedef [public] struct WICRawToneCurvePoint
{
    double  Input;
    double  Output;
} WICRawToneCurvePoint;


/*=========================================================================*\
    WICRawToneCurve
\*=========================================================================*/

typedef [public] struct WICRawToneCurve
{
    UINT                    cPoints;
    WICRawToneCurvePoint    aPoints[1];
} WICRawToneCurve;


/*=========================================================================*\
    IWICDevelopRawNotificationCallback
\*=========================================================================*/

cpp_quote("#define WICRawChangeNotification_ExposureCompensation       0x00000001")
cpp_quote("#define WICRawChangeNotification_NamedWhitePoint            0x00000002")
cpp_quote("#define WICRawChangeNotification_KelvinWhitePoint           0x00000004")
cpp_quote("#define WICRawChangeNotification_RGBWhitePoint              0x00000008")
cpp_quote("#define WICRawChangeNotification_Contrast                   0x00000010")
cpp_quote("#define WICRawChangeNotification_Gamma                      0x00000020")
cpp_quote("#define WICRawChangeNotification_Sharpness                  0x00000040")
cpp_quote("#define WICRawChangeNotification_Saturation                 0x00000080")
cpp_quote("#define WICRawChangeNotification_Tint                       0x00000100")
cpp_quote("#define WICRawChangeNotification_NoiseReduction             0x00000200")
cpp_quote("#define WICRawChangeNotification_DestinationColorContext    0x00000400")
cpp_quote("#define WICRawChangeNotification_ToneCurve                  0x00000800")
cpp_quote("#define WICRawChangeNotification_Rotation                   0x00001000")
cpp_quote("#define WICRawChangeNotification_RenderMode                 0x00002000")

[
    object,
    uuid(95c75a6e-3e8c-4ec2-85a8-aebcc551e59b)
]
interface IWICDevelopRawNotificationCallback : IUnknown
{
    // Called when one of the parameters in IWICDevelopRaw gets changed or updated.
    // Notification mask is a bitmask constructed from the WICRawChangeNotification_*
    // values to specify which parameter(s) changed.  Return S_OK if the notification
    // is handled, or a descriptive error if not.

    HRESULT Notify([in] UINT NotificationMask);
}


/*=========================================================================*\
    IWICDevelopRaw -  Raw Develop
\*=========================================================================*/

[
   object,
   uuid(fbec5e44-f7be-4b65-b7f8-c0c81fef026d)
]
interface IWICDevelopRaw : IWICBitmapFrameDecode
{
    // Return the set of supported capabilities for this raw file

    [local] 
    HRESULT QueryRawCapabilitiesInfo(
        [in, out] WICRawCapabilitiesInfo *pInfo
        );

    [call_as(QueryRawCapabilitiesInfo)]
    HRESULT Remote_QueryRawCapabilitiesInfo(
        [in, out] WICRawCapabilitiesInfo *pInfo
        );


    // Load the desired parameter set as the current
    // working parameter set

    HRESULT LoadParameterSet(
        [in] WICRawParameterSet ParameterSet
        );

    // Get an IPropertyBag2 that contains the current
    // parameters to hand off to the encoder for saving

    HRESULT GetCurrentParameterSet(
        [out] IPropertyBag2 **ppCurrentParameterSet
        );

    // Set/Get the exposure compensation desired for final output
    // Valid range for ev is -5.0 to +5.0 (stops)

    HRESULT SetExposureCompensation(
        [in] double ev
        );

    HRESULT GetExposureCompensation(
        [out] double *pEV
        );

    // Get/Set the white point as an RGB value.

    HRESULT SetWhitePointRGB(
        [in] UINT Red,
        [in] UINT Green,
        [in] UINT Blue
        );

    HRESULT GetWhitePointRGB(
        [out] UINT *pRed,
        [out] UINT *pGreen,
        [out] UINT *pBlue
        );

    // Set/Get white point as a preset named value

    HRESULT SetNamedWhitePoint(
        [in] WICNamedWhitePoint WhitePoint
        );

    HRESULT GetNamedWhitePoint(
        [out] WICNamedWhitePoint *pWhitePoint
        );

    // Set the white point in kelvin
    // Defined max range is 1,500 - 30,000

    HRESULT SetWhitePointKelvin(
        [in] UINT WhitePointKelvin
        );

    HRESULT GetWhitePointKelvin(
        [out] UINT *pWhitePointKelvin
        );

    HRESULT GetKelvinRangeInfo(
        [out] UINT *pMinKelvinTemp,
        [out] UINT *pMaxKelvinTemp,
        [out] UINT *pKelvinTempStepValue
        );

    // Set/Get the amount of contrast to apply to the final output
    // Valid range for Contrast is -1.0 to 1.0.

    HRESULT SetContrast(
        [in] double Contrast
        );

    HRESULT GetContrast(
        [out] double *pContrast
        );

    // Set/Get the gamma to use for output pixels
    // Valid range for Gamma is 0.0 to 5.0, with 1.0 being
    // the default.

    HRESULT SetGamma(
        [in] double Gamma
        );

    HRESULT GetGamma(
        [out] double *pGamma
        );

    // Set/Get the sharpness of the final output.
    // Valid range is 0.0 to 1.0.  0.0 is no sharpening
    // applied to the image at all, 1.0 is full/most allowed sharpening

    HRESULT SetSharpness(
        [in] double Sharpness
        );

    HRESULT GetSharpness(
        [out] double *pSharpness
        );

    // Set/Get saturation of the final output
    // Valid range is -1.0 to 1.0.  -1.0 is full
    // de-saturation, 1.0 is full saturation.

    HRESULT SetSaturation(
        [in] double Saturation
        );

    HRESULT GetSaturation(
        [out] double *pSaturation
        );

    // Set/Get the tint of the final output
    // Valid range is -1.0 to +1.0.  Scale is defined as orthogonal to color
    // temperature.  (Green/Magenta bias)

    HRESULT SetTint(
        [in] double Tint
        );

    HRESULT GetTint(
        [out] double *pTint
        );

    // Set/Get noise reduction of the final output
    // Valid range is 0.0 to 1.0.  0.0 is no noise
    // reduction applied.  1.0 is full/most allowed noise
    // reduction applied.

    HRESULT SetNoiseReduction(
        [in] double NoiseReduction
        );

    HRESULT GetNoiseReduction(
        [out] double *pNoiseReduction
        );

    // Set desired color profile of final output.  You can
    // get the color context via IWICBitmapFrameDecode::GetColorContext()

    HRESULT SetDestinationColorContext(
        [in, unique] IWICColorContext *pColorContext
        );

    // Set/Get the tone curve to use for final output.
    // Assume linear interpolation between points.

    [local]
    HRESULT SetToneCurve(
        [in] UINT cbToneCurveSize,
        [in, annotation("_In_reads_bytes_(cbToneCurveSize)")] const WICRawToneCurve *pToneCurve
        );

    [call_as(SetToneCurve)]
    HRESULT Remote_SetToneCurve(
        [in] UINT cPoints,
        [in, size_is(cPoints)] const WICRawToneCurvePoint *aPoints
        );

    // Get the tone curve currently in use.  To get the required
    // size of the buffer, pass in NULL for the pToneCurve parameter
    // and *pcbActualToneCurveBufferSize will contain the required size upon
    // exit.

    [local]
    HRESULT GetToneCurve(
        [in] UINT cbToneCurveBufferSize,
        [out, unique, annotation("_Out_writes_bytes_to_opt_(cbToneCurveBufferSize, *pcbActualToneCurveBufferSize)")] WICRawToneCurve *pToneCurve,
        [out, unique, annotation("_Inout_opt_")] UINT *pcbActualToneCurveBufferSize
        );

    [call_as(GetToneCurve)]
    HRESULT Remote_GetToneCurve(
        [out] UINT * pcPoints,
        [out, size_is(, *pcPoints)] WICRawToneCurvePoint **paPoints
        );

    // Set the desired rotation angle of the output of CopyPixels.
    // The parameter pRotation is in units of degrees and the sign is positive
    // clockwise. So a rotation of 90.0 would be a rotation of 90 degrees
    // clockwise (data along the left side of the sensor would be rendered on
    // the top rows of the output image.

    HRESULT SetRotation([in] double Rotation);

    // Gets the current rotation angle used for CopyPixels.

    HRESULT GetRotation([out] double *pRotation);

    // Set the desired render mode for CopyPixels

    HRESULT SetRenderMode([in] WICRawRenderMode RenderMode);

    // Get the current render mode used for CopyPixels

    HRESULT GetRenderMode([out] WICRawRenderMode *pRenderMode);

    // Set the callback function to call when parameters change

    HRESULT SetNotificationCallback([in, unique] IWICDevelopRawNotificationCallback *pCallback);
};
