gdi32: Add a copy_rect helper function.
This commit is contained in:
parent
ff307d573a
commit
95f1abc8d8
|
@ -27,6 +27,35 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(dib);
|
WINE_DEFAULT_DEBUG_CHANNEL(dib);
|
||||||
|
|
||||||
|
static DWORD copy_rect( dib_info *dst, const RECT *dst_rect, const dib_info *src, const RECT *src_rect,
|
||||||
|
HRGN clip, INT rop2 )
|
||||||
|
{
|
||||||
|
POINT origin;
|
||||||
|
RECT clipped_rect;
|
||||||
|
const WINEREGION *clip_data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
origin.x = src_rect->left;
|
||||||
|
origin.y = src_rect->top;
|
||||||
|
|
||||||
|
if (clip == NULL) dst->funcs->copy_rect( dst, dst_rect, src, &origin, rop2 );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clip_data = get_wine_region( clip );
|
||||||
|
for (i = 0; i < clip_data->numRects; i++)
|
||||||
|
{
|
||||||
|
if (intersect_rect( &clipped_rect, dst_rect, clip_data->rects + i ))
|
||||||
|
{
|
||||||
|
origin.x = src_rect->left + clipped_rect.left - dst_rect->left;
|
||||||
|
origin.y = src_rect->top + clipped_rect.top - dst_rect->top;
|
||||||
|
dst->funcs->copy_rect( dst, &clipped_rect, src, &origin, rop2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
release_wine_region( clip );
|
||||||
|
}
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static void set_color_info( const dib_info *dib, BITMAPINFO *info )
|
static void set_color_info( const dib_info *dib, BITMAPINFO *info )
|
||||||
{
|
{
|
||||||
DWORD *masks = (DWORD *)info->bmiColors;
|
DWORD *masks = (DWORD *)info->bmiColors;
|
||||||
|
@ -182,8 +211,7 @@ DWORD dibdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *info
|
||||||
dib_info src_dib;
|
dib_info src_dib;
|
||||||
HRGN saved_clip = NULL;
|
HRGN saved_clip = NULL;
|
||||||
dibdrv_physdev *pdev = NULL;
|
dibdrv_physdev *pdev = NULL;
|
||||||
const WINEREGION *clip_data;
|
int rop2;
|
||||||
int i, rop2;
|
|
||||||
|
|
||||||
TRACE( "%p %p %p\n", dev, hbitmap, info );
|
TRACE( "%p %p %p\n", dev, hbitmap, info );
|
||||||
|
|
||||||
|
@ -244,24 +272,7 @@ DWORD dibdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *info
|
||||||
|
|
||||||
rop2 = ((rop >> 16) & 0xf) + 1;
|
rop2 = ((rop >> 16) & 0xf) + 1;
|
||||||
|
|
||||||
if (clip == NULL) dib->funcs->copy_rect( dib, &dst->visrect, &src_dib, &origin, rop2 );
|
ret = copy_rect( dib, &dst->visrect, &src_dib, &src->visrect, clip, rop2 );
|
||||||
else
|
|
||||||
{
|
|
||||||
clip_data = get_wine_region( clip );
|
|
||||||
for (i = 0; i < clip_data->numRects; i++)
|
|
||||||
{
|
|
||||||
RECT clipped_rect;
|
|
||||||
|
|
||||||
if (intersect_rect( &clipped_rect, &dst->visrect, clip_data->rects + i ))
|
|
||||||
{
|
|
||||||
origin.x = src->visrect.left + clipped_rect.left - dst->visrect.left;
|
|
||||||
origin.y = src->visrect.top + clipped_rect.top - dst->visrect.top;
|
|
||||||
dib->funcs->copy_rect( dib, &clipped_rect, &src_dib, &origin, rop2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
release_wine_region( clip );
|
|
||||||
}
|
|
||||||
ret = ERROR_SUCCESS;
|
|
||||||
|
|
||||||
if (saved_clip) restore_clipping_region( pdev, saved_clip );
|
if (saved_clip) restore_clipping_region( pdev, saved_clip );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue