Dmitry Timoshkov : gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.
Alexandre Julliard
julliard at winehq.org
Mon Jan 27 15:00:26 CST 2020
Module: wine
Branch: master
Commit: 506f3bf53df421e453549127c74f1af98ddfde56
URL: https://source.winehq.org/git/wine.git/?a=commit;h=506f3bf53df421e453549127c74f1af98ddfde56
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Mon Jan 27 12:13:48 2020 +0800
gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdiplus/image.c | 47 +++++++++++++----------------------------------
1 file changed, 13 insertions(+), 34 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index bfa0c8afa7..9fa2aaee95 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -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 */
More information about the wine-cvs
mailing list