251 lines
11 KiB
C++
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
|