Commit 271530b3 authored by Alexandre Julliard's avatar Alexandre Julliard

winex11: Add a SetDeviceClipping entry point to the XRender driver.

parent c582edbc
...@@ -185,7 +185,10 @@ RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp ) ...@@ -185,7 +185,10 @@ RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp )
} }
static void update_x11_clipping( X11DRV_PDEVICE *physDev, const RGNDATA *data ) /***********************************************************************
* update_x11_clipping
*/
void update_x11_clipping( X11DRV_PDEVICE *physDev, const RGNDATA *data )
{ {
wine_tsx11_lock(); wine_tsx11_lock();
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,
...@@ -193,6 +196,7 @@ static void update_x11_clipping( X11DRV_PDEVICE *physDev, const RGNDATA *data ) ...@@ -193,6 +196,7 @@ static void update_x11_clipping( X11DRV_PDEVICE *physDev, const RGNDATA *data )
wine_tsx11_unlock(); wine_tsx11_unlock();
} }
/*********************************************************************** /***********************************************************************
* add_extra_clipping_region * add_extra_clipping_region
* *
......
...@@ -280,6 +280,7 @@ extern X_PHYSBITMAP *X11DRV_init_phys_bitmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN; ...@@ -280,6 +280,7 @@ extern X_PHYSBITMAP *X11DRV_init_phys_bitmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN;
extern Pixmap X11DRV_get_pixmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN; extern Pixmap X11DRV_get_pixmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN;
extern RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp ) DECLSPEC_HIDDEN; extern RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp ) DECLSPEC_HIDDEN;
extern void update_x11_clipping( X11DRV_PDEVICE *physDev, const RGNDATA *data ) DECLSPEC_HIDDEN;
extern RGNDATA *add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn ) DECLSPEC_HIDDEN; extern RGNDATA *add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn ) DECLSPEC_HIDDEN;
extern void restore_clipping_region( X11DRV_PDEVICE *dev, RGNDATA *data ) DECLSPEC_HIDDEN; extern void restore_clipping_region( X11DRV_PDEVICE *dev, RGNDATA *data ) DECLSPEC_HIDDEN;
...@@ -300,7 +301,6 @@ extern int client_side_antialias_with_render DECLSPEC_HIDDEN; ...@@ -300,7 +301,6 @@ extern int client_side_antialias_with_render DECLSPEC_HIDDEN;
extern int using_client_side_fonts DECLSPEC_HIDDEN; extern int using_client_side_fonts DECLSPEC_HIDDEN;
extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void) DECLSPEC_HIDDEN; extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void) DECLSPEC_HIDDEN;
extern void X11DRV_XRender_Finalize(void) DECLSPEC_HIDDEN; extern void X11DRV_XRender_Finalize(void) DECLSPEC_HIDDEN;
extern void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data) DECLSPEC_HIDDEN;
extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height) DECLSPEC_HIDDEN; extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height) DECLSPEC_HIDDEN;
extern BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib) DECLSPEC_HIDDEN; extern BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib) DECLSPEC_HIDDEN;
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst, BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
......
...@@ -1132,21 +1132,45 @@ static HFONT xrenderdrv_SelectFont( PHYSDEV dev, HFONT hfont, HANDLE gdiFont ) ...@@ -1132,21 +1132,45 @@ static HFONT xrenderdrv_SelectFont( PHYSDEV dev, HFONT hfont, HANDLE gdiFont )
return 0; return 0;
} }
/*********************************************************************** static void update_xrender_clipping( struct xrender_physdev *dev, const RGNDATA *data )
* X11DRV_XRender_SetDeviceClipping
*/
void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data)
{ {
if (physDev->xrender->pict) if (dev->info.pict)
{ {
wine_tsx11_lock(); wine_tsx11_lock();
pXRenderSetPictureClipRectangles( gdi_display, physDev->xrender->pict, pXRenderSetPictureClipRectangles( gdi_display, dev->info.pict,
physDev->dc_rect.left, physDev->dc_rect.top, dev->x11dev->dc_rect.left, dev->x11dev->dc_rect.top,
(XRectangle *)data->Buffer, data->rdh.nCount ); (XRectangle *)data->Buffer, data->rdh.nCount );
wine_tsx11_unlock(); wine_tsx11_unlock();
} }
} }
static RGNDATA *add_xrender_clipping_region( struct xrender_physdev *dev, HRGN rgn )
{
RGNDATA *ret, *data;
HRGN clip;
if (!(ret = X11DRV_GetRegionData( dev->x11dev->region, 0 ))) return NULL;
if (!(clip = CreateRectRgn( 0, 0, 0, 0 )))
{
HeapFree( GetProcessHeap(), 0, ret );
return NULL;
}
CombineRgn( clip, dev->x11dev->region, rgn, RGN_AND );
if ((data = X11DRV_GetRegionData( clip, 0 )))
{
update_xrender_clipping( dev, data );
HeapFree( GetProcessHeap(), 0, data );
}
DeleteObject( clip );
return ret;
}
static void restore_xrender_clipping_region( struct xrender_physdev *dev, RGNDATA *data )
{
if (!data) return;
update_xrender_clipping( dev, data );
HeapFree( GetProcessHeap(), 0, data );
}
static BOOL create_xrender_dc( PHYSDEV *pdev ) static BOOL create_xrender_dc( PHYSDEV *pdev )
{ {
...@@ -1280,6 +1304,23 @@ static DWORD xrenderdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMA ...@@ -1280,6 +1304,23 @@ static DWORD xrenderdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMA
return dev->funcs->pPutImage( dev, hbitmap, clip, info, bits, src, dst, rop ); return dev->funcs->pPutImage( dev, hbitmap, clip, info, bits, src, dst, rop );
} }
/***********************************************************************
* xrenderdrv_SetDeviceClipping
*/
static void xrenderdrv_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip_rgn )
{
struct xrender_physdev *physdev = get_xrender_dev( dev );
RGNDATA *data;
CombineRgn( physdev->x11dev->region, vis_rgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
if (!(data = X11DRV_GetRegionData( physdev->x11dev->region, 0 ))) return;
update_x11_clipping( physdev->x11dev, data );
update_xrender_clipping( physdev, data );
HeapFree( GetProcessHeap(), 0, data );
}
BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib) BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib)
{ {
const WineXRenderFormat *fmt; const WineXRenderFormat *fmt;
...@@ -2004,13 +2045,6 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, ...@@ -2004,13 +2045,6 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
goto done_unlock; goto done_unlock;
} }
if (flags & ETO_CLIPPED)
{
HRGN clip_region = CreateRectRgnIndirect( lprect );
saved_region = add_extra_clipping_region( physdev->x11dev, clip_region );
DeleteObject( clip_region );
}
EnterCriticalSection(&xrender_cs); EnterCriticalSection(&xrender_cs);
entry = glyphsetCache + physdev->info.cache_index; entry = glyphsetCache + physdev->info.cache_index;
...@@ -2091,6 +2125,14 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, ...@@ -2091,6 +2125,14 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
desired.y = physdev->x11dev->dc_rect.top + y + offset.y; desired.y = physdev->x11dev->dc_rect.top + y + offset.y;
} }
} }
if (flags & ETO_CLIPPED)
{
HRGN clip_region = CreateRectRgnIndirect( lprect );
saved_region = add_xrender_clipping_region( physdev, clip_region );
DeleteObject( clip_region );
}
wine_tsx11_lock(); wine_tsx11_lock();
/* Make sure we don't have any transforms set from a previous call */ /* Make sure we don't have any transforms set from a previous call */
set_xrender_transformation(pict, 1, 1, 0, 0); set_xrender_transformation(pict, 1, 1, 0, 0);
...@@ -2101,8 +2143,17 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, ...@@ -2101,8 +2143,17 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
0, 0, 0, 0, elts, count); 0, 0, 0, 0, elts, count);
wine_tsx11_unlock(); wine_tsx11_unlock();
HeapFree(GetProcessHeap(), 0, elts); HeapFree(GetProcessHeap(), 0, elts);
restore_xrender_clipping_region( physdev, saved_region );
} else { } else {
POINT offset = {0, 0}; POINT offset = {0, 0};
if (flags & ETO_CLIPPED)
{
HRGN clip_region = CreateRectRgnIndirect( lprect );
saved_region = add_extra_clipping_region( physdev->x11dev, clip_region );
DeleteObject( clip_region );
}
wine_tsx11_lock(); wine_tsx11_lock();
XSetForeground( gdi_display, physdev->x11dev->gc, textPixel ); XSetForeground( gdi_display, physdev->x11dev->gc, textPixel );
...@@ -2263,11 +2314,9 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, ...@@ -2263,11 +2314,9 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
} }
no_image: no_image:
wine_tsx11_unlock(); wine_tsx11_unlock();
restore_clipping_region( physdev->x11dev, saved_region );
} }
LeaveCriticalSection(&xrender_cs); LeaveCriticalSection(&xrender_cs);
restore_clipping_region( physdev->x11dev, saved_region );
retv = TRUE; retv = TRUE;
done_unlock: done_unlock:
...@@ -2640,7 +2689,7 @@ static const struct gdi_dc_funcs xrender_funcs = ...@@ -2640,7 +2689,7 @@ static const struct gdi_dc_funcs xrender_funcs =
NULL, /* pSetDCPenColor */ NULL, /* pSetDCPenColor */
NULL, /* pSetDIBColorTable */ NULL, /* pSetDIBColorTable */
NULL, /* pSetDIBitsToDevice */ NULL, /* pSetDIBitsToDevice */
NULL, /* pSetDeviceClipping */ xrenderdrv_SetDeviceClipping, /* pSetDeviceClipping */
NULL, /* pSetDeviceGammaRamp */ NULL, /* pSetDeviceGammaRamp */
NULL, /* pSetLayout */ NULL, /* pSetLayout */
NULL, /* pSetMapMode */ NULL, /* pSetMapMode */
...@@ -2684,12 +2733,6 @@ void X11DRV_XRender_Finalize(void) ...@@ -2684,12 +2733,6 @@ void X11DRV_XRender_Finalize(void)
{ {
} }
void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data)
{
assert(0);
return;
}
void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height) void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height)
{ {
wine_tsx11_lock(); wine_tsx11_lock();
......
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