- implement support for xBitmap and yBitmap in ImageList_DrawIndirect

- small code, docs, and messages cleanups
This commit is contained in:
Dimitrie O. Paun 2002-09-04 18:44:46 +00:00 committed by Alexandre Julliard
parent d6b6509301
commit 7ad3d12a52
1 changed files with 69 additions and 90 deletions

View File

@ -21,7 +21,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* TODO:
* - Fix ImageList_DrawIndirect (xBitmap, yBitmap, rgbFg, rgbBk, dwRop).
* - Fix ImageList_DrawIndirect (rgbFg, rgbBk, dwRop).
* - Fix ImageList_GetIcon.
* - Fix ImageList_SetFilter (undocumented).
* BTW does anybody know anything about this function???
@ -156,7 +156,7 @@ IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cx, INT c
* PARAMS
* pimldp [I] pointer to IMAGELISTDRAWPARAMS structure.
* cx [I] the width of the image to display
* cy............[I] the height of the image to display
* cy [I] the height of the image to display
*
* RETURNS
* nothing
@ -178,7 +178,7 @@ IMAGELIST_InternalDraw(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
BitBlt(pimldp->hdcDst,
pimldp->x, pimldp->y, cx, cy,
hImageDC,
pimldp->himl->cx * pimldp->i, 0,
pimldp->himl->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
SRCCOPY);
SelectObject(hImageDC, hOldBitmap);
@ -194,7 +194,7 @@ IMAGELIST_InternalDraw(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
* PARAMS
* pimldp [I] pointer to IMAGELISTDRAWPARAMS structure.
* cx [I] the width of the image to display
* cy............[I] the height of the image to display
* cy [I] the height of the image to display
*
* RETURNS
* nothing
@ -208,41 +208,26 @@ IMAGELIST_InternalDraw(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
static VOID
IMAGELIST_InternalDrawMask(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
{
BOOL bUseCustomBackground, bBlendFlag;
HBRUSH hBrush, hOldBrush;
HDC hMaskDC, hImageDC;
HBITMAP hOldBitmapImage, hOldBitmapMask;
HIMAGELIST himlLocal = pimldp->himl;
COLORREF oldBkColor, oldFgColor;
UINT fStyle = pimldp->fStyle & (~ILD_OVERLAYMASK);
/*
* We need a dc and bitmap to draw on that is
* not on the screen.
*/
HDC hOffScreenDC = 0;
HBITMAP hOffScreenBmp = 0;
HDC hOffScreenDC = CreateCompatibleDC( pimldp->hdcDst );
HBITMAP hOffScreenBmp = CreateCompatibleBitmap( pimldp->hdcDst, cx, cy );
bUseCustomBackground = (himlLocal->clrBk != CLR_NONE);
bBlendFlag = (fStyle & ILD_BLEND50 ) || (fStyle & ILD_BLEND25);
BOOL bUseCustomBackground = (himlLocal->clrBk != CLR_NONE);
BOOL bBlendFlag = (fStyle & ILD_BLEND50 ) || (fStyle & ILD_BLEND25);
hImageDC = CreateCompatibleDC(0);
hMaskDC = CreateCompatibleDC(0);
HDC hImageDC = CreateCompatibleDC(0);
HDC hMaskDC = CreateCompatibleDC(0);
/* Create a compatible DC. */
hOffScreenDC = CreateCompatibleDC( pimldp->hdcDst );
if ( hOffScreenDC )
{
hOffScreenBmp = CreateCompatibleBitmap( pimldp->hdcDst, cx, cy );
if ( hOffScreenBmp )
if (!hOffScreenDC || !hOffScreenBmp || !hImageDC || !hMaskDC) goto cleanup;
SelectObject( hOffScreenDC, hOffScreenBmp );
else
goto cleanup;
}
else
goto cleanup;
hOldBitmapImage = SelectObject(hImageDC, himlLocal->hbmImage);
hOldBitmapMask = SelectObject(hMaskDC, himlLocal->hbmMask);
@ -263,8 +248,8 @@ IMAGELIST_InternalDrawMask(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
|| bBlendFlag) )
{
hBrush = CreateSolidBrush (himlLocal->clrBk);
hOldBrush = SelectObject (pimldp->hdcDst, hBrush);
HBRUSH hBrush = CreateSolidBrush (himlLocal->clrBk);
HBRUSH hOldBrush = SelectObject (pimldp->hdcDst, hBrush);
PatBlt( hOffScreenDC, pimldp->x, pimldp->y, cx, cy, PATCOPY );
@ -282,15 +267,19 @@ IMAGELIST_InternalDrawMask(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
* monochrome mask.
*/
oldBkColor = SetBkColor( hOffScreenDC, RGB( 0xff, 0xff, 0xff ) );
oldFgColor = SetTextColor( hOffScreenDC, RGB( 0, 0, 0 ) );
COLORREF oldBk = SetBkColor( hOffScreenDC, RGB( 0xff, 0xff, 0xff ) );
COLORREF oldFg = SetTextColor( hOffScreenDC, RGB( 0, 0, 0 ) );
BitBlt( hOffScreenDC, 0, 0, cx, cy,hMaskDC, himlLocal->cx * pimldp->i,
0, SRCAND );
BitBlt( hOffScreenDC, 0, 0, cx, cy, hMaskDC,
himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
SRCAND );
BitBlt( hOffScreenDC, 0, 0, cx, cy, hImageDC,himlLocal->cx * pimldp->i,
0, SRCPAINT );
BitBlt( hOffScreenDC, 0, 0, cx, cy, hImageDC,
himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
SRCPAINT );
SetBkColor( hOffScreenDC, oldBk);
SetBkColor( hOffScreenDC, oldFg);
}
/*
@ -299,15 +288,17 @@ IMAGELIST_InternalDrawMask(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
else if((fStyle & ILD_IMAGE) && !bUseCustomBackground)
{
BitBlt( hOffScreenDC, 0, 0, cx, cy, hImageDC,
himlLocal->cx * pimldp->i, 0, SRCCOPY);
himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
SRCCOPY);
}
/*
* Draw the mask with or without a background
*/
else if(fStyle & ILD_MASK)
{
BitBlt( hOffScreenDC, 0, 0, cx, cy, hMaskDC, himlLocal->cx * pimldp->i,
0, bUseCustomBackground ? SRCCOPY : SRCAND);
BitBlt( hOffScreenDC, 0, 0, cx, cy, hMaskDC,
himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
bUseCustomBackground ? SRCCOPY : SRCAND);
}
/*
@ -339,7 +330,7 @@ cleanup:
* PARAMS
* pimldp [I] pointer to IMAGELISTDRAWPARAMS structure.
* cx [I] the width of the image to display
* cy............[I] the height of the image to display
* cy [I] the height of the image to display
*
* RETURNS
* nothing
@ -353,10 +344,10 @@ static VOID
IMAGELIST_InternalDrawBlend(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
{
HDC hBlendMaskDC,hMaskDC;
HDC hBlendMaskDC;
HBRUSH hBlendColorBrush, hBlendBrush, hOldBrush;
HBITMAP hBlendMaskBitmap, hOldBitmap;
COLORREF clrBlend, OldTextColor, OldBkColor;
COLORREF clrBlend, oldFgColor, oldBkColor;
HIMAGELIST himlLocal = pimldp->himl;
clrBlend = GetSysColor (COLOR_HIGHLIGHT);
@ -382,18 +373,14 @@ IMAGELIST_InternalDrawBlend(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
if(pimldp->himl->hbmMask != 0)
{
HBITMAP hOldMaskBitmap;
hMaskDC = CreateCompatibleDC(0);
HDC hMaskDC = CreateCompatibleDC(0);
hOldMaskBitmap = (HBITMAP) SelectObject(hMaskDC, himlLocal->hbmMask);
BitBlt(hBlendMaskDC,
0,0, cx, cy,
hMaskDC,
himlLocal->cx * pimldp->i,0,
BitBlt(hBlendMaskDC, 0, 0, cx, cy, hMaskDC,
himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
0x220326); /* NOTSRCAND */
BitBlt(hBlendMaskDC,
0,0, cx, cy,
hBlendMaskDC,
BitBlt(hBlendMaskDC, 0, 0, cx, cy, hBlendMaskDC,
0, 0,
NOTSRCCOPY);
@ -403,8 +390,8 @@ IMAGELIST_InternalDrawBlend(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
}
/* Apply blend to the current image given the BlendMask
*/
OldTextColor = SetTextColor(pimldp->hdcDst, 0);
OldBkColor = SetBkColor(pimldp->hdcDst, RGB(255,255,255));
oldFgColor = SetTextColor(pimldp->hdcDst, RGB(0, 0, 0));
oldBkColor = SetBkColor(pimldp->hdcDst, RGB(255,255,255));
hBlendColorBrush = CreateSolidBrush(clrBlend);
hOldBrush = (HBRUSH) SelectObject (pimldp->hdcDst, hBlendColorBrush);
@ -415,8 +402,8 @@ IMAGELIST_InternalDrawBlend(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
0xB8074A); /* PSDPxax */
SelectObject(pimldp->hdcDst, hOldBrush);
SetTextColor(pimldp->hdcDst, OldTextColor);
SetBkColor(pimldp->hdcDst, OldBkColor);
SetTextColor(pimldp->hdcDst, oldFgColor);
SetBkColor(pimldp->hdcDst, oldBkColor);
SelectObject(hBlendMaskDC, hOldBitmap);
DeleteDC(hBlendMaskDC);
DeleteObject(hBlendMaskBitmap);
@ -431,7 +418,7 @@ IMAGELIST_InternalDrawBlend(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
* PARAMS
* pimldp [I] pointer to IMAGELISTDRAWPARAMS structure.
* cx [I] the width of the image to display
* cy............[I] the height of the image to display
* cy [I] the height of the image to display
*
* RETURNS
* nothing
@ -450,38 +437,32 @@ IMAGELIST_InternalDrawOverlay(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
HBITMAP hOldBitmap;
nOvlIdx = (pimldp->fStyle & ILD_OVERLAYMASK) >> 8;
if ((nOvlIdx >= 1) && (nOvlIdx <= MAX_OVERLAYIMAGE))
{
nOvlIdx = pimldp->himl->nOvlIdx[nOvlIdx - 1];
if ((nOvlIdx >= 0) && (nOvlIdx <= pimldp->himl->cCurImage))
{
hImageDC = CreateCompatibleDC(0);
if (pimldp->himl->hbmMask)
{
hOldBitmap = (HBITMAP) SelectObject (hImageDC,
pimldp->himl->hbmMask);
if ( (nOvlIdx < 1) || (nOvlIdx > MAX_OVERLAYIMAGE)) return;
BitBlt (pimldp->hdcDst,
pimldp->x, pimldp->y, cx, cy,
hImageDC, pimldp->himl->cx * nOvlIdx, 0,
nOvlIdx = pimldp->himl->nOvlIdx[nOvlIdx - 1];
if ((nOvlIdx < 0) || (nOvlIdx > pimldp->himl->cCurImage)) return;
if (!(hImageDC = CreateCompatibleDC(0))) return;
if (pimldp->himl->hbmMask) {
hOldBitmap = (HBITMAP) SelectObject (hImageDC, pimldp->himl->hbmMask);
BitBlt (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy, hImageDC,
pimldp->himl->cx * nOvlIdx + pimldp->xBitmap, pimldp->yBitmap,
SRCAND);
SelectObject(hImageDC, hOldBitmap);
}
hOldBitmap = (HBITMAP) SelectObject (hImageDC,
pimldp->himl->hbmImage);
BitBlt (pimldp->hdcDst,
pimldp->x, pimldp->y, cx, cy,
hImageDC,
pimldp->himl->cx * nOvlIdx, 0,
hOldBitmap = (HBITMAP) SelectObject (hImageDC, pimldp->himl->hbmImage);
BitBlt (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy, hImageDC,
pimldp->himl->cx * nOvlIdx + pimldp->xBitmap, pimldp->yBitmap,
SRCPAINT);
SelectObject(hImageDC, hOldBitmap);
DeleteDC(hImageDC);
}
}
}
/*************************************************************************
@ -743,7 +724,7 @@ ImageList_BeginDrag (HIMAGELIST himlTrack, INT iTrack,
InternalDrag.himl = ImageList_Create (cx, cy, himlTrack->flags, 1, 1);
if (InternalDrag.himl == NULL) {
ERR("Error creating drag image list!\n");
WARN("Error creating drag image list!\n");
return FALSE;
}
@ -1332,8 +1313,8 @@ ImageList_Draw (HIMAGELIST himl, INT i, HDC hdc,
* hdc [I] handle to device context
* x [I] X position
* y [I] Y position
* xOffs [I] X offset
* yOffs [I] Y offset
* dx [I] X offset
* dy [I] Y offset
* rgbBk [I] background color
* rgbFg [I] foreground color
* fStyle [I] drawing flags
@ -1402,7 +1383,6 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
if (pimldp->himl == NULL)
return FALSE;
if ((pimldp->i < 0) || (pimldp->i >= pimldp->himl->cCurImage)) {
ERR("%d not within range (max %d)\n",pimldp->i,pimldp->himl->cCurImage-1);
return FALSE;
}
/*
@ -1625,7 +1605,6 @@ ImageList_GetIcon (HIMAGELIST himl, INT i, UINT fStyle)
HDC hdcSrc, hdcDst;
if ((himl == NULL) || (i < 0) || (i >= himl->cCurImage)) {
FIXME("(%p,%d,%x), params out of range!\n",himl,i,fStyle);
return 0;
}