Patch for loading bitmaps.
ChangeLog: * dlls/comctl32/toolar.c - Create a compatible bitmap of the display, which can be selected into a device context.
* windows/cursoricon.c - Loading bitmaps with specified size works now.
Index: dlls/comctl32/toolbar.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/toolbar.c,v retrieving revision 1.139 diff -u -r1.139 toolbar.c --- dlls/comctl32/toolbar.c 17 Sep 2003 20:15:21 -0000 1.139 +++ dlls/comctl32/toolbar.c 20 Sep 2003 10:40:03 -0000 @@ -2215,7 +2215,7 @@ /* create new default image list */ TRACE ("creating default image list!\n");
- himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, + himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK, nButtons, 2); TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); infoPtr->himlInt = himlDef; @@ -2236,7 +2236,7 @@ { BITMAP bmp; HBITMAP hOldBitmapBitmap, hOldBitmapLoad; - HDC hdcImage, hdcBitmap; + HDC hdcImage, hdcBitmap, hdcScreen;
/* copy the bitmap before adding it so that the user's bitmap * doesn't get modified. @@ -2245,11 +2245,12 @@
hdcImage = CreateCompatibleDC(0); hdcBitmap = CreateCompatibleDC(0); + hdcScreen = GetDC(NULL);
/* create new bitmap */ - hbmLoad = CreateBitmap (bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL); - hOldBitmapBitmap = SelectObject(hdcBitmap, (HBITMAP)lpAddBmp->nID); - hOldBitmapLoad = SelectObject(hdcImage, hbmLoad); + hbmLoad = CreateCompatibleBitmap (hdcScreen, bmp.bmWidth, bmp.bmHeight); + hOldBitmapBitmap = SelectObject (hdcBitmap, (HBITMAP)lpAddBmp->nID); + hOldBitmapLoad = SelectObject (hdcImage, hbmLoad);
/* Copy the user's image */ BitBlt (hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, @@ -2259,6 +2260,7 @@ SelectObject (hdcBitmap, hOldBitmapBitmap); DeleteDC (hdcImage); DeleteDC (hdcBitmap); + ReleaseDC (NULL, hdcScreen);
nIndex = ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT); DeleteObject (hbmLoad); @@ -3845,7 +3847,7 @@ { BITMAP bmp; HBITMAP hOldBitmapBitmap, hOldBitmapLoad, hbmLoad; - HDC hdcImage, hdcBitmap; + HDC hdcImage, hdcBitmap, hdcScreen;
/* copy the bitmap before adding it so that the user's bitmap * doesn't get modified. @@ -3854,11 +3856,12 @@
hdcImage = CreateCompatibleDC(0); hdcBitmap = CreateCompatibleDC(0); + hdcScreen = GetDC(NULL);
/* create new bitmap */ - hbmLoad = CreateBitmap (bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL); - hOldBitmapBitmap = SelectObject(hdcBitmap, hBitmap); - hOldBitmapLoad = SelectObject(hdcImage, hbmLoad); + hbmLoad = CreateCompatibleBitmap (hdcScreen, bmp.bmWidth, bmp.bmHeight); + hOldBitmapBitmap = SelectObject (hdcBitmap, hBitmap); + hOldBitmapLoad = SelectObject (hdcImage, hbmLoad);
/* Copy the user's image */ BitBlt (hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, @@ -3868,6 +3871,7 @@ SelectObject (hdcBitmap, hOldBitmapBitmap); DeleteDC (hdcImage); DeleteDC (hdcBitmap); + ReleaseDC (NULL, hdcScreen);
ImageList_AddMasked (himlDef, hbmLoad, CLR_DEFAULT); DeleteObject (hbmLoad); Index: windows/cursoricon.c =================================================================== RCS file: /home/wine/wine/windows/cursoricon.c,v retrieving revision 1.68 diff -u -r1.68 cursoricon.c --- windows/cursoricon.c 10 Sep 2003 03:56:47 -0000 1.68 +++ windows/cursoricon.c 20 Sep 2003 10:40:32 -0000 @@ -1925,7 +1925,8 @@ /********************************************************************** * BITMAP_Load */ -static HBITMAP BITMAP_Load( HINSTANCE instance,LPCWSTR name, UINT loadflags ) +static HBITMAP BITMAP_Load( HINSTANCE instance,LPCWSTR name, + INT width, INT height, UINT loadflags ) { HBITMAP hbitmap = 0; HRSRC hRsrc; @@ -1934,6 +1935,8 @@ BITMAPINFO *info, *fix_info=NULL; HGLOBAL hFix; int size; + BOOL fStretch = FALSE; + HDC hdcMem =NULL;
if (!(loadflags & LR_LOADFROMFILE)) { @@ -1953,6 +1956,12 @@ if (!(ptr = map_fileW( name ))) return 0; info = (BITMAPINFO *)(ptr + sizeof(BITMAPFILEHEADER)); } + + if (!width) width = info->bmiHeader.biWidth; + if (!height) height = info->bmiHeader.biHeight; + fStretch = (info->bmiHeader.biHeight != height) || + (info->bmiHeader.biWidth != width); + size = DIB_BitmapInfoSize(info, DIB_RGB_COLORS); if ((hFix = GlobalAlloc(0, size))) fix_info=GlobalLock(hFix); if (fix_info) { @@ -1965,7 +1974,42 @@ if (screen_dc) { char *bits = (char *)info + size; - if (loadflags & LR_CREATEDIBSECTION) { + if (fStretch) { + if (loadflags & LR_CREATEDIBSECTION) { + /* avoid GlobalAlloc & memcpy, but we have to save and then restore the value */ + BITMAPINFOHEADER tSave = fix_info->bmiHeader; + fix_info->bmiHeader.biWidth = width; + fix_info->bmiHeader.biHeight = height; + fix_info->bmiHeader.biCompression = BI_RGB; + fix_info->bmiHeader.biSizeImage = 0; + + hbitmap = CreateDIBSection(screen_dc, fix_info, DIB_RGB_COLORS, NULL, 0, 0); + + fix_info->bmiHeader = tSave; + } + else { + if (fix_info->bmiHeader.biBitCount != 1 ) { + hbitmap = CreateCompatibleBitmap(screen_dc, width, height); + } + else hbitmap = CreateBitmap(width, height, 1, 1, NULL); + } + if(hbitmap) { + HBITMAP hOld; + BOOL res = FALSE; + hdcMem = CreateCompatibleDC(screen_dc); + if (hdcMem) { + hOld = SelectObject(hdcMem, hbitmap); + res = StretchDIBits(hdcMem, 0, 0, width, height, 0, 0, + fix_info->bmiHeader.biWidth, + fix_info->bmiHeader.biHeight, + bits, fix_info, DIB_RGB_COLORS, SRCCOPY); + SelectObject(hdcMem, hOld); + DeleteDC(hdcMem), hdcMem = NULL; + } + if (!res) { DeleteObject(hbitmap); hbitmap = NULL; } + } + } + else if (loadflags & LR_CREATEDIBSECTION) { DIBSECTION dib; hbitmap = CreateDIBSection(screen_dc, fix_info, DIB_RGB_COLORS, NULL, 0, 0); GetObjectA(hbitmap, sizeof(DIBSECTION), &dib); @@ -2064,7 +2108,7 @@ if (loadflags & LR_LOADFROMFILE) loadflags &= ~LR_SHARED; switch (type) { case IMAGE_BITMAP: - return BITMAP_Load( hinst, name, loadflags ); + return BITMAP_Load( hinst, name, desiredx, desiredy, loadflags );
case IMAGE_ICON: if (!screen_dc) screen_dc = CreateDCW( DISPLAYW, NULL, NULL, NULL );
_________________________________________________________________ 与联机的朋友进行交流,请使用 MSN Messenger: http://messenger.msn.com/cn