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,
|
XSetClipRectangles( gdi_display, physDev->gc, physDev->dc_rect.left, physDev->dc_rect.top,
|
||||||
(XRectangle *)data->Buffer, data->rdh.nCount, YXBanded );
|
(XRectangle *)data->Buffer, data->rdh.nCount, YXBanded );
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
|
|
||||||
|
if (physDev->xrender) X11DRV_XRender_SetDeviceClipping(physDev, data);
|
||||||
|
|
||||||
HeapFree( GetProcessHeap(), 0, 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_Init(void);
|
||||||
extern void X11DRV_XRender_Finalize(void);
|
extern void X11DRV_XRender_Finalize(void);
|
||||||
extern BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE*, HFONT);
|
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_DeleteDC(X11DRV_PDEVICE*);
|
||||||
extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height);
|
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,
|
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)
|
if (!info->pict && info->format)
|
||||||
{
|
{
|
||||||
XRenderPictureAttributes pa;
|
XRenderPictureAttributes pa;
|
||||||
|
RGNDATA *clip = X11DRV_GetRegionData( physDev->region, 0 );
|
||||||
|
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
pa.subwindow_mode = IncludeInferiors;
|
pa.subwindow_mode = IncludeInferiors;
|
||||||
info->pict = pXRenderCreatePicture(gdi_display, physDev->drawable, info->format->pict_format,
|
info->pict = pXRenderCreatePicture(gdi_display, physDev->drawable, info->format->pict_format,
|
||||||
CPSubwindowMode, &pa);
|
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();
|
wine_tsx11_unlock();
|
||||||
TRACE("Allocing pict=%lx dc=%p drawable=%08lx\n", info->pict, physDev->hdc, physDev->drawable);
|
TRACE("Allocing pict=%lx dc=%p drawable=%08lx\n", info->pict, physDev->hdc, physDev->drawable);
|
||||||
|
HeapFree( GetProcessHeap(), 0, clip );
|
||||||
}
|
}
|
||||||
|
|
||||||
return info->pict;
|
return info->pict;
|
||||||
|
@ -871,6 +877,21 @@ BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE *physDev, HFONT hfont)
|
||||||
return 0;
|
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
|
* 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 RECT *lprect, LPCWSTR wstr, UINT count,
|
||||||
const INT *lpDx )
|
const INT *lpDx )
|
||||||
{
|
{
|
||||||
RGNDATA *data;
|
|
||||||
XGCValues xgcval;
|
XGCValues xgcval;
|
||||||
gsCacheEntry *entry;
|
gsCacheEntry *entry;
|
||||||
gsCacheEntryFormat *formatEntry;
|
gsCacheEntryFormat *formatEntry;
|
||||||
|
@ -1586,16 +1606,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
int render_op = PictOpOver;
|
int render_op = PictOpOver;
|
||||||
Picture pict = get_xrender_picture(physDev);
|
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.
|
/* 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
|
So we pass zeros to the function and move to our starting position using the first
|
||||||
element of the elts array. */
|
element of the elts array. */
|
||||||
|
@ -2186,6 +2196,12 @@ void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE *physDev)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev)
|
||||||
|
{
|
||||||
|
assert(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
|
BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
|
||||||
const RECT *lprect, LPCWSTR wstr, UINT count,
|
const RECT *lprect, LPCWSTR wstr, UINT count,
|
||||||
const INT *lpDx )
|
const INT *lpDx )
|
||||||
|
|
Loading…
Reference in New Issue