From: Rémi Bernon rbernon@codeweavers.com
--- dlls/gdi.exe16/gdi.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/dlls/gdi.exe16/gdi.c b/dlls/gdi.exe16/gdi.c index c634f0739c7..f4f1868a81b 100644 --- a/dlls/gdi.exe16/gdi.c +++ b/dlls/gdi.exe16/gdi.c @@ -1189,8 +1189,8 @@ HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output, D3DKMT_CREATEDCFROMMEMORY desc = { .Width = info->bmiHeader.biWidth, - .Height = info->bmiHeader.biHeight, - .Pitch = info->bmiHeader.biWidth * info->bmiHeader.biBitCount / 8, + .Height = abs( info->bmiHeader.biHeight ), + .Pitch = info->bmiHeader.biSizeImage / abs( info->bmiHeader.biHeight ), }; struct saved_bitmap *bitmap; int color; @@ -1230,7 +1230,13 @@ HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output, desc.pMemory = &info->bmiColors[0]; }
- if (NtGdiDdDDICreateDCFromMemory( &desc )) return 0; + if (!(desc.hDeviceDc = NtGdiCreateCompatibleDC( 0 ))) return 0; + if (NtGdiDdDDICreateDCFromMemory( &desc )) + { + NtGdiDeleteObjectApp( desc.hDeviceDc ); + return 0; + } + NtGdiDeleteObjectApp( desc.hDeviceDc );
if ((bitmap = HeapAlloc( GetProcessHeap(), 0, sizeof(*bitmap) ))) {