8 * DC device-independent Get/SetXXX functions
9 * (RJJ) swiped from WINE
12 #define DC_GET_VAL( func_type, func_name, dc_field ) \
13 func_type STDCALL func_name( HDC hdc ) \
16 PDC dc = DC_LockDc( hdc ); \
20 SetLastWin32Error(ERROR_INVALID_HANDLE); \
23 Dc_Attr = dc->pDc_Attr; \
24 if (!Dc_Attr) Dc_Attr = &dc->Dc_Attr; \
25 ft = Dc_Attr->dc_field; \
30 /* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is
31 * important that the function has the right signature, for the implementation
32 * we can do whatever we want.
34 #define DC_GET_VAL_EX( FuncName, ret_x, ret_y, type, ax, ay ) \
35 VOID FASTCALL Int##FuncName ( PDC dc, LP##type pt) \
40 Dc_Attr = dc->pDc_Attr; \
41 if (!Dc_Attr) Dc_Attr = &dc->Dc_Attr; \
42 pt->ax = Dc_Attr->ret_x; \
43 pt->ay = Dc_Attr->ret_y; \
45 BOOL STDCALL NtGdi##FuncName ( HDC hdc, LP##type pt ) \
47 NTSTATUS Status = STATUS_SUCCESS; \
52 SetLastWin32Error(ERROR_INVALID_PARAMETER); \
55 if(!(dc = DC_LockDc(hdc))) \
57 SetLastWin32Error(ERROR_INVALID_HANDLE); \
60 Int##FuncName( dc, &Safept); \
71 Status = _SEH_GetExceptionCode(); \
74 if(!NT_SUCCESS(Status)) \
76 SetLastNtError(Status); \
82 #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
83 INT STDCALL func_name( HDC hdc, INT mode ) \
88 if ((mode < min_val) || (mode > max_val)) \
90 SetLastWin32Error(ERROR_INVALID_PARAMETER); \
93 dc = DC_LockDc ( hdc ); \
96 SetLastWin32Error(ERROR_INVALID_HANDLE); \
99 Dc_Attr = dc->pDc_Attr; \
100 if (!Dc_Attr) Dc_Attr = &dc->Dc_Attr; \
101 prevMode = Dc_Attr->dc_field; \
102 Dc_Attr->dc_field = mode; \
103 DC_UnlockDc ( dc ); \
110 CopytoUserDcAttr(PDC dc
, PDC_ATTR Dc_Attr
)
112 XForm2MatrixS( &dc
->Dc_Attr
.mxWorldToDevice
, &dc
->w
.xformWorld2Vport
);
113 XForm2MatrixS( &dc
->Dc_Attr
.mxDevicetoWorld
, &dc
->w
.xformVport2World
);
114 XForm2MatrixS( &dc
->Dc_Attr
.mxWorldToPage
, &dc
->w
.xformWorld2Wnd
);
115 MmCopyToCaller(Dc_Attr
, &dc
->Dc_Attr
, sizeof(DC_ATTR
));
121 DCU_SyncDcAttrtoUser(PDC dc
)
123 PDC_ATTR Dc_Attr
= dc
->pDc_Attr
;
125 if (Dc_Attr
== ((PDC_ATTR
)&dc
->Dc_Attr
)) return TRUE
; // No need to copy self.
127 if (!Dc_Attr
) return FALSE
;
129 CopytoUserDcAttr( dc
, Dc_Attr
);
135 DCU_SynchDcAttrtoUser(HDC hDC
)
138 PDC pDC
= DC_LockDc ( hDC
);
139 if (!pDC
) return FALSE
;
140 Ret
= DCU_SyncDcAttrtoUser(pDC
);
146 DC_GET_VAL( INT
, NtGdiGetMapMode
, iMapMode
)
147 DC_GET_VAL( INT
, NtGdiGetPolyFillMode
, jFillMode
)
148 DC_GET_VAL( COLORREF
, NtGdiGetBkColor
, crBackgroundClr
)
149 DC_GET_VAL( INT
, NtGdiGetBkMode
, jBkMode
)
150 DC_GET_VAL( INT
, NtGdiGetROP2
, jROP2
)
151 DC_GET_VAL( INT
, NtGdiGetStretchBltMode
, jStretchBltMode
)
152 DC_GET_VAL( UINT
, NtGdiGetTextAlign
, lTextAlign
)
153 DC_GET_VAL( COLORREF
, NtGdiGetTextColor
, crForegroundClr
)
155 DC_GET_VAL_EX( GetViewportExtEx
, szlViewportExt
.cx
, szlViewportExt
.cy
, SIZE
, cx
, cy
)
156 DC_GET_VAL_EX( GetViewportOrgEx
, ptlViewportOrg
.x
, ptlViewportOrg
.y
, POINT
, x
, y
)
157 DC_GET_VAL_EX( GetWindowExtEx
, szlWindowExt
.cx
, szlWindowExt
.cy
, SIZE
, cx
, cy
)
158 DC_GET_VAL_EX( GetWindowOrgEx
, ptlWindowOrg
.x
, ptlWindowOrg
.y
, POINT
, x
, y
)
160 DC_SET_MODE( NtGdiSetPolyFillMode
, jFillMode
, ALTERNATE
, WINDING
)
161 DC_SET_MODE( NtGdiSetROP2
, jROP2
, R2_BLACK
, R2_WHITE
)
162 DC_SET_MODE( NtGdiSetStretchBltMode
, jStretchBltMode
, BLACKONWHITE
, HALFTONE
)
167 NtGdiSetBkColor(HDC hDC
, COLORREF color
)
174 if (!(dc
= DC_LockDc(hDC
)))
176 SetLastWin32Error(ERROR_INVALID_HANDLE
);
179 Dc_Attr
= dc
->pDc_Attr
;
180 if (!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
181 oldColor
= Dc_Attr
->crBackgroundClr
;
182 Dc_Attr
->crBackgroundClr
= color
;
183 Dc_Attr
->ulBackgroundClr
= (ULONG
)color
;
184 Dc_Attr
->ulDirty_
&= ~DIRTY_LINE
; // Clear Flag if set.
185 hBrush
= Dc_Attr
->hbrush
;
187 NtGdiSelectBrush(hDC
, hBrush
);
192 NtGdiSetBkMode(HDC hDC
, INT Mode
)
198 if (!(dc
= DC_LockDc(hDC
)))
200 SetLastWin32Error(ERROR_INVALID_HANDLE
);
203 Dc_Attr
= dc
->pDc_Attr
;
204 if (!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
205 oldMode
= Dc_Attr
->lBkMode
;
206 Dc_Attr
->jBkMode
= Mode
;
207 Dc_Attr
->lBkMode
= Mode
;
214 NtGdiSetTextAlign(HDC hDC
,
224 SetLastWin32Error(ERROR_INVALID_HANDLE
);
227 Dc_Attr
= dc
->pDc_Attr
;
228 if(!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
229 prevAlign
= Dc_Attr
->lTextAlign
;
230 Dc_Attr
->lTextAlign
= Mode
;
237 NtGdiSetTextColor(HDC hDC
,
241 PDC dc
= DC_LockDc(hDC
);
247 SetLastWin32Error(ERROR_INVALID_HANDLE
);
250 Dc_Attr
= dc
->pDc_Attr
;
251 if(!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
253 oldColor
= Dc_Attr
->crForegroundClr
;
254 Dc_Attr
->crForegroundClr
= color
;
255 hBrush
= Dc_Attr
->hbrush
;
257 NtGdiSelectBrush(hDC
, hBrush
);
263 DCU_SetDcUndeletable(HDC hDC
)
265 PDC dc
= DC_LockDc(hDC
);
268 SetLastWin32Error(ERROR_INVALID_HANDLE
);
272 dc
->DC_Flags
|= DC_FLAG_PERMANENT
;