Commit 8bd130b9 authored by Alexandre Julliard's avatar Alexandre Julliard

gdi32: Pass the source/dest visible rectangles to the StretchBlt driver entry point.

parent 1805f123
...@@ -165,9 +165,8 @@ static void get_vis_rectangles( DC *dc_dst, struct bitblt_coords *dst, ...@@ -165,9 +165,8 @@ static void get_vis_rectangles( DC *dc_dst, struct bitblt_coords *dst,
} }
/* nulldrv fallback implementation using StretchDIBits */ /* nulldrv fallback implementation using StretchDIBits */
BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, INT heightDst, BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
PHYSDEV src_dev, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop )
DWORD rop )
{ {
DC *dc = get_nulldrv_dc( dst_dev ); DC *dc = get_nulldrv_dc( dst_dev );
BITMAP bm; BITMAP bm;
...@@ -175,21 +174,10 @@ BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst ...@@ -175,21 +174,10 @@ BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst
HBITMAP hbm; HBITMAP hbm;
LPVOID bits; LPVOID bits;
INT lines; INT lines;
POINT pts[2];
/* make sure we have a real implementation for StretchDIBits */ /* make sure we have a real implementation for StretchDIBits */
if (GET_DC_PHYSDEV( dc, pStretchDIBits ) == dst_dev) return 0; if (GET_DC_PHYSDEV( dc, pStretchDIBits ) == dst_dev) return 0;
pts[0].x = xSrc;
pts[0].y = ySrc;
pts[1].x = xSrc + widthSrc;
pts[1].y = ySrc + heightSrc;
LPtoDP( src_dev->hdc, pts, 2 );
xSrc = pts[0].x;
ySrc = pts[0].y;
widthSrc = pts[1].x - pts[0].x;
heightSrc = pts[1].y - pts[0].y;
if (GetObjectType( src_dev->hdc ) != OBJ_MEMDC) return FALSE; if (GetObjectType( src_dev->hdc ) != OBJ_MEMDC) return FALSE;
if (!GetObjectW( GetCurrentObject( src_dev->hdc, OBJ_BITMAP ), sizeof(bm), &bm )) return FALSE; if (!GetObjectW( GetCurrentObject( src_dev->hdc, OBJ_BITMAP ), sizeof(bm), &bm )) return FALSE;
...@@ -213,11 +201,11 @@ BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst ...@@ -213,11 +201,11 @@ BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst
lines = GetDIBits( src_dev->hdc, hbm, 0, bm.bmHeight, bits, (BITMAPINFO*)&info_hdr, DIB_RGB_COLORS ); lines = GetDIBits( src_dev->hdc, hbm, 0, bm.bmHeight, bits, (BITMAPINFO*)&info_hdr, DIB_RGB_COLORS );
SelectObject( src_dev->hdc, hbm ); SelectObject( src_dev->hdc, hbm );
if (lines) lines = StretchDIBits( dst_dev->hdc, xDst, yDst, widthDst, heightDst, if (lines) lines = StretchDIBits( dst_dev->hdc, dst->log_x, dst->log_y, dst->log_width, dst->log_height,
xSrc, bm.bmHeight - heightSrc - ySrc, widthSrc, heightSrc, src->x, bm.bmHeight - src->height - src->y, src->width, src->height,
bits, (BITMAPINFO*)&info_hdr, DIB_RGB_COLORS, rop ); bits, (BITMAPINFO*)&info_hdr, DIB_RGB_COLORS, rop );
HeapFree( GetProcessHeap(), 0, bits ); HeapFree( GetProcessHeap(), 0, bits );
return (lines == heightSrc); return (lines == src->height);
} }
/*********************************************************************** /***********************************************************************
...@@ -265,10 +253,6 @@ BOOL WINAPI StretchBlt( HDC hdcDst, INT xDst, INT yDst, INT widthDst, INT height ...@@ -265,10 +253,6 @@ BOOL WINAPI StretchBlt( HDC hdcDst, INT xDst, INT yDst, INT widthDst, INT height
if (!rop_uses_src( rop )) return PatBlt( hdcDst, xDst, yDst, widthDst, heightDst, rop ); if (!rop_uses_src( rop )) return PatBlt( hdcDst, xDst, yDst, widthDst, heightDst, rop );
TRACE("%p %d,%d %dx%d -> %p %d,%d %dx%d rop=%06x\n",
hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
hdcDst, xDst, yDst, widthDst, heightDst, rop );
if (!(dcDst = get_dc_ptr( hdcDst ))) return FALSE; if (!(dcDst = get_dc_ptr( hdcDst ))) return FALSE;
if ((dcSrc = get_dc_ptr( hdcSrc ))) if ((dcSrc = get_dc_ptr( hdcSrc )))
...@@ -297,8 +281,14 @@ BOOL WINAPI StretchBlt( HDC hdcDst, INT xDst, INT yDst, INT widthDst, INT height ...@@ -297,8 +281,14 @@ BOOL WINAPI StretchBlt( HDC hdcDst, INT xDst, INT yDst, INT widthDst, INT height
rop &= ~NOMIRRORBITMAP; rop &= ~NOMIRRORBITMAP;
} }
get_vis_rectangles( dcDst, &dst, dcSrc, &src ); get_vis_rectangles( dcDst, &dst, dcSrc, &src );
ret = dst_dev->funcs->pStretchBlt( dst_dev, xDst, yDst, widthDst, heightDst,
src_dev, xSrc, ySrc, widthSrc, heightSrc, rop ); TRACE("src %p log=%d,%d %dx%d phys=%d,%d %dx%d vis=%s dst %p log=%d,%d %dx%d phys=%d,%d %dx%d vis=%s rop=%06x\n",
hdcSrc, src.log_x, src.log_y, src.log_width, src.log_height,
src.x, src.y, src.width, src.height, wine_dbgstr_rect(&src.visrect),
hdcDst, dst.log_x, dst.log_y, dst.log_width, dst.log_height,
dst.x, dst.y, dst.width, dst.height, wine_dbgstr_rect(&dst.visrect), rop );
ret = dst_dev->funcs->pStretchBlt( dst_dev, &dst, src_dev, &src, rop );
release_dc_ptr( dcSrc ); release_dc_ptr( dcSrc );
} }
release_dc_ptr( dcDst ); release_dc_ptr( dcDst );
......
...@@ -65,8 +65,8 @@ BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, INT left, INT top, ...@@ -65,8 +65,8 @@ BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, INT left, INT top,
return ret; return ret;
} }
BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, INT heightDst, BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst,
PHYSDEV devSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop ) PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop )
{ {
BOOL ret; BOOL ret;
PEMRBITBLT pEMR; PEMRBITBLT pEMR;
...@@ -82,7 +82,7 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, ...@@ -82,7 +82,7 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst,
if (devSrc->funcs == devDst->funcs) return FALSE; /* can't use a metafile DC as source */ if (devSrc->funcs == devDst->funcs) return FALSE; /* can't use a metafile DC as source */
if (widthSrc == widthDst && heightSrc == heightDst) if (src->log_width == dst->log_width && src->log_height == dst->log_height)
{ {
emrType = EMR_BITBLT; emrType = EMR_BITBLT;
emrSize = sizeof(EMRBITBLT); emrSize = sizeof(EMRBITBLT);
...@@ -112,17 +112,17 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, ...@@ -112,17 +112,17 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst,
/* Initialize EMR */ /* Initialize EMR */
pEMR->emr.iType = emrType; pEMR->emr.iType = emrType;
pEMR->emr.nSize = size; pEMR->emr.nSize = size;
pEMR->rclBounds.left = xDst; pEMR->rclBounds.left = dst->log_x;
pEMR->rclBounds.top = yDst; pEMR->rclBounds.top = dst->log_y;
pEMR->rclBounds.right = xDst + widthDst - 1; pEMR->rclBounds.right = dst->log_x + dst->log_width - 1;
pEMR->rclBounds.bottom = yDst + heightDst - 1; pEMR->rclBounds.bottom = dst->log_y + dst->log_height - 1;
pEMR->xDest = xDst; pEMR->xDest = dst->log_x;
pEMR->yDest = yDst; pEMR->yDest = dst->log_y;
pEMR->cxDest = widthDst; pEMR->cxDest = dst->log_width;
pEMR->cyDest = heightDst; pEMR->cyDest = dst->log_height;
pEMR->dwRop = rop; pEMR->dwRop = rop;
pEMR->xSrc = xSrc; pEMR->xSrc = src->log_x;
pEMR->ySrc = ySrc; pEMR->ySrc = src->log_y;
GetWorldTransform(devSrc->hdc, &pEMR->xformSrc); GetWorldTransform(devSrc->hdc, &pEMR->xformSrc);
pEMR->crBkColorSrc = GetBkColor(devSrc->hdc); pEMR->crBkColorSrc = GetBkColor(devSrc->hdc);
pEMR->iUsageSrc = DIB_RGB_COLORS; pEMR->iUsageSrc = DIB_RGB_COLORS;
...@@ -133,8 +133,8 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, ...@@ -133,8 +133,8 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst,
if (emrType == EMR_STRETCHBLT) if (emrType == EMR_STRETCHBLT)
{ {
PEMRSTRETCHBLT pEMRStretch = (PEMRSTRETCHBLT)pEMR; PEMRSTRETCHBLT pEMRStretch = (PEMRSTRETCHBLT)pEMR;
pEMRStretch->cxSrc = widthSrc; pEMRStretch->cxSrc = src->log_width;
pEMRStretch->cySrc = heightSrc; pEMRStretch->cySrc = src->log_height;
} }
/* Initialize BITMAPINFO structure */ /* Initialize BITMAPINFO structure */
......
...@@ -152,10 +152,8 @@ extern BOOL CDECL EMFDRV_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT ...@@ -152,10 +152,8 @@ extern BOOL CDECL EMFDRV_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT
extern BOOL CDECL EMFDRV_SetWindowExtEx( PHYSDEV dev, INT x, INT y, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_SetWindowExtEx( PHYSDEV dev, INT x, INT y, SIZE *size ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, extern BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst,
INT widthDst, INT heightDst, PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) DECLSPEC_HIDDEN;
PHYSDEV devSrc, INT xSrc, INT ySrc,
INT widthSrc, INT heightSrc, DWORD rop ) DECLSPEC_HIDDEN;
extern INT CDECL EMFDRV_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst, extern INT CDECL EMFDRV_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst,
INT heightDst, INT xSrc, INT ySrc, INT heightDst, INT xSrc, INT ySrc,
INT widthSrc, INT heightSrc, INT widthSrc, INT heightSrc,
......
...@@ -263,7 +263,7 @@ typedef struct gdi_dc_funcs ...@@ -263,7 +263,7 @@ typedef struct gdi_dc_funcs
BOOL (CDECL *pSetWorldTransform)(PHYSDEV,const XFORM*); BOOL (CDECL *pSetWorldTransform)(PHYSDEV,const XFORM*);
INT (CDECL *pStartDoc)(PHYSDEV,const DOCINFOW*); INT (CDECL *pStartDoc)(PHYSDEV,const DOCINFOW*);
INT (CDECL *pStartPage)(PHYSDEV); INT (CDECL *pStartPage)(PHYSDEV);
BOOL (CDECL *pStretchBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,INT,INT,DWORD); BOOL (CDECL *pStretchBlt)(PHYSDEV,struct bitblt_coords*,PHYSDEV,struct bitblt_coords*,DWORD);
INT (CDECL *pStretchDIBits)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT,const void *, INT (CDECL *pStretchDIBits)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT,const void *,
const BITMAPINFO*,UINT,DWORD); const BITMAPINFO*,UINT,DWORD);
BOOL (CDECL *pStrokeAndFillPath)(PHYSDEV); BOOL (CDECL *pStrokeAndFillPath)(PHYSDEV);
...@@ -640,8 +640,8 @@ extern BOOL CDECL nulldrv_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ...@@ -640,8 +640,8 @@ extern BOOL CDECL nulldrv_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt
extern BOOL CDECL nulldrv_SetWindowExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_SetWindowExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size ) DECLSPEC_HIDDEN;
extern BOOL CDECL nulldrv_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL nulldrv_SetWorldTransform( PHYSDEV dev, const XFORM *xform ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_SetWorldTransform( PHYSDEV dev, const XFORM *xform ) DECLSPEC_HIDDEN;
extern BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, INT heightDst, extern BOOL CDECL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
PHYSDEV src_dev, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop ) DECLSPEC_HIDDEN; PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop ) DECLSPEC_HIDDEN;
extern INT CDECL nulldrv_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst, INT heightDst, extern INT CDECL nulldrv_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst, INT heightDst,
INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, const void *bits, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, const void *bits,
const BITMAPINFO *info, UINT coloruse, DWORD rop ) DECLSPEC_HIDDEN; const BITMAPINFO *info, UINT coloruse, DWORD rop ) DECLSPEC_HIDDEN;
......
...@@ -43,9 +43,8 @@ BOOL CDECL MFDRV_PatBlt( PHYSDEV dev, INT left, INT top, INT width, INT height, ...@@ -43,9 +43,8 @@ BOOL CDECL MFDRV_PatBlt( PHYSDEV dev, INT left, INT top, INT width, INT height,
*/ */
#define STRETCH_VIA_DIB #define STRETCH_VIA_DIB
BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst,
INT heightDst, PHYSDEV devSrc, INT xSrc, INT ySrc, PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop )
INT widthSrc, INT heightSrc, DWORD rop )
{ {
BOOL ret; BOOL ret;
DWORD len; DWORD len;
...@@ -110,14 +109,14 @@ BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, ...@@ -110,14 +109,14 @@ BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst,
mr->rdSize = len / sizeof(INT16); mr->rdSize = len / sizeof(INT16);
*(mr->rdParm) = LOWORD(rop); *(mr->rdParm) = LOWORD(rop);
*(mr->rdParm + 1) = HIWORD(rop); *(mr->rdParm + 1) = HIWORD(rop);
*(mr->rdParm + 2) = heightSrc; *(mr->rdParm + 2) = src->log_height;
*(mr->rdParm + 3) = widthSrc; *(mr->rdParm + 3) = src->log_width;
*(mr->rdParm + 4) = ySrc; *(mr->rdParm + 4) = src->log_y;
*(mr->rdParm + 5) = xSrc; *(mr->rdParm + 5) = src->log_x;
*(mr->rdParm + 6) = heightDst; *(mr->rdParm + 6) = dst->log_height;
*(mr->rdParm + 7) = widthDst; *(mr->rdParm + 7) = dst->log_width;
*(mr->rdParm + 8) = yDst; *(mr->rdParm + 8) = dst->log_y;
*(mr->rdParm + 9) = xDst; *(mr->rdParm + 9) = dst->log_x;
ret = MFDRV_WriteRecord( devDst, mr, mr->rdSize * 2); ret = MFDRV_WriteRecord( devDst, mr, mr->rdSize * 2);
} }
else else
......
...@@ -139,9 +139,8 @@ extern BOOL CDECL MFDRV_SetViewportExtEx( PHYSDEV dev, INT x, INT y, SIZE *size ...@@ -139,9 +139,8 @@ extern BOOL CDECL MFDRV_SetViewportExtEx( PHYSDEV dev, INT x, INT y, SIZE *size
extern BOOL CDECL MFDRV_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_SetWindowExtEx( PHYSDEV dev, INT x, INT y, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_SetWindowExtEx( PHYSDEV dev, INT x, INT y, SIZE *size ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, INT xDst, INT yDst, INT widthDst, extern BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst,
INT heightDst, PHYSDEV devSrc, INT xSrc, INT ySrc, PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) DECLSPEC_HIDDEN;
INT widthSrc, INT heightSrc, DWORD rop ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
extern INT CDECL MFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDest, DWORD cx, extern INT CDECL MFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDest, DWORD cx,
DWORD cy, INT xSrc, INT ySrc, DWORD cy, INT xSrc, INT ySrc,
......
...@@ -1486,57 +1486,29 @@ BOOL CDECL X11DRV_PatBlt( PHYSDEV dev, INT x, INT y, INT width, INT height, DWOR ...@@ -1486,57 +1486,29 @@ BOOL CDECL X11DRV_PatBlt( PHYSDEV dev, INT x, INT y, INT width, INT height, DWOR
/*********************************************************************** /***********************************************************************
* X11DRV_StretchBlt * X11DRV_StretchBlt
*/ */
BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, INT heightDst, BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
PHYSDEV src_dev, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop )
DWORD rop )
{ {
X11DRV_PDEVICE *physDevDst = get_x11drv_dev( dst_dev ); X11DRV_PDEVICE *physDevDst = get_x11drv_dev( dst_dev );
X11DRV_PDEVICE *physDevSrc = get_x11drv_dev( src_dev ); /* FIXME: check that it's really an x11 dev */ X11DRV_PDEVICE *physDevSrc = get_x11drv_dev( src_dev ); /* FIXME: check that it's really an x11 dev */
BOOL usePat, useDst, destUsed, fStretch, fNullBrush; BOOL usePat, useDst, destUsed, fStretch, fNullBrush;
struct bitblt_coords src, dst;
INT width, height; INT width, height;
INT sDst, sSrc = DIB_Status_None; INT sDst, sSrc = DIB_Status_None;
const BYTE *opcode; const BYTE *opcode;
Pixmap pixmaps[3] = { 0, 0, 0 }; /* pixmaps for DST, SRC, TMP */ Pixmap pixmaps[3] = { 0, 0, 0 }; /* pixmaps for DST, SRC, TMP */
GC tmpGC = 0; GC tmpGC = 0;
if (IsRectEmpty( &dst->visrect )) return TRUE;
usePat = (((rop >> 4) & 0x0f0000) != (rop & 0x0f0000)); usePat = (((rop >> 4) & 0x0f0000) != (rop & 0x0f0000));
useDst = (((rop >> 1) & 0x550000) != (rop & 0x550000)); useDst = (((rop >> 1) & 0x550000) != (rop & 0x550000));
fStretch = (src->width != dst->width) || (src->height != dst->height);
src.x = xSrc;
src.y = ySrc;
src.width = widthSrc;
src.height = heightSrc;
src.layout = GetLayout( src_dev->hdc );
dst.x = xDst;
dst.y = yDst;
dst.width = widthDst;
dst.height = heightDst;
dst.layout = GetLayout( dst_dev->hdc );
if (rop & NOMIRRORBITMAP)
{
src.layout |= LAYOUT_BITMAPORIENTATIONPRESERVED;
dst.layout |= LAYOUT_BITMAPORIENTATIONPRESERVED;
rop &= ~NOMIRRORBITMAP;
}
if (!BITBLT_GetVisRectangles( physDevDst, physDevSrc, &dst, &src ))
return TRUE;
fStretch = (src.width != dst.width) || (src.height != dst.height);
if (physDevDst != physDevSrc) if (physDevDst != physDevSrc)
sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None ); sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None );
TRACE(" rectdst=%d,%d %dx%d orgdst=%d,%d visdst=%s\n", width = dst->visrect.right - dst->visrect.left;
dst.x, dst.y, dst.width, dst.height, height = dst->visrect.bottom - dst->visrect.top;
physDevDst->dc_rect.left, physDevDst->dc_rect.top, wine_dbgstr_rect( &dst.visrect ) );
TRACE(" rectsrc=%d,%d %dx%d orgsrc=%d,%d vissrc=%s\n",
src.x, src.y, src.width, src.height,
physDevSrc->dc_rect.left, physDevSrc->dc_rect.top, wine_dbgstr_rect( &src.visrect ) );
width = dst.visrect.right - dst.visrect.left;
height = dst.visrect.bottom - dst.visrect.top;
sDst = X11DRV_LockDIBSection( physDevDst, DIB_Status_None ); sDst = X11DRV_LockDIBSection( physDevDst, DIB_Status_None );
if (physDevDst == physDevSrc) sSrc = sDst; if (physDevDst == physDevSrc) sSrc = sDst;
...@@ -1546,8 +1518,8 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, ...@@ -1546,8 +1518,8 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst,
sSrc == DIB_Status_AppMod && sDst == DIB_Status_AppMod && sSrc == DIB_Status_AppMod && sDst == DIB_Status_AppMod &&
same_format(physDevSrc, physDevDst)) same_format(physDevSrc, physDevDst))
{ {
if (client_side_dib_copy( physDevSrc, src.visrect.left, src.visrect.top, if (client_side_dib_copy( physDevSrc, src->visrect.left, src->visrect.top,
physDevDst, dst.visrect.left, dst.visrect.top, width, height )) physDevDst, dst->visrect.left, dst->visrect.top, width, height ))
goto done; goto done;
} }
...@@ -1568,8 +1540,8 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, ...@@ -1568,8 +1540,8 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst,
{ {
if (sSrc == DIB_Status_AppMod) if (sSrc == DIB_Status_AppMod)
{ {
X11DRV_DIB_CopyDIBSection( physDevSrc, physDevDst, src.visrect.left, src.visrect.top, X11DRV_DIB_CopyDIBSection( physDevSrc, physDevDst, src->visrect.left, src->visrect.top,
dst.visrect.left, dst.visrect.top, width, height ); dst->visrect.left, dst->visrect.top, width, height );
goto done; goto done;
} }
X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod ); X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod );
...@@ -1577,11 +1549,11 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, ...@@ -1577,11 +1549,11 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst,
wine_tsx11_lock(); wine_tsx11_lock();
XCopyArea( gdi_display, physDevSrc->drawable, XCopyArea( gdi_display, physDevSrc->drawable,
physDevDst->drawable, physDevDst->gc, physDevDst->drawable, physDevDst->gc,
physDevSrc->dc_rect.left + src.visrect.left, physDevSrc->dc_rect.left + src->visrect.left,
physDevSrc->dc_rect.top + src.visrect.top, physDevSrc->dc_rect.top + src->visrect.top,
width, height, width, height,
physDevDst->dc_rect.left + dst.visrect.left, physDevDst->dc_rect.left + dst->visrect.left,
physDevDst->dc_rect.top + dst.visrect.top ); physDevDst->dc_rect.top + dst->visrect.top );
physDevDst->exposures++; physDevDst->exposures++;
wine_tsx11_unlock(); wine_tsx11_unlock();
goto done; goto done;
...@@ -1598,11 +1570,11 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, ...@@ -1598,11 +1570,11 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst,
XSetFunction( gdi_display, physDevDst->gc, OP_ROP(*opcode) ); XSetFunction( gdi_display, physDevDst->gc, OP_ROP(*opcode) );
XCopyPlane( gdi_display, physDevSrc->drawable, XCopyPlane( gdi_display, physDevSrc->drawable,
physDevDst->drawable, physDevDst->gc, physDevDst->drawable, physDevDst->gc,
physDevSrc->dc_rect.left + src.visrect.left, physDevSrc->dc_rect.left + src->visrect.left,
physDevSrc->dc_rect.top + src.visrect.top, physDevSrc->dc_rect.top + src->visrect.top,
width, height, width, height,
physDevDst->dc_rect.left + dst.visrect.left, physDevDst->dc_rect.left + dst->visrect.left,
physDevDst->dc_rect.top + dst.visrect.top, 1 ); physDevDst->dc_rect.top + dst->visrect.top, 1 );
physDevDst->exposures++; physDevDst->exposures++;
wine_tsx11_unlock(); wine_tsx11_unlock();
goto done; goto done;
...@@ -1621,15 +1593,15 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, ...@@ -1621,15 +1593,15 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst,
if (physDevDst != physDevSrc) X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod ); if (physDevDst != physDevSrc) X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod );
if(!X11DRV_XRender_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, &src, &dst )) if(!X11DRV_XRender_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, src, dst ))
{ {
if (fStretch) if (fStretch)
BITBLT_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, &src, &dst ); BITBLT_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, src, dst );
else else
BITBLT_GetSrcArea( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, &src.visrect ); BITBLT_GetSrcArea( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, &src->visrect );
} }
if (useDst) BITBLT_GetDstArea( physDevDst, pixmaps[DST], tmpGC, &dst.visrect ); if (useDst) BITBLT_GetDstArea( physDevDst, pixmaps[DST], tmpGC, &dst->visrect );
if (usePat) fNullBrush = !X11DRV_SetupGCForPatBlt( physDevDst, tmpGC, TRUE ); if (usePat) fNullBrush = !X11DRV_SetupGCForPatBlt( physDevDst, tmpGC, TRUE );
else fNullBrush = FALSE; else fNullBrush = FALSE;
destUsed = FALSE; destUsed = FALSE;
...@@ -1670,7 +1642,7 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst, ...@@ -1670,7 +1642,7 @@ BOOL CDECL X11DRV_StretchBlt( PHYSDEV dst_dev, INT xDst, INT yDst, INT widthDst,
} }
} }
XSetFunction( gdi_display, physDevDst->gc, GXcopy ); XSetFunction( gdi_display, physDevDst->gc, GXcopy );
physDevDst->exposures += BITBLT_PutDstArea( physDevDst, pixmaps[destUsed ? DST : SRC], &dst.visrect ); physDevDst->exposures += BITBLT_PutDstArea( physDevDst, pixmaps[destUsed ? DST : SRC], &dst->visrect );
XFreePixmap( gdi_display, pixmaps[DST] ); XFreePixmap( gdi_display, pixmaps[DST] );
if (pixmaps[SRC]) XFreePixmap( gdi_display, pixmaps[SRC] ); if (pixmaps[SRC]) XFreePixmap( gdi_display, pixmaps[SRC] );
if (pixmaps[TMP]) XFreePixmap( gdi_display, pixmaps[TMP] ); if (pixmaps[TMP]) XFreePixmap( gdi_display, pixmaps[TMP] );
......
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
@ cdecl SetPixel(ptr long long long) X11DRV_SetPixel @ cdecl SetPixel(ptr long long long) X11DRV_SetPixel
@ cdecl SetPixelFormat(ptr long ptr) X11DRV_SetPixelFormat @ cdecl SetPixelFormat(ptr long ptr) X11DRV_SetPixelFormat
@ cdecl SetTextColor(ptr long) X11DRV_SetTextColor @ cdecl SetTextColor(ptr long) X11DRV_SetTextColor
@ cdecl StretchBlt(ptr long long long long ptr long long long long long) X11DRV_StretchBlt @ cdecl StretchBlt(ptr ptr ptr ptr long) X11DRV_StretchBlt
@ cdecl SwapBuffers(ptr) X11DRV_SwapBuffers @ cdecl SwapBuffers(ptr) X11DRV_SwapBuffers
@ cdecl UnrealizePalette(long) X11DRV_UnrealizePalette @ cdecl UnrealizePalette(long) X11DRV_UnrealizePalette
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment