Module: wine Branch: master Commit: 04412f7a74fb2a915584de080dab9190f0edc414 URL: http://source.winehq.org/git/wine.git/?a=commit;h=04412f7a74fb2a915584de080d...
Author: Vincent Povirk vincent@codeweavers.com Date: Wed Dec 5 10:36:40 2012 -0600
gdiplus: Avoid accessing dib bits directly in GdipCreateBitmapFromHBITMAP.
---
dlls/gdiplus/image.c | 80 +++++++++++++++++++++---------------------------- 1 files changed, 34 insertions(+), 46 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 73f08b9..a8f43e3 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -4694,62 +4694,50 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi format, &lockeddata); if (retval == Ok) { - if (bm.bmBits) - { - for (y=0; y<bm.bmHeight; y++) - { - memcpy((BYTE*)lockeddata.Scan0+lockeddata.Stride*y, - (BYTE*)bm.bmBits+bm.bmWidthBytes*(bm.bmHeight-1-y), - bm.bmWidthBytes); - } - } - else - { - HDC hdc; - HBITMAP oldhbm; - BITMAPINFO *pbmi; - INT src_height, dst_stride; - BYTE *dst_bits; + HDC hdc; + HBITMAP oldhbm; + BITMAPINFO *pbmi; + INT src_height, dst_stride; + BYTE *dst_bits;
- hdc = CreateCompatibleDC(NULL); - oldhbm = SelectObject(hdc, hbm); + hdc = CreateCompatibleDC(NULL); + oldhbm = SelectObject(hdc, hbm);
- pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); + pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
- if (pbmi) - { - pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - pbmi->bmiHeader.biBitCount = 0; - - GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS); - - src_height = abs(pbmi->bmiHeader.biHeight); + if (pbmi) + { + pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pbmi->bmiHeader.biBitCount = 0;
- if (pbmi->bmiHeader.biHeight > 0) - { - dst_bits = (BYTE*)lockeddata.Scan0+lockeddata.Stride*(src_height-1); - dst_stride = -lockeddata.Stride; - } - else - { - dst_bits = lockeddata.Scan0; - dst_stride = lockeddata.Stride; - } + GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
- for (y=0; y<src_height; y++) - { - GetDIBits(hdc, hbm, y, 1, dst_bits+dst_stride*y, - pbmi, DIB_RGB_COLORS); - } + src_height = abs(pbmi->bmiHeader.biHeight);
- GdipFree(pbmi); + if (pbmi->bmiHeader.biHeight > 0) + { + dst_bits = (BYTE*)lockeddata.Scan0+lockeddata.Stride*(src_height-1); + dst_stride = -lockeddata.Stride; } else - retval = OutOfMemory; + { + dst_bits = lockeddata.Scan0; + dst_stride = lockeddata.Stride; + } + + for (y=0; y<src_height; y++) + { + GetDIBits(hdc, hbm, y, 1, dst_bits+dst_stride*y, + pbmi, DIB_RGB_COLORS); + }
- SelectObject(hdc, oldhbm); - DeleteDC(hdc); + GdipFree(pbmi); } + else + retval = OutOfMemory; + + SelectObject(hdc, oldhbm); + DeleteDC(hdc);
GdipBitmapUnlockBits(*bitmap, &lockeddata); }