cpp_quote("/**")
cpp_quote(" * This file is part of the mingw-w64 runtime package.")
cpp_quote(" * No warranty is given; refer to the file DISCLAIMER within this package.")
cpp_quote(" */")

import "oaidl.idl";
import "ocidl.idl";

cpp_quote("#include <winapifamily.h>")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
cpp_quote("#ifndef WINCOMMCTRLAPI")
cpp_quote("#ifndef _COMCTL32_")
cpp_quote("#define WINCOMMCTRLAPI DECLSPEC_IMPORT")
cpp_quote("#else")
cpp_quote("#define WINCOMMCTRLAPI")
cpp_quote("#endif")
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#ifdef __WIDL__")

typedef DWORD RGBQUAD;
typedef IUnknown *HIMAGELIST;
cpp_quote("typedef struct _IMAGELIST *HIMAGELIST;")

typedef struct _IMAGELISTDRAWPARAMS {
  DWORD cbSize;
  HIMAGELIST himl;
  int i;
  HDC hdcDst;
  int x;
  int y;
  int cx;
  int cy;
  int xBitmap;
  int yBitmap;
  COLORREF rgbBk;
  COLORREF rgbFg;
  UINT fStyle;
  DWORD dwRop;
  DWORD fState;
  DWORD Frame;
  COLORREF crEffect;
} IMAGELISTDRAWPARAMS;

typedef IMAGELISTDRAWPARAMS *LPIMAGELISTDRAWPARAMS;

typedef struct tagIMAGEINFO {
  HBITMAP hbmImage;
  HBITMAP hbmMask;
  int Unused1;
  int Unused2;
  RECT rcImage;
} IMAGEINFO;

typedef IMAGEINFO *LPIMAGEINFO;
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#define ILIF_ALPHA 0x1")
cpp_quote("#define ILIF_LOWQUALITY 0x2")
cpp_quote("")
cpp_quote("#define ILDRF_IMAGELOWQUALITY 0x1")
cpp_quote("#define ILDRF_OVERLAYLOWQUALITY 0x10")
cpp_quote("")
cpp_quote("#define ILR_DEFAULT 0x0")
cpp_quote("#define ILR_HORIZONTAL_LEFT  0x0")
cpp_quote("#define ILR_HORIZONTAL_CENTER 0x1")
cpp_quote("#define ILR_HORIZONTAL_RIGHT 0x2")
cpp_quote("#define ILR_VERTICAL_TOP 0x0")
cpp_quote("#define ILR_VERTICAL_CENTER 0x10")
cpp_quote("#define ILR_VERTICAL_BOTTOM 0x20")
cpp_quote("#define ILR_SCALE_CLIP               0x0")
cpp_quote("#define ILR_SCALE_ASPECTRATIO        0x100")
cpp_quote("")
cpp_quote("#define ILGOS_ALWAYS 0x0")
cpp_quote("#define ILGOS_FROMSTANDBY 0x1")
cpp_quote("")
cpp_quote("#define ILFIP_ALWAYS 0x0")
cpp_quote("#define ILFIP_FROMSTANDBY 0x1")
cpp_quote("")
cpp_quote("#define ILDI_PURGE 0x1")
cpp_quote("#define ILDI_STANDBY 0x2")
cpp_quote("#define ILDI_RESETACCESS 0x4")
cpp_quote("#define ILDI_QUERYACCESS 0x8")

cpp_quote("")
cpp_quote("#if NTDDI_VERSION >= 0x06000000")
cpp_quote("WINCOMMCTRLAPI HRESULT WINAPI ImageList_CoCreateInstance (REFCLSID rclsid, const IUnknown *punkOuter, REFIID riid, void **ppv);")
cpp_quote("#endif")

typedef struct tagIMAGELISTSTATS {
  DWORD cbSize;
  int cAlloc;
  int cUsed;
  int cStandby;
} IMAGELISTSTATS;

[local, uuid (46eb5926-582e-4017-9fdf-E8998DAA0950)]
interface IImageList : IUnknown {
  HRESULT Add ([in] HBITMAP hbmImage,[in, unique] HBITMAP hbmMask,[out] int *pi);
  HRESULT ReplaceIcon (int i,[in] HICON hicon,[out] int *pi);
  HRESULT SetOverlayImage (int iImage, int iOverlay);
  HRESULT Replace (int i,[in] HBITMAP hbmImage,[in, unique] HBITMAP hbmMask);
  HRESULT AddMasked ([in] HBITMAP hbmImage, COLORREF crMask,[out] int *pi);
  HRESULT Draw ([in] IMAGELISTDRAWPARAMS *pimldp);
  HRESULT Remove (int i);
  HRESULT GetIcon (int i, UINT flags,[out] HICON *picon);
  HRESULT GetImageInfo (int i,[out] IMAGEINFO *pImageInfo);
  HRESULT Copy (int iDst,[in] IUnknown *punkSrc, int iSrc, UINT uFlags);
  HRESULT Merge (int i1,[in] IUnknown *punk2, int i2, int dx, int dy, REFIID riid,[out, iid_is (riid)] void **ppv);
  HRESULT Clone (REFIID riid,[out, iid_is (riid)] void **ppv);
  HRESULT GetImageRect (int i,[out] RECT *prc);
  HRESULT GetIconSize ([out] int *cx,[out] int *cy);
  HRESULT SetIconSize (int cx, int cy);
  HRESULT GetImageCount ([out] int *pi);
  HRESULT SetImageCount (UINT uNewCount);
  HRESULT SetBkColor (COLORREF clrBk,[out] COLORREF *pclr);
  HRESULT GetBkColor ([out] COLORREF *pclr);
  HRESULT BeginDrag (int iTrack, int dxHotspot, int dyHotspot);
  HRESULT EndDrag ();
  HRESULT DragEnter ([in, unique] HWND hwndLock, int x, int y);
  HRESULT DragLeave ([in, unique] HWND hwndLock);
  HRESULT DragMove (int x, int y);
  HRESULT SetDragCursorImage ([in] IUnknown *punk, int iDrag, int dxHotspot, int dyHotspot);
  HRESULT DragShowNolock (WINBOOL fShow);
  HRESULT GetDragImage ([out] POINT *ppt,[out] POINT *pptHotspot, REFIID riid,[out, iid_is (riid)] void **ppv);
  HRESULT GetItemFlags (int i,[out] DWORD *dwFlags);
  HRESULT GetOverlayImage (int iOverlay,[out] int *piIndex);
};

[local, uuid (192b9d83-50fc-457b-90a0-2b82a8b5dae1)]
interface IImageList2 : IImageList {
  HRESULT Resize (int cxNewIconSize, int cyNewIconSize);
  HRESULT GetOriginalSize ([in] int iImage,[in] DWORD dwFlags,[out] int *pcx,[out] int *pcy);
  HRESULT SetOriginalSize ([in] int iImage,[in] int cx,[in] int cy);
  HRESULT SetCallback ([in, unique] IUnknown *punk);
  HRESULT GetCallback ([in] REFIID riid,[out, iid_is (riid)] void **ppv);
  HRESULT ForceImagePresent ([in] int iImage, DWORD dwFlags);
  HRESULT DiscardImages ([in] int iFirstImage,[in] int iLastImage,[in] DWORD dwFlags);
  HRESULT PreloadImages ([in] IMAGELISTDRAWPARAMS *pimldp);
  HRESULT GetStatistics ([in, out] IMAGELISTSTATS *pils);
  HRESULT Initialize ([in] int cx,[in] int cy,[in] UINT flags,[in] int cInitial,[in] int cGrow);
  HRESULT Replace2 ([in] int i,[in] HBITMAP hbmImage,[in, unique] HBITMAP hbmMask,[in, unique] IUnknown *punk,[in] DWORD dwFlags);
  HRESULT ReplaceFromImageList ([in] int i,[in] IImageList *pil,[in] int iSrc,[in, unique] IUnknown *punk,[in] DWORD dwFlags);
};

[uuid (BCADA15B-B428-420c-8d28-023590924c9f)]
library CommonControlObjects {
  [uuid (7c476ba2-02b1-48f4-8048-B24619DDC058)]
  coclass ImageList {
    interface IImageList;
    interface IImageList2;
  }
};
cpp_quote("#endif")
