winex11: Add X11DRV_XRender_SetDeviceClipping for syncing the clipping region with XRender pictures.
This commit is contained in:
parent
2c725de6de
commit
14e21d955a
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue