windows-nt/Source/XPSP1/NT/shell/comctl32/v6/image.h
2020-09-26 16:20:57 +08:00

251 lines
11 KiB
C++

#ifndef _INC_IMAGE
#define _INC_IMAGE
// internal image stuff
EXTERN_C void InitDitherBrush(void);
EXTERN_C void TerminateDitherBrush(void);
EXTERN_C HBITMAP CreateMonoBitmap(int cx, int cy);
EXTERN_C HBITMAP CreateColorBitmap(int cx, int cy);
EXTERN_C void WINAPI ImageList_CopyDitherImage(HIMAGELIST pimlDest, WORD iDst,
int xDst, int yDst, HIMAGELIST pimlSrc, int iSrc, UINT fStyle);
// function to create a imagelist using the params of a given image list
EXTERN_C HIMAGELIST WINAPI ImageList_Clone(HIMAGELIST himl, int cx, int cy,
UINT flags, int cInitial, int cGrow);
EXTERN_C DWORD WINAPI ImageList_GetItemFlags(HIMAGELIST himl, int i);
EXTERN_C HBITMAP CreateDIB(HDC h, int cx, int cy, RGBQUAD** pprgb);
EXTERN_C BOOL DIBHasAlpha(int cx, int cy, RGBQUAD* prgb);
EXTERN_C void PreProcessDIB(int cx, int cy, RGBQUAD* pargb);
#define GLOW_RADIUS 10
#define DROP_SHADOW 3
#ifndef ILC_COLORMASK
#define ILC_COLORMASK 0x00FE
#define ILD_BLENDMASK 0x000E
#endif
#undef ILC_COLOR
#undef ILC_BLEND
#define CLR_WHITE 0x00FFFFFFL
#define CLR_BLACK 0x00000000L
#define IsImageListIndex(i) ((i) >= 0 && (i) < _cImage)
#define IMAGELIST_SIG mmioFOURCC('H','I','M','L') // in memory magic
#define IMAGELIST_MAGIC ('I' + ('L' * 256)) // file format magic
// Version has to stay 0x0101 if we want both back ward and forward compatibility for
// our imagelist_read code
#define IMAGELIST_VER0 0x0101 // file format ver
#define IMAGELIST_VER6 0x0600 // Comctl32 version 6 imagelist
#define BFTYPE_BITMAP 0x4D42 // "BM"
#define CBDIBBUF 4096
#ifdef __cplusplus
// Define this structure such that it will read and write the same
// format for both 16 and 32 bit applications...
#pragma pack(2)
typedef struct _ILFILEHEADER
{
WORD magic;
WORD version;
SHORT cImage;
SHORT cAlloc;
SHORT cGrow;
SHORT cx;
SHORT cy;
COLORREF clrBk;
SHORT flags;
SHORT aOverlayIndexes[NUM_OVERLAY_IMAGES]; // array of special images
} ILFILEHEADER;
// This is the old size which has only 4 overlay slots
#define ILFILEHEADER_SIZE0 (SIZEOF(ILFILEHEADER) - SIZEOF(SHORT) * (NUM_OVERLAY_IMAGES - NUM_OVERLAY_IMAGES_0))
#pragma pack()
#include "../CommonImageList.h"
class CImageList : public CImageListBase,
public IImageList,
public IImageListPriv,
public IPersistStream,
public IImageListPersistStream
{
long _cRef;
~CImageList();
void _Destroy();
public:
CImageList();
static HRESULT InitGlobals();
HRESULT Initialize(int cx, int cy, UINT flags, int cInitial, int cGrow);
void _RemoveItemBitmap(int i);
BOOL _IsSameObject(IUnknown* punk);
HRESULT _SetIconSize(int cxImage, int cyImage);
HBITMAP _CreateMirroredBitmap(HBITMAP hbmOrig, BOOL fMirrorEach, int cx);
HRESULT _ReAllocBitmaps(int cAlloc);
HRESULT _Add(HBITMAP hbmImage, HBITMAP hbmMask, int cImage, int xStart, int yStart, int* pi);
HRESULT _AddMasked(HBITMAP hbmImage, COLORREF crMask, int* pi);
HRESULT _AddValidated(HBITMAP hbmImage, HBITMAP hbmMask, int* pi);
HRESULT _ReplaceValidated(int i, HBITMAP hbmImage, HBITMAP hbmMask);
HRESULT _Replace(int i, int cImage, HBITMAP hbmImage, HBITMAP hbmMask, int xStart, int yStart);
HRESULT _Remove(int i);
HRESULT _SetOverlayImage(int iImage, int iOverlay);
HRESULT _ReplaceIcon(int i, HICON hIcon, int* pi);
HBITMAP _CopyBitmap(HBITMAP hbm, HDC hdc);
HBITMAP _CopyDIBBitmap(HBITMAP hbm, HDC hdc, RGBQUAD** ppargb);
HRESULT LoadNormal(IStream* pstm);
HRESULT SaveNormal(IStream* pstm);
void _Merge(IImageList* pux, int i, int dx, int dy);
HRESULT _Merge(int i1, IUnknown* punk, int i2, int dx, int dy, CImageList** ppiml);
HRESULT _Read(ILFILEHEADER *pilfh, HBITMAP hbmImage, PVOID pvBits, HBITMAP hbmMask);
BOOL _MoreOverlaysUsed();
BOOL GetSpareImageRect(RECT * prcImage);
BOOL GetSpareImageRectInverted(RECT * prcImage);
void _CopyOneImage(int iDst, int x, int y, CImageList* piml, int iSrc);
BOOL CreateDragBitmaps();
COLORREF _SetBkColor(COLORREF clrBk);
HBITMAP _CreateBitmap(int cx, int cy, RGBQUAD** ppargb);
void _ResetBkColor(int iFirst, int iLast, COLORREF clr);
BOOL _HasAlpha(int i);
void _ScanForAlpha();
BOOL _PreProcessImage(int i);
inline DWORD _GetItemFlags(int i);
BOOL _MaskStretchBlt(BOOL fStretch, int i, HDC hdcDest, int xDst, int yDst, int cxDst, int cyDst,
HDC hdcImage, int xSrc, int ySrc, int cxSrc, int cySrc,
int xMask, int yMask,
DWORD dwRop);
BOOL _StretchBlt(BOOL fStretch, HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int xs, int ys, int cxs, int cys, DWORD dwRop);
inline void SetItemFlags(int i, DWORD dwFlag);
void _GenerateAlphaForImageUsingMask(int iImage, BOOL fSpare);
void BlendCTHelper(DWORD *pdw, DWORD rgb, UINT n, UINT count);
void BlendCT(HDC hdcDst, int xDst, int yDst, int x, int y, int cx, int cy, COLORREF rgb, UINT fStyle);
void BlendDither(HDC hdcDst, int xDst, int yDst, int x, int y, int cx, int cy, COLORREF rgb, UINT fStyle);
void Blend16Helper(int xSrc, int ySrc, int xDst, int yDst, int cx, int cy, COLORREF rgb, int a);
void Blend16(HDC hdcDst, int xDst, int yDst, int iImage, int cx, int cy, COLORREF rgb, UINT fStyle);
BOOL Blend32(HDC hdcDst, int xDst, int yDst, int iImage, int cx, int cy, COLORREF rgb, UINT fStyle);
BOOL Blend(HDC hdcDst, int xDst, int yDst, int iImage, int cx, int cy, COLORREF rgb, UINT fStyle);
HRESULT GetImageRectInverted(int i, RECT * prcImage);
static BOOL GlobalInit(void);
static void GlobalUninit(void);
static void SelectDstBitmap(HBITMAP hbmDst);
static void SelectSrcBitmap(HBITMAP hbmSrc);
static CImageList* Create(int cx, int cy, UINT flags, int cInitial, int cGrow);
static void _DeleteBitmap(HBITMAP hbmp);
BOOL _fInitialized;
BOOL _fSolidBk; // is the bkcolor a solid color (in hbmImage)
BOOL _fColorsSet; // The DIB colors have been set with SetColorTable()
int _cImage; // count of images in image list
int _cAlloc; // # of images we have space for
int _cGrow; // # of images to grow bitmaps by
int _cx; // width of each image
int _cy; // height
int _cStrip; // # images in horizontal strip
UINT _flags; // ILC_* flags
COLORREF _clrBlend; // last blend color
COLORREF _clrBk; // bk color or CLR_NONE for transparent.
HBRUSH _hbrBk; // bk brush or black
HBITMAP _hbmImage; // all images are in here
HBITMAP _hbmMask; // all image masks are in here.
HDSA _dsaFlags; // Flags for the images
RGBQUAD* _pargbImage; // The alpha values of the imagelist.
HDC _hdcImage;
HDC _hdcMask;
int _aOverlayIndexes[NUM_OVERLAY_IMAGES]; // array of special images
int _aOverlayX[NUM_OVERLAY_IMAGES]; // x offset of image
int _aOverlayY[NUM_OVERLAY_IMAGES]; // y offset of image
int _aOverlayDX[NUM_OVERLAY_IMAGES]; // cx offset of image
int _aOverlayDY[NUM_OVERLAY_IMAGES]; // cy offset of image
int _aOverlayF[NUM_OVERLAY_IMAGES]; // ILD_ flags for image
CImageList* _pimlMirror; // Set only when another mirrored imagelist is needed (ILC_MIRROR)
//
// used for "blending" effects on a HiColor display.
// assumes layout of a DIBSECTION.
//
struct
{
BITMAP bm;
BITMAPINFOHEADER bi;
DWORD ct[256];
} dib;
// *** IUnknown ***
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
STDMETHODIMP_(ULONG)AddRef();
STDMETHODIMP_(ULONG)Release();
// *** IImageList ***
STDMETHODIMP Add(HBITMAP hbmImage, HBITMAP hbmMask, int* pi);
STDMETHODIMP ReplaceIcon(int i, HICON hIcon, int* pi);
STDMETHODIMP SetOverlayImage(int iImage, int iOverlay);
STDMETHODIMP Replace(int i, HBITMAP hbmImage, HBITMAP hbmMask);
STDMETHODIMP AddMasked(HBITMAP hbmImage, COLORREF crMask, int* pi);
STDMETHODIMP Draw(IMAGELISTDRAWPARAMS* pimldp);
STDMETHODIMP Remove(int i);
STDMETHODIMP GetIcon(int i, UINT flags, HICON* phicon);
STDMETHODIMP GetImageInfo(int i, IMAGEINFO * pImageInfo);
STDMETHODIMP Copy(int iDst, IUnknown* punkSrc, int iSrc, UINT uFlags);
STDMETHODIMP Merge(int i1, IUnknown* punk, int i2, int dx, int dy, REFIID riid, void** ppv);
STDMETHODIMP Clone(REFIID riid, void** ppv);
STDMETHODIMP GetImageRect(int i, RECT * prcImage);
STDMETHODIMP SetIconSize(int cxImage, int cyImage);
STDMETHODIMP GetIconSize(int* pcx, int* pcy);
STDMETHODIMP SetImageCount(UINT uAlloc);
STDMETHODIMP GetImageCount(int* pi);
STDMETHODIMP SetBkColor(COLORREF clrBk, COLORREF* pclr);
STDMETHODIMP GetBkColor(COLORREF* pclr);
STDMETHODIMP BeginDrag(int iTrack, int dxHotspot, int dyHotspot);
STDMETHODIMP DragEnter(HWND hwndLock, int x, int y);
STDMETHODIMP DragMove(int x, int y);
STDMETHODIMP DragLeave(HWND hwndLock);
STDMETHODIMP EndDrag();
STDMETHODIMP SetDragCursorImage(IUnknown* punk, int i, int dxHotspot, int dyHotspot);
STDMETHODIMP DragShowNolock(BOOL fShow);
STDMETHODIMP GetDragImage(POINT * ppt, POINT * pptHotspot, REFIID riid, void** ppv);
STDMETHODIMP GetItemFlags(int i, DWORD *dwFlags);
STDMETHODIMP GetOverlayImage(int iOverlay, int *piIndex);
// *** IImageListPriv ***
STDMETHODIMP SetFlags(UINT uFlags);
STDMETHODIMP GetFlags(UINT* puFlags);
STDMETHODIMP SetColorTable(int start, int len, RGBQUAD *prgb, int* pi);
STDMETHODIMP GetPrivateGoo(HBITMAP* hbmp, HDC* hdc, HBITMAP* hbmpMask, HDC* hdcMask);
STDMETHODIMP GetMirror(REFIID riid, void** ppv);
STDMETHODIMP CopyDitherImage(WORD iDst, int xDst, int yDst, IUnknown* punkSrc, int iSrc, UINT fStyle);
// *** IPersist ***
STDMETHODIMP GetClassID(CLSID *pClassID) { *pClassID = CLSID_ImageList; return S_OK; }
STDMETHODIMP IsDirty() { return E_NOTIMPL; }
// *** IPersistStream ***
STDMETHODIMP Load(IStream *pStm);
STDMETHODIMP Save(IStream *pStm, int fClearDirty);
STDMETHODIMP GetSizeMax(ULARGE_INTEGER * pcbSize) { return E_NOTIMPL; }
// *** IImageListPersistStream ***
STDMETHODIMP LoadEx(DWORD dwFlags, IStream* pstm);
STDMETHODIMP SaveEx(DWORD dwFlags, IStream* pstm);
};
#endif // __cplusplus
#endif // _INC_IMAGE