gdiplus: Use one GetDIBits call instead of one per row.

oldstable
Vincent Povirk 2012-12-05 10:42:49 -06:00 committed by Alexandre Julliard
parent 04412f7a74
commit 431aa5bc3f
1 changed files with 3 additions and 23 deletions

View File

@ -4645,7 +4645,6 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
GpStatus retval;
PixelFormat format;
BitmapData lockeddata;
INT y;
TRACE("%p %p %p\n", hbm, hpal, bitmap);
@ -4695,14 +4694,10 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
if (retval == Ok)
{
HDC hdc;
HBITMAP oldhbm;
BITMAPINFO *pbmi;
INT src_height, dst_stride;
BYTE *dst_bits;
INT src_height;
hdc = CreateCompatibleDC(NULL);
oldhbm = SelectObject(hdc, hbm);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
if (pbmi)
@ -4713,30 +4708,15 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
src_height = abs(pbmi->bmiHeader.biHeight);
pbmi->bmiHeader.biHeight = -src_height;
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;
}
for (y=0; y<src_height; y++)
{
GetDIBits(hdc, hbm, y, 1, dst_bits+dst_stride*y,
pbmi, DIB_RGB_COLORS);
}
GetDIBits(hdc, hbm, 0, src_height, lockeddata.Scan0, pbmi, DIB_RGB_COLORS);
GdipFree(pbmi);
}
else
retval = OutOfMemory;
SelectObject(hdc, oldhbm);
DeleteDC(hdc);
GdipBitmapUnlockBits(*bitmap, &lockeddata);