Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
271530b3
Commit
271530b3
authored
Sep 13, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winex11: Add a SetDeviceClipping entry point to the XRender driver.
parent
c582edbc
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
73 additions
and
26 deletions
+73
-26
graphics.c
dlls/winex11.drv/graphics.c
+5
-1
x11drv.h
dlls/winex11.drv/x11drv.h
+1
-1
xrender.c
dlls/winex11.drv/xrender.c
+67
-24
No files found.
dlls/winex11.drv/graphics.c
View file @
271530b3
...
@@ -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
*
*
...
...
dlls/winex11.drv/x11drv.h
View file @
271530b3
...
@@ -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
,
...
...
dlls/winex11.drv/xrender.c
View file @
271530b3
...
@@ -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
,
physD
ev
->
dc_rect
.
top
,
dev
->
x11dev
->
dc_rect
.
left
,
dev
->
x11d
ev
->
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
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment