8 IntGdiSetBkColor(HDC hDC
, COLORREF color
)
15 if (!(dc
= DC_LockDc(hDC
)))
17 SetLastWin32Error(ERROR_INVALID_HANDLE
);
20 pdcattr
= dc
->pdcattr
;
21 oldColor
= pdcattr
->crBackgroundClr
;
22 pdcattr
->crBackgroundClr
= color
;
23 pdcattr
->ulBackgroundClr
= (ULONG
)color
;
24 pdcattr
->ulDirty_
&= ~(DIRTY_BACKGROUND
|DIRTY_LINE
|DIRTY_FILL
); // Clear Flag if set.
25 hBrush
= pdcattr
->hbrush
;
27 NtGdiSelectBrush(hDC
, hBrush
);
32 IntGdiSetBkMode(HDC hDC
, INT Mode
)
38 if (!(dc
= DC_LockDc(hDC
)))
40 SetLastWin32Error(ERROR_INVALID_HANDLE
);
43 pdcattr
= dc
->pdcattr
;
44 oldMode
= pdcattr
->lBkMode
;
45 pdcattr
->jBkMode
= Mode
;
46 pdcattr
->lBkMode
= Mode
;
53 IntGdiSetTextAlign(HDC hDC
,
63 SetLastWin32Error(ERROR_INVALID_HANDLE
);
66 pdcattr
= dc
->pdcattr
;
67 prevAlign
= pdcattr
->lTextAlign
;
68 pdcattr
->lTextAlign
= Mode
;
75 IntGdiSetTextColor(HDC hDC
,
79 PDC dc
= DC_LockDc(hDC
);
85 SetLastWin32Error(ERROR_INVALID_HANDLE
);
88 pdcattr
= dc
->pdcattr
;
90 oldColor
= pdcattr
->crForegroundClr
;
91 pdcattr
->crForegroundClr
= color
;
92 hBrush
= pdcattr
->hbrush
;
93 pdcattr
->ulDirty_
&= ~(DIRTY_TEXT
|DIRTY_LINE
|DIRTY_FILL
);
95 NtGdiSelectBrush(hDC
, hBrush
);
101 DCU_SetDcUndeletable(HDC hDC
)
103 PDC dc
= DC_LockDc(hDC
);
106 SetLastWin32Error(ERROR_INVALID_HANDLE
);
110 dc
->fs
|= DC_FLAG_PERMANENT
;
117 IntIsPrimarySurface(SURFOBJ
*SurfObj
)
119 if (PrimarySurface
.pSurface
== NULL
)
123 return SurfObj
->hsurf
== PrimarySurface
.pSurface
; // <- FIXME: WTF?
129 NtGdiCancelDC(HDC hDC
)
137 IntGdiSetHookFlags(HDC hDC
, WORD Flags
)
140 DC
*dc
= DC_LockDc(hDC
);
144 SetLastWin32Error(ERROR_INVALID_HANDLE
);
148 wRet
= dc
->fs
& DC_FLAG_DIRTY_RAO
; // Fixme wrong flag!
150 /* "Undocumented Windows" info is slightly confusing.
153 DPRINT("DC %p, Flags %04x\n", hDC
, Flags
);
155 if (Flags
& DCHF_INVALIDATEVISRGN
)
157 /* hVisRgn has to be updated */
158 dc
->fs
|= DC_FLAG_DIRTY_RAO
;
160 else if (Flags
& DCHF_VALIDATEVISRGN
|| 0 == Flags
)
162 dc
->fs
&= ~DC_FLAG_DIRTY_RAO
;
182 DWORD SafeResult
= 0;
183 NTSTATUS Status
= STATUS_SUCCESS
;
187 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
191 pdc
= DC_LockDc(hDC
);
194 SetLastWin32Error(ERROR_INVALID_HANDLE
);
197 pdcattr
= pdc
->pdcattr
;
205 SafeResult
= pdcattr
->lRelAbs
;
208 case GdiGetBreakExtra
:
209 SafeResult
= pdcattr
->lBreakExtra
;
212 case GdiGerCharBreak
:
213 SafeResult
= pdcattr
->cBreak
;
216 case GdiGetArcDirection
:
217 if (pdcattr
->dwLayout
& LAYOUT_RTL
)
218 SafeResult
= AD_CLOCKWISE
- ((pdc
->dclevel
.flPath
& DCPATH_CLOCKWISE
) != 0);
220 SafeResult
= ((pdc
->dclevel
.flPath
& DCPATH_CLOCKWISE
) != 0) + AD_COUNTERCLOCKWISE
;
223 case GdiGetEMFRestorDc
:
226 case GdiGetFontLanguageInfo
:
227 SafeResult
= IntGetFontLanguageInfo(pdc
);
231 SafeResult
= pdc
->dctype
;
235 SafeResult
= pdcattr
->iMapMode
;
238 case GdiGetTextCharExtra
:
239 SafeResult
= pdcattr
->lTextExtra
;
243 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
252 ProbeForWrite(Result
, sizeof(DWORD
), 1);
253 *Result
= SafeResult
;
255 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
257 Status
= _SEH2_GetExceptionCode();
261 if (!NT_SUCCESS(Status
))
263 SetLastNtError(Status
);
274 NtGdiGetAndSetDCDword(
284 DWORD SafeResult
= 0;
285 NTSTATUS Status
= STATUS_SUCCESS
;
289 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
293 pdc
= DC_LockDc(hDC
);
296 SetLastWin32Error(ERROR_INVALID_HANDLE
);
299 pdcattr
= pdc
->pdcattr
;
303 case GdiGetSetCopyCount
:
304 SafeResult
= pdc
->ulCopyCount
;
305 pdc
->ulCopyCount
= dwIn
;
308 case GdiGetSetTextAlign
:
309 SafeResult
= pdcattr
->lTextAlign
;
310 pdcattr
->lTextAlign
= dwIn
;
311 // pdcattr->flTextAlign = dwIn; // Flags!
314 case GdiGetSetRelAbs
:
315 SafeResult
= pdcattr
->lRelAbs
;
316 pdcattr
->lRelAbs
= dwIn
;
319 case GdiGetSetTextCharExtra
:
320 SafeResult
= pdcattr
->lTextExtra
;
321 pdcattr
->lTextExtra
= dwIn
;
324 case GdiGetSetSelectFont
:
327 case GdiGetSetMapperFlagsInternal
:
330 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
334 SafeResult
= pdcattr
->flFontMapper
;
335 pdcattr
->flFontMapper
= dwIn
;
338 case GdiGetSetMapMode
:
339 SafeResult
= IntGdiSetMapMode(pdc
, dwIn
);
342 case GdiGetSetArcDirection
:
343 if (dwIn
!= AD_COUNTERCLOCKWISE
&& dwIn
!= AD_CLOCKWISE
)
345 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
349 if (pdcattr
->dwLayout
& LAYOUT_RTL
) // Right to Left
351 SafeResult
= AD_CLOCKWISE
- ((pdc
->dclevel
.flPath
& DCPATH_CLOCKWISE
) != 0);
352 if (dwIn
== AD_CLOCKWISE
)
354 pdc
->dclevel
.flPath
&= ~DCPATH_CLOCKWISE
;
357 pdc
->dclevel
.flPath
|= DCPATH_CLOCKWISE
;
359 else // Left to Right
361 SafeResult
= ((pdc
->dclevel
.flPath
& DCPATH_CLOCKWISE
) != 0) +
363 if (dwIn
== AD_COUNTERCLOCKWISE
)
365 pdc
->dclevel
.flPath
&= ~DCPATH_CLOCKWISE
;
368 pdc
->dclevel
.flPath
|= DCPATH_CLOCKWISE
;
373 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
382 ProbeForWrite(Result
, sizeof(DWORD
), 1);
383 *Result
= SafeResult
;
385 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
387 Status
= _SEH2_GetExceptionCode();
391 if (!NT_SUCCESS(Status
))
393 SetLastNtError(Status
);