diff --git a/objects/dib.c b/objects/dib.c index 9fbb0cee543..17efa78ac69 100644 --- a/objects/dib.c +++ b/objects/dib.c @@ -135,33 +135,39 @@ INT WINAPI StretchDIBits(HDC hdc, INT xDst, INT yDst, INT widthDst, const BITMAPINFO *info, UINT wUsage, DWORD dwRop ) { DC *dc = DC_GetDCPtr( hdc ); + if(!dc) return FALSE; + if (widthDst == widthSrc && heightDst == heightSrc && dwRop == SRCCOPY) { + return SetDIBitsToDevice( hdc, xDst, yDst, widthDst, heightDst, + xSrc, ySrc, 0, info->bmiHeader.biHeight, + bits, info, 0/*FIXME coloruse*/ ); + } + if(dc->funcs->pStretchDIBits) return dc->funcs->pStretchDIBits(dc, xDst, yDst, widthDst, heightDst, xSrc, ySrc, widthSrc, heightSrc, bits, info, wUsage, dwRop); else { /* use StretchBlt32 */ - HBITMAP hBitmap, hOldBitmap; - HDC hdcMem; - - hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT, - bits, info, wUsage ); - hdcMem = CreateCompatibleDC( hdc ); - hOldBitmap = SelectObject( hdcMem, hBitmap ); - /* Origin for DIBitmap is bottom left ! */ - StretchBlt( hdc, xDst, yDst, widthDst, heightDst, - hdcMem, xSrc, info->bmiHeader.biHeight - heightSrc - ySrc, - widthSrc, heightSrc, dwRop ); - SelectObject( hdcMem, hOldBitmap ); - DeleteDC( hdcMem ); - DeleteObject( hBitmap ); - return heightSrc; + HBITMAP hBitmap, hOldBitmap; + HDC hdcMem; + + hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT, + bits, info, wUsage ); + hdcMem = CreateCompatibleDC( hdc ); + hOldBitmap = SelectObject( hdcMem, hBitmap ); + /* Origin for DIBitmap is bottom left ! */ + StretchBlt( hdc, xDst, yDst, widthDst, heightDst, + hdcMem, xSrc, info->bmiHeader.biHeight - heightSrc - ySrc, + widthSrc, heightSrc, dwRop ); + SelectObject( hdcMem, hOldBitmap ); + DeleteDC( hdcMem ); + DeleteObject( hBitmap ); } + return heightSrc; } - /*********************************************************************** * SetDIBits16 (GDI.440) */