|
|
#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
|