From 1d6bddc0a8a8b30cc2d69a5105ff7410d8bc4447 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Sun, 28 Sep 2008 12:25:44 -0700 Subject: [PATCH] gdiplus: Allocate enough space for BITMAPINFO in GdipBitmapUnlockBits. --- dlls/gdiplus/image.c | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index dc9607c..926c2a5 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -197,7 +197,7 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap, HDC hdc; HBITMAP old = NULL; BOOL bm_is_selected; - BITMAPINFO bmi; + BITMAPINFO *pbmi; if(!bitmap || !lockeddata) return InvalidParameter; @@ -221,24 +221,26 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap, IPicture_get_CurDC(bitmap->image.picture, &hdc); bm_is_selected = (hdc != 0); - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi.bmiHeader.biBitCount = 0; + pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); + pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pbmi->bmiHeader.biBitCount = 0; if(!bm_is_selected){ hdc = CreateCompatibleDC(0); old = SelectObject(hdc, (HBITMAP)hbm); } - GetDIBits(hdc, (HBITMAP)hbm, 0, 0, NULL, &bmi, DIB_RGB_COLORS); - bmi.bmiHeader.biBitCount = PIXELFORMATBPP(lockeddata->PixelFormat); - SetDIBits(hdc, (HBITMAP)hbm, 0, abs(bmi.bmiHeader.biHeight), - bitmap->bitmapbits, &bmi, DIB_RGB_COLORS); + GetDIBits(hdc, (HBITMAP)hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS); + pbmi->bmiHeader.biBitCount = PIXELFORMATBPP(lockeddata->PixelFormat); + SetDIBits(hdc, (HBITMAP)hbm, 0, abs(pbmi->bmiHeader.biHeight), + bitmap->bitmapbits, pbmi, DIB_RGB_COLORS); if(!bm_is_selected){ SelectObject(hdc, old); DeleteDC(hdc); } + GdipFree(pbmi); GdipFree(bitmap->bitmapbits); bitmap->bitmapbits = NULL; bitmap->lockmode = 0; -- 1.5.2.5