gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Vincent Povirk <vincent@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
(cherry picked from commit 506f3bf53d)
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
stable
Dmitry Timoshkov 2020-01-27 12:13:48 +08:00 committed by Michael Stefaniuc
parent d2582c1d66
commit fb1f78d982
1 changed files with 13 additions and 34 deletions

View File

@ -1381,50 +1381,29 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* info,
VOID *bits, GpBitmap **bitmap)
{
DWORD height, stride;
PixelFormat format;
HBITMAP hbm;
void *bmbits;
GpStatus status;
FIXME("(%p, %p, %p) - partially implemented\n", info, bits, bitmap);
TRACE("(%p, %p, %p)\n", info, bits, bitmap);
if (!info || !bits || !bitmap)
return InvalidParameter;
hbm = CreateDIBSection(0, info, DIB_RGB_COLORS, &bmbits, NULL, 0);
if (!hbm)
return InvalidParameter;
height = abs(info->bmiHeader.biHeight);
stride = ((info->bmiHeader.biWidth * info->bmiHeader.biBitCount + 31) >> 3) & ~3;
TRACE("height %u, stride %u, image size %u\n", height, stride, height * stride);
if(info->bmiHeader.biHeight > 0) /* bottom-up */
{
bits = (BYTE*)bits + (height - 1) * stride;
stride = -stride;
}
memcpy(bmbits, bits, height * stride);
switch(info->bmiHeader.biBitCount) {
case 1:
format = PixelFormat1bppIndexed;
break;
case 4:
format = PixelFormat4bppIndexed;
break;
case 8:
format = PixelFormat8bppIndexed;
break;
case 16:
format = PixelFormat16bppRGB555;
break;
case 24:
format = PixelFormat24bppRGB;
break;
case 32:
format = PixelFormat32bppRGB;
break;
default:
FIXME("don't know how to handle %d bpp\n", info->bmiHeader.biBitCount);
*bitmap = NULL;
return InvalidParameter;
}
return GdipCreateBitmapFromScan0(info->bmiHeader.biWidth, height, stride, format,
bits, bitmap);
status = GdipCreateBitmapFromHBITMAP(hbm, NULL, bitmap);
DeleteObject(hbm);
return status;
}
/* FIXME: no icm */