winex11: Add X11DRV_XRender_SetDeviceClipping for syncing the clipping region with XRender pictures.

This commit is contained in:
Roderick Colenbrander 2009-10-14 12:33:40 +02:00 committed by Alexandre Julliard
parent 2c725de6de
commit 14e21d955a
3 changed files with 31 additions and 11 deletions

View File

@ -166,6 +166,9 @@ void CDECL X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev, HRGN vis_rgn, HRGN
XSetClipRectangles( gdi_display, physDev->gc, physDev->dc_rect.left, physDev->dc_rect.top,
(XRectangle *)data->Buffer, data->rdh.nCount, YXBanded );
wine_tsx11_unlock();
if (physDev->xrender) X11DRV_XRender_SetDeviceClipping(physDev, data);
HeapFree( GetProcessHeap(), 0, data );
}

View File

@ -281,6 +281,7 @@ extern int using_client_side_fonts;
extern void X11DRV_XRender_Init(void);
extern void X11DRV_XRender_Finalize(void);
extern BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE*, HFONT);
extern void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data);
extern void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE*);
extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height);
extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,

View File

@ -506,13 +506,19 @@ static Picture get_xrender_picture(X11DRV_PDEVICE *physDev)
if (!info->pict && info->format)
{
XRenderPictureAttributes pa;
RGNDATA *clip = X11DRV_GetRegionData( physDev->region, 0 );
wine_tsx11_lock();
pa.subwindow_mode = IncludeInferiors;
info->pict = pXRenderCreatePicture(gdi_display, physDev->drawable, info->format->pict_format,
CPSubwindowMode, &pa);
if (info->pict && clip)
pXRenderSetPictureClipRectangles( gdi_display, info->pict,
physDev->dc_rect.left, physDev->dc_rect.top,
(XRectangle *)clip->Buffer, clip->rdh.nCount );
wine_tsx11_unlock();
TRACE("Allocing pict=%lx dc=%p drawable=%08lx\n", info->pict, physDev->hdc, physDev->drawable);
HeapFree( GetProcessHeap(), 0, clip );
}
return info->pict;
@ -871,6 +877,21 @@ BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE *physDev, HFONT hfont)
return 0;
}
/***********************************************************************
* X11DRV_XRender_SetDeviceClipping
*/
void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data)
{
if (physDev->xrender->pict)
{
wine_tsx11_lock();
pXRenderSetPictureClipRectangles( gdi_display, physDev->xrender->pict,
physDev->dc_rect.left, physDev->dc_rect.top,
(XRectangle *)data->Buffer, data->rdh.nCount );
wine_tsx11_unlock();
}
}
/***********************************************************************
* X11DRV_XRender_DeleteDC
*/
@ -1465,7 +1486,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
const RECT *lprect, LPCWSTR wstr, UINT count,
const INT *lpDx )
{
RGNDATA *data;
XGCValues xgcval;
gsCacheEntry *entry;
gsCacheEntryFormat *formatEntry;
@ -1586,16 +1606,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
int render_op = PictOpOver;
Picture pict = get_xrender_picture(physDev);
if ((data = X11DRV_GetRegionData( physDev->region, 0 )))
{
wine_tsx11_lock();
pXRenderSetPictureClipRectangles( gdi_display, pict,
physDev->dc_rect.left, physDev->dc_rect.top,
(XRectangle *)data->Buffer, data->rdh.nCount );
wine_tsx11_unlock();
HeapFree( GetProcessHeap(), 0, data );
}
/* There's a bug in XRenderCompositeText that ignores the xDst and yDst parameters.
So we pass zeros to the function and move to our starting position using the first
element of the elts array. */
@ -2186,6 +2196,12 @@ void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE *physDev)
return;
}
void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev)
{
assert(0);
return;
}
BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr, UINT count,
const INT *lpDx )