diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c index c32302b05a2..e8e2c887950 100644 --- a/dlls/gdi32/bitblt.c +++ b/dlls/gdi32/bitblt.c @@ -212,7 +212,7 @@ BOOL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst, dst_info->bmiHeader.biWidth = src->visrect.right - src->visrect.left; if ((ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( dst_info )))) { - err = convert_bitmapinfo( src_info, bits.ptr, &src->visrect, dst_info, ptr ); + err = convert_bitmapinfo( src_info, bits.ptr, src, dst_info, ptr ); if (bits.free) bits.free( &bits ); bits.ptr = ptr; bits.is_copy = TRUE; diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c index 4fc3f3a3b64..d09d3517455 100644 --- a/dlls/gdi32/dib.c +++ b/dlls/gdi32/dib.c @@ -615,7 +615,7 @@ INT WINAPI SetDIBits( HDC hdc, HBITMAP hbitmap, UINT startscan, ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( dst_info )); if (ptr) { - err = convert_bitmapinfo( src_info, src_bits.ptr, &src.visrect, dst_info, ptr ); + err = convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, ptr ); { if (src_bits.free) src_bits.free( &src_bits ); src_bits.ptr = ptr; @@ -1134,7 +1134,7 @@ INT WINAPI GetDIBits( else dst_info->bmiHeader.biHeight = -src.height; - convert_bitmapinfo( src_info, src_bits.ptr, &src.visrect, dst_info, bits ); + convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, bits ); if (src_bits.free) src_bits.free( &src_bits ); } else lines = abs(height); diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 7e457723aaa..17b2966363d 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -260,7 +260,7 @@ void copy_dib_color_info(dib_info *dst, const dib_info *src) } } -DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, const RECT *src_rect, +DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src, const BITMAPINFO *dst_info, void *dst_bits ) { dib_info src_dib, dst_dib; @@ -271,11 +271,15 @@ DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, const RECT if ( !init_dib_info_from_bitmapinfo( &dst_dib, dst_info, dst_bits, 0 ) ) return ERROR_BAD_FORMAT; - ret = dst_dib.funcs->convert_to( &dst_dib, &src_dib, src_rect ); + ret = dst_dib.funcs->convert_to( &dst_dib, &src_dib, &src->visrect ); /* We shared the color tables, so there's no need to free the dib_infos here */ - if(!ret) return ERROR_BAD_FORMAT; + + /* update coordinates, the destination rectangle is always stored at 0,0 */ + src->x -= src->visrect.left; + src->y -= src->visrect.top; + offset_rect( &src->visrect, -src->visrect.left, -src->visrect.top ); return ERROR_SUCCESS; } diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index f0fb8259622..01119510ecb 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -340,7 +340,7 @@ extern void DC_UpdateXforms( DC * dc ) DECLSPEC_HIDDEN; extern int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) DECLSPEC_HIDDEN; extern int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width, LONG *height, WORD *planes, WORD *bpp, DWORD *compr, DWORD *size ) DECLSPEC_HIDDEN; -extern DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, const RECT *src_rect, +extern DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src, const BITMAPINFO *dst_info, void *dst_bits ) DECLSPEC_HIDDEN;