Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
ec54c80e
Commit
ec54c80e
authored
Mar 09, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Add null driver entry points for the clipping functions.
parent
2520a363
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
139 additions
and
121 deletions
+139
-121
clipping.c
dlls/gdi32/clipping.c
+121
-116
driver.c
dlls/gdi32/driver.c
+9
-5
gdi_private.h
dlls/gdi32/gdi_private.h
+9
-0
No files found.
dlls/gdi32/clipping.c
View file @
ec54c80e
...
...
@@ -73,6 +73,7 @@ static inline RECT get_clip_rect( DC * dc, int left, int top, int right, int bot
void
CLIPPING_UpdateGCRegion
(
DC
*
dc
)
{
HRGN
clip_rgn
;
PHYSDEV
physdev
=
GET_DC_PHYSDEV
(
dc
,
pSetDeviceClipping
);
/* update the intersection of meta and clip regions */
if
(
dc
->
hMetaRgn
&&
dc
->
hClipRgn
)
...
...
@@ -87,9 +88,7 @@ void CLIPPING_UpdateGCRegion( DC * dc )
dc
->
hMetaClipRgn
=
0
;
clip_rgn
=
dc
->
hMetaRgn
?
dc
->
hMetaRgn
:
dc
->
hClipRgn
;
}
if
(
dc
->
funcs
->
pSetDeviceClipping
)
dc
->
funcs
->
pSetDeviceClipping
(
dc
->
physDev
,
dc
->
hVisRgn
,
clip_rgn
);
physdev
->
funcs
->
pSetDeviceClipping
(
physdev
,
dc
->
hVisRgn
,
clip_rgn
);
}
/***********************************************************************
...
...
@@ -119,47 +118,24 @@ static inline void create_default_clip_region( DC * dc )
/***********************************************************************
*
SelectClipRgn (GDI32.@)
*
null driver fallback implementations
*/
INT
WINAPI
SelectClipRgn
(
HDC
hdc
,
HRGN
hrgn
)
{
return
ExtSelectClipRgn
(
hdc
,
hrgn
,
RGN_COPY
);
}
/******************************************************************************
* ExtSelectClipRgn [GDI32.@]
*/
INT
WINAPI
ExtSelectClipRgn
(
HDC
hdc
,
HRGN
hrgn
,
INT
fnMode
)
INT
CDECL
nulldrv_ExtSelectClipRgn
(
PHYSDEV
dev
,
HRGN
rgn
,
INT
mode
)
{
INT
retval
;
RECT
rect
;
DC
*
dc
=
get_dc_ptr
(
hdc
);
if
(
!
dc
)
return
ERROR
;
TRACE
(
"%p %p %d
\n
"
,
hdc
,
hrgn
,
fnMode
);
update_dc
(
dc
);
if
(
dc
->
funcs
->
pExtSelectClipRgn
)
{
retval
=
dc
->
funcs
->
pExtSelectClipRgn
(
dc
->
physDev
,
hrgn
,
fnMode
);
release_dc_ptr
(
dc
);
return
retval
;
}
DC
*
dc
=
get_nulldrv_dc
(
dev
);
INT
ret
;
if
(
!
h
rgn
)
if
(
!
rgn
)
{
if
(
fnMode
==
RGN_COPY
)
{
if
(
dc
->
hClipRgn
)
DeleteObject
(
dc
->
hClipRgn
);
dc
->
hClipRgn
=
0
;
}
else
if
(
mode
!=
RGN_COPY
)
{
FIXME
(
"Unimplemented: hrgn NULL in mode: %d
\n
"
,
fnMode
);
release_dc_ptr
(
dc
);
FIXME
(
"Unimplemented: hrgn NULL in mode: %d
\n
"
,
mode
);
return
ERROR
;
}
if
(
dc
->
hClipRgn
)
DeleteObject
(
dc
->
hClipRgn
);
dc
->
hClipRgn
=
0
;
ret
=
SIMPLEREGION
;
}
else
{
...
...
@@ -167,30 +143,106 @@ INT WINAPI ExtSelectClipRgn( HDC hdc, HRGN hrgn, INT fnMode )
if
(
dc
->
layout
&
LAYOUT_RTL
)
{
if
(
!
(
mirrored
=
CreateRectRgn
(
0
,
0
,
0
,
0
)))
{
release_dc_ptr
(
dc
);
return
ERROR
;
}
mirror_region
(
mirrored
,
hrgn
,
dc
->
vis_rect
.
right
-
dc
->
vis_rect
.
left
);
hrgn
=
mirrored
;
if
(
!
(
mirrored
=
CreateRectRgn
(
0
,
0
,
0
,
0
)))
return
ERROR
;
mirror_region
(
mirrored
,
rgn
,
dc
->
vis_rect
.
right
-
dc
->
vis_rect
.
left
);
rgn
=
mirrored
;
}
if
(
!
dc
->
hClipRgn
)
create_default_clip_region
(
dc
);
if
(
fnM
ode
==
RGN_COPY
)
CombineRgn
(
dc
->
hClipRgn
,
hrgn
,
0
,
fnM
ode
);
if
(
m
ode
==
RGN_COPY
)
ret
=
CombineRgn
(
dc
->
hClipRgn
,
rgn
,
0
,
m
ode
);
else
CombineRgn
(
dc
->
hClipRgn
,
dc
->
hClipRgn
,
hrgn
,
fnM
ode
);
ret
=
CombineRgn
(
dc
->
hClipRgn
,
dc
->
hClipRgn
,
rgn
,
m
ode
);
if
(
mirrored
)
DeleteObject
(
mirrored
);
}
CLIPPING_UpdateGCRegion
(
dc
);
release_dc_ptr
(
dc
);
return
ret
;
}
INT
CDECL
nulldrv_ExcludeClipRect
(
PHYSDEV
dev
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
)
{
DC
*
dc
=
get_nulldrv_dc
(
dev
);
RECT
rect
=
get_clip_rect
(
dc
,
left
,
top
,
right
,
bottom
);
INT
ret
;
HRGN
rgn
;
if
(
!
(
rgn
=
CreateRectRgnIndirect
(
&
rect
)))
return
ERROR
;
if
(
!
dc
->
hClipRgn
)
create_default_clip_region
(
dc
);
ret
=
CombineRgn
(
dc
->
hClipRgn
,
dc
->
hClipRgn
,
rgn
,
RGN_DIFF
);
DeleteObject
(
rgn
);
if
(
ret
!=
ERROR
)
CLIPPING_UpdateGCRegion
(
dc
);
return
ret
;
}
INT
CDECL
nulldrv_IntersectClipRect
(
PHYSDEV
dev
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
)
{
DC
*
dc
=
get_nulldrv_dc
(
dev
);
RECT
rect
=
get_clip_rect
(
dc
,
left
,
top
,
right
,
bottom
);
INT
ret
;
HRGN
rgn
;
if
(
!
dc
->
hClipRgn
)
{
dc
->
hClipRgn
=
CreateRectRgnIndirect
(
&
rect
);
ret
=
SIMPLEREGION
;
}
else
{
if
(
!
(
rgn
=
CreateRectRgnIndirect
(
&
rect
)))
return
ERROR
;
ret
=
CombineRgn
(
dc
->
hClipRgn
,
dc
->
hClipRgn
,
rgn
,
RGN_AND
);
DeleteObject
(
rgn
);
}
if
(
ret
!=
ERROR
)
CLIPPING_UpdateGCRegion
(
dc
);
return
ret
;
}
INT
CDECL
nulldrv_OffsetClipRgn
(
PHYSDEV
dev
,
INT
x
,
INT
y
)
{
DC
*
dc
=
get_nulldrv_dc
(
dev
);
INT
ret
=
NULLREGION
;
if
(
dc
->
hClipRgn
)
{
x
=
MulDiv
(
x
,
dc
->
vportExtX
,
dc
->
wndExtX
);
y
=
MulDiv
(
y
,
dc
->
vportExtY
,
dc
->
wndExtY
);
if
(
dc
->
layout
&
LAYOUT_RTL
)
x
=
-
x
;
ret
=
OffsetRgn
(
dc
->
hClipRgn
,
x
,
y
);
CLIPPING_UpdateGCRegion
(
dc
);
}
return
ret
;
}
/***********************************************************************
* SelectClipRgn (GDI32.@)
*/
INT
WINAPI
SelectClipRgn
(
HDC
hdc
,
HRGN
hrgn
)
{
return
ExtSelectClipRgn
(
hdc
,
hrgn
,
RGN_COPY
);
}
/******************************************************************************
* ExtSelectClipRgn [GDI32.@]
*/
INT
WINAPI
ExtSelectClipRgn
(
HDC
hdc
,
HRGN
hrgn
,
INT
fnMode
)
{
INT
retval
=
ERROR
;
DC
*
dc
=
get_dc_ptr
(
hdc
);
TRACE
(
"%p %p %d
\n
"
,
hdc
,
hrgn
,
fnMode
);
return
GetClipBox
(
hdc
,
&
rect
);
if
(
dc
)
{
PHYSDEV
physdev
=
GET_DC_PHYSDEV
(
dc
,
pExtSelectClipRgn
);
update_dc
(
dc
);
retval
=
physdev
->
funcs
->
pExtSelectClipRgn
(
physdev
,
hrgn
,
fnMode
);
release_dc_ptr
(
dc
);
}
return
retval
;
}
/***********************************************************************
...
...
@@ -222,26 +274,18 @@ void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect )
*/
INT
WINAPI
OffsetClipRgn
(
HDC
hdc
,
INT
x
,
INT
y
)
{
INT
ret
=
SIMPLEREGION
;
INT
ret
=
ERROR
;
DC
*
dc
=
get_dc_ptr
(
hdc
);
if
(
!
dc
)
return
ERROR
;
TRACE
(
"%p %d,%d
\n
"
,
hdc
,
x
,
y
);
update_dc
(
dc
);
if
(
dc
->
funcs
->
pOffsetClipRgn
)
if
(
dc
)
{
ret
=
dc
->
funcs
->
pOffsetClipRgn
(
dc
->
physDev
,
x
,
y
);
/* FIXME: ret is just a success flag, we should return a proper value */
}
else
if
(
dc
->
hClipRgn
)
{
x
=
MulDiv
(
x
,
dc
->
vportExtX
,
dc
->
wndExtX
);
y
=
MulDiv
(
y
,
dc
->
vportExtY
,
dc
->
wndExtY
);
if
(
dc
->
layout
&
LAYOUT_RTL
)
x
=
-
x
;
ret
=
OffsetRgn
(
dc
->
hClipRgn
,
x
,
y
);
CLIPPING_UpdateGCRegion
(
dc
);
PHYSDEV
physdev
=
GET_DC_PHYSDEV
(
dc
,
pOffsetClipRgn
);
update_dc
(
dc
);
ret
=
physdev
->
funcs
->
pOffsetClipRgn
(
physdev
,
x
,
y
);
release_dc_ptr
(
dc
);
}
release_dc_ptr
(
dc
);
return
ret
;
}
...
...
@@ -252,34 +296,18 @@ INT WINAPI OffsetClipRgn( HDC hdc, INT x, INT y )
INT
WINAPI
ExcludeClipRect
(
HDC
hdc
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
)
{
HRGN
newRgn
;
INT
ret
;
INT
ret
=
ERROR
;
DC
*
dc
=
get_dc_ptr
(
hdc
);
if
(
!
dc
)
return
ERROR
;
TRACE
(
"%p %d
x%d,%dx
%d
\n
"
,
hdc
,
left
,
top
,
right
,
bottom
);
TRACE
(
"%p %d
,%d-%d,
%d
\n
"
,
hdc
,
left
,
top
,
right
,
bottom
);
update_dc
(
dc
);
if
(
dc
->
funcs
->
pExcludeClipRect
)
{
ret
=
dc
->
funcs
->
pExcludeClipRect
(
dc
->
physDev
,
left
,
top
,
right
,
bottom
);
/* FIXME: ret is just a success flag, we should return a proper value */
}
else
if
(
dc
)
{
RECT
rect
=
get_clip_rect
(
dc
,
left
,
top
,
right
,
bottom
);
if
(
!
(
newRgn
=
CreateRectRgnIndirect
(
&
rect
)))
ret
=
ERROR
;
else
{
if
(
!
dc
->
hClipRgn
)
create_default_clip_region
(
dc
);
ret
=
CombineRgn
(
dc
->
hClipRgn
,
dc
->
hClipRgn
,
newRgn
,
RGN_DIFF
);
DeleteObject
(
newRgn
);
}
if
(
ret
!=
ERROR
)
CLIPPING_UpdateGCRegion
(
dc
);
PHYSDEV
physdev
=
GET_DC_PHYSDEV
(
dc
,
pExcludeClipRect
);
update_dc
(
dc
);
ret
=
physdev
->
funcs
->
pExcludeClipRect
(
physdev
,
left
,
top
,
right
,
bottom
);
release_dc_ptr
(
dc
);
}
release_dc_ptr
(
dc
);
return
ret
;
}
...
...
@@ -289,41 +317,18 @@ INT WINAPI ExcludeClipRect( HDC hdc, INT left, INT top,
*/
INT
WINAPI
IntersectClipRect
(
HDC
hdc
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
)
{
INT
ret
;
INT
ret
=
ERROR
;
DC
*
dc
=
get_dc_ptr
(
hdc
);
if
(
!
dc
)
return
ERROR
;
TRACE
(
"%p %d,%d - %d,%d
\n
"
,
hdc
,
left
,
top
,
right
,
bottom
);
update_dc
(
dc
);
if
(
dc
->
funcs
->
pIntersectClipRect
)
{
ret
=
dc
->
funcs
->
pIntersectClipRect
(
dc
->
physDev
,
left
,
top
,
right
,
bottom
);
/* FIXME: ret is just a success flag, we should return a proper value */
}
else
if
(
dc
)
{
RECT
rect
=
get_clip_rect
(
dc
,
left
,
top
,
right
,
bottom
);
if
(
!
dc
->
hClipRgn
)
{
dc
->
hClipRgn
=
CreateRectRgnIndirect
(
&
rect
);
ret
=
SIMPLEREGION
;
}
else
{
HRGN
newRgn
;
if
(
!
(
newRgn
=
CreateRectRgnIndirect
(
&
rect
)))
ret
=
ERROR
;
else
{
ret
=
CombineRgn
(
dc
->
hClipRgn
,
dc
->
hClipRgn
,
newRgn
,
RGN_AND
);
DeleteObject
(
newRgn
);
}
}
if
(
ret
!=
ERROR
)
CLIPPING_UpdateGCRegion
(
dc
);
PHYSDEV
physdev
=
GET_DC_PHYSDEV
(
dc
,
pIntersectClipRect
);
update_dc
(
dc
);
ret
=
physdev
->
funcs
->
pIntersectClipRect
(
physdev
,
left
,
top
,
right
,
bottom
);
release_dc_ptr
(
dc
);
}
release_dc_ptr
(
dc
);
return
ret
;
}
...
...
@@ -362,7 +367,7 @@ BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
HRGN
clip
;
DC
*
dc
=
get_dc_ptr
(
hdc
);
if
(
!
dc
)
return
FALSE
;
TRACE
(
"%p %
d,%dx%d,%d
\n
"
,
hdc
,
rect
->
left
,
rect
->
top
,
rect
->
right
,
rect
->
bottom
);
TRACE
(
"%p %
s
\n
"
,
hdc
,
wine_dbgstr_rect
(
rect
)
);
tmpRect
=
*
rect
;
LPtoDP
(
hdc
,
(
POINT
*
)
&
tmpRect
,
2
);
...
...
dlls/gdi32/driver.c
View file @
ec54c80e
...
...
@@ -408,6 +408,10 @@ static BOOL CDECL nulldrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right,
return
TRUE
;
}
static
void
CDECL
nulldrv_SetDeviceClipping
(
PHYSDEV
dev
,
HRGN
vis_rgn
,
HRGN
clip_rgn
)
{
}
static
COLORREF
CDECL
nulldrv_SetPixel
(
PHYSDEV
dev
,
INT
x
,
INT
y
,
COLORREF
color
)
{
return
color
;
...
...
@@ -450,11 +454,11 @@ const DC_FUNCTIONS null_driver =
NULL
,
/* pEndPath */
NULL
,
/* pEnumICMProfiles */
NULL
,
/* pEnumDeviceFonts */
NULL
,
/* pExcludeClipRect */
nulldrv_ExcludeClipRect
,
/* pExcludeClipRect */
NULL
,
/* pExtDeviceMode */
NULL
,
/* pExtEscape */
nulldrv_ExtFloodFill
,
/* pExtFloodFill */
NULL
,
/* pExtSelectClipRgn */
nulldrv_ExtSelectClipRgn
,
/* pExtSelectClipRgn */
NULL
,
/* pExtTextOut */
NULL
,
/* pFillPath */
nulldrv_FillRgn
,
/* pFillRgn */
...
...
@@ -473,12 +477,12 @@ const DC_FUNCTIONS null_driver =
NULL
,
/* pGetSystemPaletteEntries */
NULL
,
/* pGetTextExtentExPoint */
NULL
,
/* pGetTextMetrics */
NULL
,
/* pIntersectClipRect */
nulldrv_IntersectClipRect
,
/* pIntersectClipRect */
nulldrv_InvertRgn
,
/* pInvertRgn */
nulldrv_LineTo
,
/* pLineTo */
NULL
,
/* pModifyWorldTransform */
nulldrv_MoveTo
,
/* pMoveTo */
NULL
,
/* pOffsetClipRgn */
nulldrv_OffsetClipRgn
,
/* pOffsetClipRgn */
NULL
,
/* pOffsetViewportOrg */
NULL
,
/* pOffsetWindowOrg */
nulldrv_PaintRgn
,
/* pPaintRgn */
...
...
@@ -516,7 +520,7 @@ const DC_FUNCTIONS null_driver =
NULL
,
/* pSetDIBColorTable */
NULL
,
/* pSetDIBits */
NULL
,
/* pSetDIBitsToDevice */
NULL
,
/* pSetDeviceClipping */
nulldrv_SetDeviceClipping
,
/* pSetDeviceClipping */
NULL
,
/* pSetDeviceGammaRamp */
NULL
,
/* pSetMapMode */
NULL
,
/* pSetMapperFlags */
...
...
dlls/gdi32/gdi_private.h
View file @
ec54c80e
...
...
@@ -504,14 +504,23 @@ extern BOOL REGION_FrameRgn( HRGN dest, HRGN src, INT x, INT y ) DECLSPEC_HIDDEN
/* null driver entry points */
extern
BOOL
CDECL
nulldrv_AngleArc
(
PHYSDEV
dev
,
INT
x
,
INT
y
,
DWORD
radius
,
FLOAT
start
,
FLOAT
sweep
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_ArcTo
(
PHYSDEV
dev
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
,
INT
xstart
,
INT
ystart
,
INT
xend
,
INT
yend
)
DECLSPEC_HIDDEN
;
extern
INT
CDECL
nulldrv_ExcludeClipRect
(
PHYSDEV
dev
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
)
DECLSPEC_HIDDEN
;
extern
INT
CDECL
nulldrv_ExtSelectClipRgn
(
PHYSDEV
dev
,
HRGN
rgn
,
INT
mode
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_FillRgn
(
PHYSDEV
dev
,
HRGN
rgn
,
HBRUSH
brush
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_FrameRgn
(
PHYSDEV
dev
,
HRGN
rgn
,
HBRUSH
brush
,
INT
width
,
INT
height
)
DECLSPEC_HIDDEN
;
extern
INT
CDECL
nulldrv_IntersectClipRect
(
PHYSDEV
dev
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_InvertRgn
(
PHYSDEV
dev
,
HRGN
rgn
)
DECLSPEC_HIDDEN
;
extern
INT
CDECL
nulldrv_OffsetClipRgn
(
PHYSDEV
dev
,
INT
x
,
INT
y
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_PolyBezier
(
PHYSDEV
dev
,
const
POINT
*
points
,
DWORD
count
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_PolyBezierTo
(
PHYSDEV
dev
,
const
POINT
*
points
,
DWORD
count
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_PolyDraw
(
PHYSDEV
dev
,
const
POINT
*
points
,
const
BYTE
*
types
,
DWORD
count
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_PolylineTo
(
PHYSDEV
dev
,
const
POINT
*
points
,
INT
count
)
DECLSPEC_HIDDEN
;
static
inline
DC
*
get_nulldrv_dc
(
PHYSDEV
dev
)
{
return
CONTAINING_RECORD
(
dev
,
DC
,
nulldrv
);
}
/* Undocumented value for DIB's iUsage: Indicates a mono DIB w/o pal entries */
#define DIB_PAL_MONO 2
...
...
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