Alexandre Julliard : winex11: Move the execution of rop operations from X11DRV_StretchBlt to a separate function .
Alexandre Julliard
julliard at winehq.org
Thu Jul 14 13:08:12 CDT 2011
Module: wine
Branch: master
Commit: c02bbb78b8c9b83191cf230942501736fbf50524
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c02bbb78b8c9b83191cf230942501736fbf50524
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 14 13:08:56 2011 +0200
winex11: Move the execution of rop operations from X11DRV_StretchBlt to a separate function.
---
dlls/winex11.drv/bitblt.c | 127 +++++++++++++++++++++++++--------------------
1 files changed, 70 insertions(+), 57 deletions(-)
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index 21a664c..e9004ce 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1105,7 +1105,7 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe
* Retrieve an area from the destination DC, mapping all the
* pixels to Windows colors.
*/
-static int BITBLT_GetDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, GC gc, RECT *visRectDst)
+static int BITBLT_GetDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, GC gc, const RECT *visRectDst)
{
int exposures = 0;
INT width = visRectDst->right - visRectDst->left;
@@ -1165,7 +1165,7 @@ static int BITBLT_GetDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, GC gc, RECT
* Put an area back into the destination DC, mapping the pixel
* colors to X pixels.
*/
-static int BITBLT_PutDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, RECT *visRectDst)
+static int BITBLT_PutDstArea(X11DRV_PDEVICE *physDev, Pixmap pixmap, const RECT *visRectDst)
{
int exposures = 0;
INT width = visRectDst->right - visRectDst->left;
@@ -1331,6 +1331,65 @@ static BOOL same_format(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst)
return FALSE;
}
+static void execute_rop( X11DRV_PDEVICE *physdev, Pixmap src_pixmap, GC gc,
+ const RECT *visrect, DWORD rop )
+{
+ Pixmap pixmaps[3];
+ Pixmap result = src_pixmap;
+ BOOL null_brush;
+ const BYTE *opcode = BITBLT_Opcodes[(rop >> 16) & 0xff];
+ BOOL use_pat = (((rop >> 4) & 0x0f0000) != (rop & 0x0f0000));
+ BOOL use_dst = (((rop >> 1) & 0x550000) != (rop & 0x550000));
+ int width = visrect->right - visrect->left;
+ int height = visrect->bottom - visrect->top;
+
+ pixmaps[SRC] = src_pixmap;
+ pixmaps[TMP] = 0;
+ wine_tsx11_lock();
+ pixmaps[DST] = XCreatePixmap( gdi_display, root_window, width, height, physdev->depth );
+ wine_tsx11_unlock();
+
+ if (use_dst) BITBLT_GetDstArea( physdev, pixmaps[DST], gc, visrect );
+ null_brush = use_pat && !X11DRV_SetupGCForPatBlt( physdev, gc, TRUE );
+
+ wine_tsx11_lock();
+ for ( ; *opcode; opcode++)
+ {
+ if (OP_DST(*opcode) == DST) result = pixmaps[DST];
+ XSetFunction( gdi_display, gc, OP_ROP(*opcode) );
+ switch(OP_SRCDST(*opcode))
+ {
+ case OP_ARGS(DST,TMP):
+ case OP_ARGS(SRC,TMP):
+ if (!pixmaps[TMP])
+ pixmaps[TMP] = XCreatePixmap( gdi_display, root_window, width, height, physdev->depth );
+ /* fall through */
+ case OP_ARGS(DST,SRC):
+ case OP_ARGS(SRC,DST):
+ case OP_ARGS(TMP,SRC):
+ case OP_ARGS(TMP,DST):
+ XCopyArea( gdi_display, pixmaps[OP_SRC(*opcode)], pixmaps[OP_DST(*opcode)], gc,
+ 0, 0, width, height, 0, 0 );
+ break;
+
+ case OP_ARGS(PAT,TMP):
+ if (!pixmaps[TMP] && !null_brush)
+ pixmaps[TMP] = XCreatePixmap( gdi_display, root_window, width, height, physdev->depth );
+ /* fall through */
+ case OP_ARGS(PAT,DST):
+ case OP_ARGS(PAT,SRC):
+ if (!null_brush)
+ XFillRectangle( gdi_display, pixmaps[OP_DST(*opcode)], gc, 0, 0, width, height );
+ break;
+ }
+ }
+ XSetFunction( gdi_display, physdev->gc, GXcopy );
+ physdev->exposures += BITBLT_PutDstArea( physdev, result, visrect );
+ XFreePixmap( gdi_display, pixmaps[DST] );
+ if (pixmaps[TMP]) XFreePixmap( gdi_display, pixmaps[TMP] );
+ wine_tsx11_unlock();
+}
+
/***********************************************************************
* X11DRV_PatBlt
*/
@@ -1397,17 +1456,15 @@ BOOL X11DRV_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
{
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 */
- BOOL usePat, useDst, destUsed, fStretch, fNullBrush;
+ BOOL fStretch;
INT width, height;
INT sDst, sSrc = DIB_Status_None;
const BYTE *opcode;
- Pixmap pixmaps[3] = { 0, 0, 0 }; /* pixmaps for DST, SRC, TMP */
- GC tmpGC = 0;
+ Pixmap src_pixmap;
+ GC tmpGC;
if (IsRectEmpty( &dst->visrect )) return TRUE;
- usePat = (((rop >> 4) & 0x0f0000) != (rop & 0x0f0000));
- useDst = (((rop >> 1) & 0x550000) != (rop & 0x550000));
fStretch = (src->width != dst->width) || (src->height != dst->height);
if (physDevDst != physDevSrc)
@@ -1491,67 +1548,23 @@ BOOL X11DRV_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
tmpGC = XCreateGC( gdi_display, physDevDst->drawable, 0, NULL );
XSetSubwindowMode( gdi_display, tmpGC, IncludeInferiors );
XSetGraphicsExposures( gdi_display, tmpGC, False );
- pixmaps[DST] = XCreatePixmap( gdi_display, root_window, width, height,
- physDevDst->depth );
- pixmaps[SRC] = XCreatePixmap( gdi_display, root_window, width, height,
- physDevDst->depth );
+ src_pixmap = XCreatePixmap( gdi_display, root_window, width, height, physDevDst->depth );
wine_tsx11_unlock();
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, src_pixmap, tmpGC, src, dst ))
{
if (fStretch)
- BITBLT_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, src, dst );
+ BITBLT_GetSrcAreaStretch( physDevSrc, physDevDst, src_pixmap, tmpGC, src, dst );
else
- BITBLT_GetSrcArea( physDevSrc, physDevDst, pixmaps[SRC], tmpGC, &src->visrect );
+ BITBLT_GetSrcArea( physDevSrc, physDevDst, src_pixmap, tmpGC, &src->visrect );
}
- if (useDst) BITBLT_GetDstArea( physDevDst, pixmaps[DST], tmpGC, &dst->visrect );
- if (usePat) fNullBrush = !X11DRV_SetupGCForPatBlt( physDevDst, tmpGC, TRUE );
- else fNullBrush = FALSE;
- destUsed = FALSE;
+ execute_rop( physDevDst, src_pixmap, tmpGC, &dst->visrect, rop );
wine_tsx11_lock();
- for ( ; *opcode; opcode++)
- {
- if (OP_DST(*opcode) == DST) destUsed = TRUE;
- XSetFunction( gdi_display, tmpGC, OP_ROP(*opcode) );
- switch(OP_SRCDST(*opcode))
- {
- case OP_ARGS(DST,TMP):
- case OP_ARGS(SRC,TMP):
- if (!pixmaps[TMP])
- pixmaps[TMP] = XCreatePixmap( gdi_display, root_window,
- width, height, physDevDst->depth );
- /* fall through */
- case OP_ARGS(DST,SRC):
- case OP_ARGS(SRC,DST):
- case OP_ARGS(TMP,SRC):
- case OP_ARGS(TMP,DST):
- XCopyArea( gdi_display, pixmaps[OP_SRC(*opcode)],
- pixmaps[OP_DST(*opcode)], tmpGC,
- 0, 0, width, height, 0, 0 );
- break;
-
- case OP_ARGS(PAT,TMP):
- if (!pixmaps[TMP] && !fNullBrush)
- pixmaps[TMP] = XCreatePixmap( gdi_display, root_window,
- width, height, physDevDst->depth );
- /* fall through */
- case OP_ARGS(PAT,DST):
- case OP_ARGS(PAT,SRC):
- if (!fNullBrush)
- XFillRectangle( gdi_display, pixmaps[OP_DST(*opcode)],
- tmpGC, 0, 0, width, height );
- break;
- }
- }
- XSetFunction( gdi_display, physDevDst->gc, GXcopy );
- physDevDst->exposures += BITBLT_PutDstArea( physDevDst, pixmaps[destUsed ? DST : SRC], &dst->visrect );
- XFreePixmap( gdi_display, pixmaps[DST] );
- if (pixmaps[SRC]) XFreePixmap( gdi_display, pixmaps[SRC] );
- if (pixmaps[TMP]) XFreePixmap( gdi_display, pixmaps[TMP] );
+ XFreePixmap( gdi_display, src_pixmap );
XFreeGC( gdi_display, tmpGC );
wine_tsx11_unlock();
More information about the wine-cvs
mailing list