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 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; \
47 BOOL APIENTRY NtGdi
##FuncName ( HDC hdc, LP##type pt ) \
49 NTSTATUS Status = STATUS_SUCCESS; \
54 SetLastWin32Error(ERROR_INVALID_PARAMETER); \
57 if(!(dc = DC_LockDc(hdc))) \
59 SetLastWin32Error(ERROR_INVALID_HANDLE); \
62 Int##FuncName( dc, &Safept); \
73 Status = _SEH_GetExceptionCode(); \
76 if(!NT_SUCCESS(Status)) \
78 SetLastNtError(Status); \
85 #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
86 INT APIENTRY func_name( HDC hdc, INT mode ) \
91 if ((mode < min_val) || (mode > max_val)) \
93 SetLastWin32Error(ERROR_INVALID_PARAMETER); \
96 dc = DC_LockDc ( hdc ); \
99 SetLastWin32Error(ERROR_INVALID_HANDLE); \
102 Dc_Attr = dc->pDc_Attr; \
103 if (!Dc_Attr) Dc_Attr = &dc->Dc_Attr; \
104 prevMode = Dc_Attr->dc_field; \
105 Dc_Attr->dc_field = mode; \
106 DC_UnlockDc ( dc ); \
113 CopytoUserDcAttr(PDC dc
, PDC_ATTR Dc_Attr
)
115 NTSTATUS Status
= STATUS_SUCCESS
;
116 dc
->Dc_Attr
.mxWorldToDevice
= dc
->DcLevel
.mxWorldToDevice
;
117 dc
->Dc_Attr
.mxDeviceToWorld
= dc
->DcLevel
.mxDeviceToWorld
;
118 dc
->Dc_Attr
.mxWorldToPage
= dc
->DcLevel
.mxWorldToPage
;
122 ProbeForWrite( Dc_Attr
,
125 RtlCopyMemory( Dc_Attr
,
131 Status
= _SEH_GetExceptionCode();
139 DCU_SyncDcAttrtoUser(PDC dc
)
141 PDC_ATTR Dc_Attr
= dc
->pDc_Attr
;
143 if (Dc_Attr
== ((PDC_ATTR
)&dc
->Dc_Attr
)) return TRUE
; // No need to copy self.
145 if (!Dc_Attr
) return FALSE
;
147 CopytoUserDcAttr( dc
, Dc_Attr
);
153 DCU_SynchDcAttrtoUser(HDC hDC
)
156 PDC pDC
= DC_LockDc ( hDC
);
157 if (!pDC
) return FALSE
;
158 Ret
= DCU_SyncDcAttrtoUser(pDC
);
164 DC_GET_VAL( INT
, IntGdiGetMapMode
, iMapMode
)
165 DC_GET_VAL( INT
, IntGdiGetPolyFillMode
, jFillMode
)
166 DC_GET_VAL( COLORREF
, IntGdiGetBkColor
, crBackgroundClr
)
167 DC_GET_VAL( INT
, IntGdiGetBkMode
, jBkMode
)
168 DC_GET_VAL( INT
, IntGdiGetROP2
, jROP2
)
169 DC_GET_VAL( INT
, IntGdiGetStretchBltMode
, jStretchBltMode
)
170 DC_GET_VAL( UINT
, IntGdiGetTextAlign
, lTextAlign
)
171 DC_GET_VAL( COLORREF
, IntGdiGetTextColor
, crForegroundClr
)
173 DC_GET_VAL_EX( GetViewportExtEx
, szlViewportExt
.cx
, szlViewportExt
.cy
, SIZE
, cx
, cy
)
174 DC_GET_VAL_EX( GetViewportOrgEx
, ptlViewportOrg
.x
, ptlViewportOrg
.y
, POINT
, x
, y
)
175 DC_GET_VAL_EX( GetWindowExtEx
, szlWindowExt
.cx
, szlWindowExt
.cy
, SIZE
, cx
, cy
)
176 DC_GET_VAL_EX( GetWindowOrgEx
, ptlWindowOrg
.x
, ptlWindowOrg
.y
, POINT
, x
, y
)
178 DC_SET_MODE( IntGdiSetPolyFillMode
, jFillMode
, ALTERNATE
, WINDING
)
179 DC_SET_MODE( IntGdiSetROP2
, jROP2
, R2_BLACK
, R2_WHITE
)
180 DC_SET_MODE( IntGdiSetStretchBltMode
, jStretchBltMode
, BLACKONWHITE
, HALFTONE
)
185 IntGdiSetBkColor(HDC hDC
, COLORREF color
)
192 if (!(dc
= DC_LockDc(hDC
)))
194 SetLastWin32Error(ERROR_INVALID_HANDLE
);
197 Dc_Attr
= dc
->pDc_Attr
;
198 if (!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
199 oldColor
= Dc_Attr
->crBackgroundClr
;
200 Dc_Attr
->crBackgroundClr
= color
;
201 Dc_Attr
->ulBackgroundClr
= (ULONG
)color
;
202 Dc_Attr
->ulDirty_
&= ~(DIRTY_BACKGROUND
|DIRTY_LINE
|DIRTY_FILL
); // Clear Flag if set.
203 hBrush
= Dc_Attr
->hbrush
;
205 NtGdiSelectBrush(hDC
, hBrush
);
210 IntGdiSetBkMode(HDC hDC
, INT Mode
)
216 if (!(dc
= DC_LockDc(hDC
)))
218 SetLastWin32Error(ERROR_INVALID_HANDLE
);
221 Dc_Attr
= dc
->pDc_Attr
;
222 if (!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
223 oldMode
= Dc_Attr
->lBkMode
;
224 Dc_Attr
->jBkMode
= Mode
;
225 Dc_Attr
->lBkMode
= Mode
;
232 IntGdiSetTextAlign(HDC hDC
,
242 SetLastWin32Error(ERROR_INVALID_HANDLE
);
245 Dc_Attr
= dc
->pDc_Attr
;
246 if(!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
247 prevAlign
= Dc_Attr
->lTextAlign
;
248 Dc_Attr
->lTextAlign
= Mode
;
255 IntGdiSetTextColor(HDC hDC
,
259 PDC dc
= DC_LockDc(hDC
);
265 SetLastWin32Error(ERROR_INVALID_HANDLE
);
268 Dc_Attr
= dc
->pDc_Attr
;
269 if(!Dc_Attr
) Dc_Attr
= &dc
->Dc_Attr
;
271 oldColor
= Dc_Attr
->crForegroundClr
;
272 Dc_Attr
->crForegroundClr
= color
;
273 hBrush
= Dc_Attr
->hbrush
;
274 Dc_Attr
->ulDirty_
&= ~(DIRTY_TEXT
|DIRTY_LINE
|DIRTY_FILL
);
276 NtGdiSelectBrush(hDC
, hBrush
);
282 DCU_SetDcUndeletable(HDC hDC
)
284 PDC dc
= DC_LockDc(hDC
);
287 SetLastWin32Error(ERROR_INVALID_HANDLE
);
291 dc
->DC_Flags
|= DC_FLAG_PERMANENT
;