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 APIENTRY func_name( HDC hdc ) \
16 PDC dc = DC_LockDc( hdc ); \
20 SetLastWin32Error(ERROR_INVALID_HANDLE); \
23 pdcattr = dc->pdcattr; \
24 ft = pdcattr->dc_field; \
29 /* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is
30 * important that the function has the right signature, for the implementation
31 * we can do whatever we want.
33 #define DC_GET_VAL_EX( FuncName, ret_x, ret_y, type, ax, ay ) \
34 VOID FASTCALL Int##FuncName ( PDC dc, LP##type pt) \
39 pdcattr = dc->pdcattr; \
40 pt->ax = pdcattr->ret_x; \
41 pt->ay = pdcattr->ret_y; \
45 BOOL APIENTRY 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); \
69 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
71 Status = _SEH2_GetExceptionCode(); \
74 if(!NT_SUCCESS(Status)) \
76 SetLastNtError(Status); \
83 #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
84 INT APIENTRY func_name( HDC hdc, INT mode ) \
89 if ((mode < min_val) || (mode > max_val)) \
91 SetLastWin32Error(ERROR_INVALID_PARAMETER); \
94 dc = DC_LockDc ( hdc ); \
97 SetLastWin32Error(ERROR_INVALID_HANDLE); \
100 pdcattr = dc->pdcattr; \
101 prevMode = pdcattr->dc_field; \
102 pdcattr->dc_field = mode; \
103 DC_UnlockDc ( dc ); \
110 CopytoUserDcAttr(PDC dc
, PDC_ATTR pdcattr
)
112 NTSTATUS Status
= STATUS_SUCCESS
;
113 dc
->Dc_Attr
.mxWorldToDevice
= dc
->DcLevel
.mxWorldToDevice
;
114 dc
->Dc_Attr
.mxDeviceToWorld
= dc
->DcLevel
.mxDeviceToWorld
;
115 dc
->Dc_Attr
.mxWorldToPage
= dc
->DcLevel
.mxWorldToPage
;
119 ProbeForWrite( pdcattr
,
122 RtlCopyMemory( pdcattr
,
126 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
128 Status
= _SEH2_GetExceptionCode();
137 DCU_SyncDcAttrtoUser(PDC dc
)
139 PDC_ATTR pdcattr
= dc
->pdcattr
;
141 if (pdcattr
== &dc
->Dc_Attr
) return TRUE
; // No need to copy self.
143 CopytoUserDcAttr( dc
, pdcattr
);
149 DCU_SynchDcAttrtoUser(HDC hDC
)
152 PDC pDC
= DC_LockDc ( hDC
);
153 if (!pDC
) return FALSE
;
154 Ret
= DCU_SyncDcAttrtoUser(pDC
);
160 DC_GET_VAL( INT
, IntGdiGetMapMode
, iMapMode
)
161 DC_GET_VAL( INT
, IntGdiGetPolyFillMode
, jFillMode
)
162 DC_GET_VAL( COLORREF
, IntGdiGetBkColor
, crBackgroundClr
)
163 DC_GET_VAL( INT
, IntGdiGetBkMode
, jBkMode
)
164 DC_GET_VAL( INT
, IntGdiGetROP2
, jROP2
)
165 DC_GET_VAL( INT
, IntGdiGetStretchBltMode
, jStretchBltMode
)
166 DC_GET_VAL( UINT
, IntGdiGetTextAlign
, lTextAlign
)
167 DC_GET_VAL( COLORREF
, IntGdiGetTextColor
, crForegroundClr
)
169 DC_GET_VAL_EX( GetViewportOrgEx
, ptlViewportOrg
.x
, ptlViewportOrg
.y
, POINT
, x
, y
)
170 DC_GET_VAL_EX( GetWindowExtEx
, szlWindowExt
.cx
, szlWindowExt
.cy
, SIZE
, cx
, cy
)
171 DC_GET_VAL_EX( GetWindowOrgEx
, ptlWindowOrg
.x
, ptlWindowOrg
.y
, POINT
, x
, y
)
173 DC_SET_MODE( IntGdiSetPolyFillMode
, jFillMode
, ALTERNATE
, WINDING
)
174 DC_SET_MODE( IntGdiSetROP2
, jROP2
, R2_BLACK
, R2_WHITE
)
175 DC_SET_MODE( IntGdiSetStretchBltMode
, jStretchBltMode
, BLACKONWHITE
, HALFTONE
)
180 IntGdiSetBkColor(HDC hDC
, COLORREF color
)
187 if (!(dc
= DC_LockDc(hDC
)))
189 SetLastWin32Error(ERROR_INVALID_HANDLE
);
192 pdcattr
= dc
->pdcattr
;
193 oldColor
= pdcattr
->crBackgroundClr
;
194 pdcattr
->crBackgroundClr
= color
;
195 pdcattr
->ulBackgroundClr
= (ULONG
)color
;
196 pdcattr
->ulDirty_
&= ~(DIRTY_BACKGROUND
|DIRTY_LINE
|DIRTY_FILL
); // Clear Flag if set.
197 hBrush
= pdcattr
->hbrush
;
199 NtGdiSelectBrush(hDC
, hBrush
);
204 IntGdiSetBkMode(HDC hDC
, INT Mode
)
210 if (!(dc
= DC_LockDc(hDC
)))
212 SetLastWin32Error(ERROR_INVALID_HANDLE
);
215 pdcattr
= dc
->pdcattr
;
216 oldMode
= pdcattr
->lBkMode
;
217 pdcattr
->jBkMode
= Mode
;
218 pdcattr
->lBkMode
= Mode
;
225 IntGdiSetTextAlign(HDC hDC
,
235 SetLastWin32Error(ERROR_INVALID_HANDLE
);
238 pdcattr
= dc
->pdcattr
;
239 prevAlign
= pdcattr
->lTextAlign
;
240 pdcattr
->lTextAlign
= Mode
;
247 IntGdiSetTextColor(HDC hDC
,
251 PDC dc
= DC_LockDc(hDC
);
257 SetLastWin32Error(ERROR_INVALID_HANDLE
);
260 pdcattr
= dc
->pdcattr
;
262 oldColor
= pdcattr
->crForegroundClr
;
263 pdcattr
->crForegroundClr
= color
;
264 hBrush
= pdcattr
->hbrush
;
265 pdcattr
->ulDirty_
&= ~(DIRTY_TEXT
|DIRTY_LINE
|DIRTY_FILL
);
267 NtGdiSelectBrush(hDC
, hBrush
);
273 DCU_SetDcUndeletable(HDC hDC
)
275 PDC dc
= DC_LockDc(hDC
);
278 SetLastWin32Error(ERROR_INVALID_HANDLE
);
282 dc
->fs
|= DC_FLAG_PERMANENT
;