Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendcutil.c
Go to the documentation of this file.
00001 #include <win32k.h> 00002 00003 #define NDEBUG 00004 #include <debug.h> 00005 00006 COLORREF FASTCALL 00007 IntGdiSetBkColor(HDC hDC, COLORREF color) 00008 { 00009 COLORREF oldColor; 00010 PDC dc; 00011 PDC_ATTR pdcattr; 00012 HBRUSH hBrush; 00013 00014 if (!(dc = DC_LockDc(hDC))) 00015 { 00016 EngSetLastError(ERROR_INVALID_HANDLE); 00017 return CLR_INVALID; 00018 } 00019 pdcattr = dc->pdcattr; 00020 oldColor = pdcattr->crBackgroundClr; 00021 pdcattr->crBackgroundClr = color; 00022 pdcattr->ulBackgroundClr = (ULONG)color; 00023 pdcattr->ulDirty_ |= DIRTY_BACKGROUND|DIRTY_LINE|DIRTY_FILL; // Clear Flag if set. 00024 hBrush = pdcattr->hbrush; 00025 DC_UnlockDc(dc); 00026 NtGdiSelectBrush(hDC, hBrush); 00027 return oldColor; 00028 } 00029 00030 INT FASTCALL 00031 IntGdiSetBkMode(HDC hDC, INT Mode) 00032 { 00033 COLORREF oldMode; 00034 PDC dc; 00035 PDC_ATTR pdcattr; 00036 00037 if (!(dc = DC_LockDc(hDC))) 00038 { 00039 EngSetLastError(ERROR_INVALID_HANDLE); 00040 return CLR_INVALID; 00041 } 00042 pdcattr = dc->pdcattr; 00043 oldMode = pdcattr->lBkMode; 00044 pdcattr->jBkMode = Mode; 00045 pdcattr->lBkMode = Mode; 00046 DC_UnlockDc(dc); 00047 return oldMode; 00048 } 00049 00050 UINT 00051 FASTCALL 00052 IntGdiSetTextAlign(HDC hDC, 00053 UINT Mode) 00054 { 00055 UINT prevAlign; 00056 DC *dc; 00057 PDC_ATTR pdcattr; 00058 00059 dc = DC_LockDc(hDC); 00060 if (!dc) 00061 { 00062 EngSetLastError(ERROR_INVALID_HANDLE); 00063 return GDI_ERROR; 00064 } 00065 pdcattr = dc->pdcattr; 00066 prevAlign = pdcattr->lTextAlign; 00067 pdcattr->lTextAlign = Mode; 00068 DC_UnlockDc(dc); 00069 return prevAlign; 00070 } 00071 00072 COLORREF 00073 FASTCALL 00074 IntGdiSetTextColor(HDC hDC, 00075 COLORREF color) 00076 { 00077 COLORREF crOldColor; 00078 PDC pdc; 00079 PDC_ATTR pdcattr; 00080 00081 pdc = DC_LockDc(hDC); 00082 if (!pdc) 00083 { 00084 EngSetLastError(ERROR_INVALID_HANDLE); 00085 return CLR_INVALID; 00086 } 00087 pdcattr = pdc->pdcattr; 00088 00089 // What about ulForegroundClr, like in gdi32? 00090 crOldColor = pdcattr->crForegroundClr; 00091 pdcattr->crForegroundClr = color; 00092 DC_vUpdateTextBrush(pdc); 00093 00094 DC_UnlockDc(pdc); 00095 00096 return crOldColor; 00097 } 00098 00099 VOID 00100 FASTCALL 00101 DCU_SetDcUndeletable(HDC hDC) 00102 { 00103 PDC dc = DC_LockDc(hDC); 00104 if (!dc) 00105 { 00106 EngSetLastError(ERROR_INVALID_HANDLE); 00107 return; 00108 } 00109 00110 dc->fs |= DC_FLAG_PERMANENT; 00111 DC_UnlockDc(dc); 00112 return; 00113 } 00114 00115 #if 0 00116 BOOL FASTCALL 00117 IntIsPrimarySurface(SURFOBJ *SurfObj) 00118 { 00119 if (PrimarySurface.pSurface == NULL) 00120 { 00121 return FALSE; 00122 } 00123 return SurfObj->hsurf == PrimarySurface.pSurface; // <- FIXME: WTF? 00124 } 00125 #endif 00126 00127 BOOL 00128 FASTCALL 00129 IntSetDefaultRegion(PDC pdc) 00130 { 00131 PSURFACE pSurface; 00132 PROSRGNDATA prgn; 00133 RECTL rclWnd, rclClip; 00134 00135 IntGdiReleaseRaoRgn(pdc); 00136 00137 rclWnd.left = 0; 00138 rclWnd.top = 0; 00139 rclWnd.right = pdc->dclevel.sizl.cx; 00140 rclWnd.bottom = pdc->dclevel.sizl.cy; 00141 rclClip = rclWnd; 00142 00143 //EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock); 00144 if (pdc->ppdev->flFlags & PDEV_META_DEVICE) 00145 { 00146 pSurface = pdc->dclevel.pSurface; 00147 if (pSurface && pSurface->flags & PDEV_SURFACE) 00148 { 00149 rclClip.left += pdc->ppdev->ptlOrigion.x; 00150 rclClip.top += pdc->ppdev->ptlOrigion.y; 00151 rclClip.right += pdc->ppdev->ptlOrigion.x; 00152 rclClip.bottom += pdc->ppdev->ptlOrigion.y; 00153 } 00154 } 00155 //EngReleaseSemaphore(pdc->ppdev->hsemDevLock); 00156 00157 prgn = pdc->prgnVis; 00158 00159 if (prgn && prgn != prgnDefault) 00160 { 00161 REGION_SetRectRgn( prgn, 00162 rclClip.left, 00163 rclClip.top, 00164 rclClip.right , 00165 rclClip.bottom ); 00166 } 00167 else 00168 { 00169 prgn = IntSysCreateRectpRgn( rclClip.left, 00170 rclClip.top, 00171 rclClip.right , 00172 rclClip.bottom ); 00173 pdc->prgnVis = prgn; 00174 } 00175 00176 if (prgn) 00177 { 00178 pdc->ptlDCOrig.x = 0; 00179 pdc->ptlDCOrig.y = 0; 00180 pdc->erclWindow = rclWnd; 00181 pdc->erclClip = rclClip; 00182 /* Might be an InitDC or DCE... */ 00183 pdc->ptlFillOrigin.x = pdc->dcattr.VisRectRegion.Rect.right; 00184 pdc->ptlFillOrigin.y = pdc->dcattr.VisRectRegion.Rect.bottom; 00185 return TRUE; 00186 } 00187 00188 pdc->prgnVis = prgnDefault; 00189 return FALSE; 00190 } 00191 00192 00193 BOOL APIENTRY 00194 NtGdiCancelDC(HDC hDC) 00195 { 00196 UNIMPLEMENTED; 00197 return FALSE; 00198 } 00199 00200 00201 WORD APIENTRY 00202 IntGdiSetHookFlags(HDC hDC, WORD Flags) 00203 { 00204 WORD wRet; 00205 DC *dc = DC_LockDc(hDC); 00206 00207 if (NULL == dc) 00208 { 00209 EngSetLastError(ERROR_INVALID_HANDLE); 00210 return 0; 00211 } 00212 00213 wRet = dc->fs & DC_FLAG_DIRTY_RAO; // FIXME: Wrong flag! 00214 00215 /* Info in "Undocumented Windows" is slightly confusing. */ 00216 DPRINT("DC %p, Flags %04x\n", hDC, Flags); 00217 00218 if (Flags & DCHF_INVALIDATEVISRGN) 00219 { 00220 /* hVisRgn has to be updated */ 00221 dc->fs |= DC_FLAG_DIRTY_RAO; 00222 } 00223 else if (Flags & DCHF_VALIDATEVISRGN || 0 == Flags) 00224 { 00225 dc->fs &= ~DC_FLAG_DIRTY_RAO; 00226 } 00227 00228 DC_UnlockDc(dc); 00229 00230 return wRet; 00231 } 00232 00233 00234 BOOL 00235 APIENTRY 00236 NtGdiGetDCDword( 00237 HDC hDC, 00238 UINT u, 00239 DWORD *Result) 00240 { 00241 BOOL Ret = TRUE; 00242 PDC pdc; 00243 PDC_ATTR pdcattr; 00244 00245 DWORD SafeResult = 0; 00246 NTSTATUS Status = STATUS_SUCCESS; 00247 00248 if (!Result) 00249 { 00250 EngSetLastError(ERROR_INVALID_PARAMETER); 00251 return FALSE; 00252 } 00253 00254 pdc = DC_LockDc(hDC); 00255 if (!pdc) 00256 { 00257 EngSetLastError(ERROR_INVALID_HANDLE); 00258 return FALSE; 00259 } 00260 pdcattr = pdc->pdcattr; 00261 00262 switch (u) 00263 { 00264 case GdiGetJournal: 00265 break; 00266 00267 case GdiGetRelAbs: 00268 SafeResult = pdcattr->lRelAbs; 00269 break; 00270 00271 case GdiGetBreakExtra: 00272 SafeResult = pdcattr->lBreakExtra; 00273 break; 00274 00275 case GdiGerCharBreak: 00276 SafeResult = pdcattr->cBreak; 00277 break; 00278 00279 case GdiGetArcDirection: 00280 if (pdcattr->dwLayout & LAYOUT_RTL) 00281 SafeResult = AD_CLOCKWISE - ((pdc->dclevel.flPath & DCPATH_CLOCKWISE) != 0); 00282 else 00283 SafeResult = ((pdc->dclevel.flPath & DCPATH_CLOCKWISE) != 0) + AD_COUNTERCLOCKWISE; 00284 break; 00285 00286 case GdiGetEMFRestorDc: 00287 break; 00288 00289 case GdiGetFontLanguageInfo: 00290 SafeResult = IntGetFontLanguageInfo(pdc); 00291 break; 00292 00293 case GdiGetIsMemDc: 00294 SafeResult = pdc->dctype; 00295 break; 00296 00297 case GdiGetMapMode: 00298 SafeResult = pdcattr->iMapMode; 00299 break; 00300 00301 case GdiGetTextCharExtra: 00302 SafeResult = pdcattr->lTextExtra; 00303 break; 00304 00305 default: 00306 EngSetLastError(ERROR_INVALID_PARAMETER); 00307 Ret = FALSE; 00308 break; 00309 } 00310 00311 if (Ret) 00312 { 00313 _SEH2_TRY 00314 { 00315 ProbeForWrite(Result, sizeof(DWORD), 1); 00316 *Result = SafeResult; 00317 } 00318 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00319 { 00320 Status = _SEH2_GetExceptionCode(); 00321 } 00322 _SEH2_END; 00323 00324 if (!NT_SUCCESS(Status)) 00325 { 00326 SetLastNtError(Status); 00327 Ret = FALSE; 00328 } 00329 } 00330 00331 DC_UnlockDc(pdc); 00332 return Ret; 00333 } 00334 00335 BOOL 00336 APIENTRY 00337 NtGdiGetAndSetDCDword( 00338 HDC hDC, 00339 UINT u, 00340 DWORD dwIn, 00341 DWORD *Result) 00342 { 00343 BOOL Ret = TRUE; 00344 PDC pdc; 00345 PDC_ATTR pdcattr; 00346 00347 DWORD SafeResult = 0; 00348 NTSTATUS Status = STATUS_SUCCESS; 00349 00350 if (!Result) 00351 { 00352 EngSetLastError(ERROR_INVALID_PARAMETER); 00353 return FALSE; 00354 } 00355 00356 pdc = DC_LockDc(hDC); 00357 if (!pdc) 00358 { 00359 EngSetLastError(ERROR_INVALID_HANDLE); 00360 return FALSE; 00361 } 00362 pdcattr = pdc->pdcattr; 00363 00364 switch (u) 00365 { 00366 case GdiGetSetCopyCount: 00367 SafeResult = pdc->ulCopyCount; 00368 pdc->ulCopyCount = dwIn; 00369 break; 00370 00371 case GdiGetSetTextAlign: 00372 SafeResult = pdcattr->lTextAlign; 00373 pdcattr->lTextAlign = dwIn; 00374 // pdcattr->flTextAlign = dwIn; // Flags! 00375 break; 00376 00377 case GdiGetSetRelAbs: 00378 SafeResult = pdcattr->lRelAbs; 00379 pdcattr->lRelAbs = dwIn; 00380 break; 00381 00382 case GdiGetSetTextCharExtra: 00383 SafeResult = pdcattr->lTextExtra; 00384 pdcattr->lTextExtra = dwIn; 00385 break; 00386 00387 case GdiGetSetSelectFont: 00388 break; 00389 00390 case GdiGetSetMapperFlagsInternal: 00391 if (dwIn & ~1) 00392 { 00393 EngSetLastError(ERROR_INVALID_PARAMETER); 00394 Ret = FALSE; 00395 break; 00396 } 00397 SafeResult = pdcattr->flFontMapper; 00398 pdcattr->flFontMapper = dwIn; 00399 break; 00400 00401 case GdiGetSetMapMode: 00402 SafeResult = IntGdiSetMapMode(pdc, dwIn); 00403 break; 00404 00405 case GdiGetSetArcDirection: 00406 if (dwIn != AD_COUNTERCLOCKWISE && dwIn != AD_CLOCKWISE) 00407 { 00408 EngSetLastError(ERROR_INVALID_PARAMETER); 00409 Ret = FALSE; 00410 break; 00411 } 00412 if (pdcattr->dwLayout & LAYOUT_RTL) // Right to Left 00413 { 00414 SafeResult = AD_CLOCKWISE - ((pdc->dclevel.flPath & DCPATH_CLOCKWISE) != 0); 00415 if (dwIn == AD_CLOCKWISE) 00416 { 00417 pdc->dclevel.flPath &= ~DCPATH_CLOCKWISE; 00418 break; 00419 } 00420 pdc->dclevel.flPath |= DCPATH_CLOCKWISE; 00421 } 00422 else // Left to Right 00423 { 00424 SafeResult = ((pdc->dclevel.flPath & DCPATH_CLOCKWISE) != 0) + 00425 AD_COUNTERCLOCKWISE; 00426 if (dwIn == AD_COUNTERCLOCKWISE) 00427 { 00428 pdc->dclevel.flPath &= ~DCPATH_CLOCKWISE; 00429 break; 00430 } 00431 pdc->dclevel.flPath |= DCPATH_CLOCKWISE; 00432 } 00433 break; 00434 00435 default: 00436 EngSetLastError(ERROR_INVALID_PARAMETER); 00437 Ret = FALSE; 00438 break; 00439 } 00440 00441 if (Ret) 00442 { 00443 _SEH2_TRY 00444 { 00445 ProbeForWrite(Result, sizeof(DWORD), 1); 00446 *Result = SafeResult; 00447 } 00448 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00449 { 00450 Status = _SEH2_GetExceptionCode(); 00451 } 00452 _SEH2_END; 00453 00454 if (!NT_SUCCESS(Status)) 00455 { 00456 SetLastNtError(Status); 00457 Ret = FALSE; 00458 } 00459 } 00460 00461 DC_UnlockDc(pdc); 00462 return Ret; 00463 } 00464 00465 DWORD 00466 APIENTRY 00467 NtGdiGetBoundsRect( 00468 IN HDC hdc, 00469 OUT LPRECT prc, 00470 IN DWORD flags) 00471 { 00472 DWORD ret; 00473 PDC pdc; 00474 00475 /* Lock the DC */ 00476 if (!(pdc = DC_LockDc(hdc))) return 0; 00477 00478 /* Get the return value */ 00479 ret = pdc->fs & DC_ACCUM_APP ? DCB_ENABLE : DCB_DISABLE; 00480 ret |= RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? DCB_RESET : DCB_SET; 00481 00482 /* Copy the rect to the caller */ 00483 _SEH2_TRY 00484 { 00485 ProbeForWrite(prc, sizeof(RECT), 1); 00486 *prc = pdc->erclBoundsApp; 00487 } 00488 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00489 { 00490 ret = 0; 00491 } 00492 _SEH2_END; 00493 00494 if (flags & DCB_RESET) 00495 { 00496 RECTL_vSetEmptyRect(&pdc->erclBoundsApp); 00497 } 00498 00499 DC_UnlockDc(pdc); 00500 return ret; 00501 } 00502 00503 00504 DWORD 00505 APIENTRY 00506 NtGdiSetBoundsRect( 00507 IN HDC hdc, 00508 IN LPRECT prc, 00509 IN DWORD flags) 00510 { 00511 DWORD ret; 00512 PDC pdc; 00513 RECTL rcl; 00514 00515 /* Verify arguments */ 00516 if ((flags & DCB_ENABLE) && (flags & DCB_DISABLE)) return 0; 00517 00518 /* Lock the DC */ 00519 if (!(pdc = DC_LockDc(hdc))) return 0; 00520 00521 /* Get the return value */ 00522 ret = pdc->fs & DC_ACCUM_APP ? DCB_ENABLE : DCB_DISABLE; 00523 ret |= RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? DCB_RESET : DCB_SET; 00524 00525 if (flags & DCB_RESET) 00526 { 00527 RECTL_vSetEmptyRect(&pdc->erclBoundsApp); 00528 } 00529 00530 if (flags & DCB_ACCUMULATE) 00531 { 00532 /* Capture the rect */ 00533 _SEH2_TRY 00534 { 00535 ProbeForRead(prc, sizeof(RECT), 1); 00536 rcl = *prc; 00537 } 00538 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00539 { 00540 DC_UnlockDc(pdc); 00541 _SEH2_YIELD(return 0;) 00542 } 00543 _SEH2_END; 00544 00545 RECTL_vMakeWellOrdered(&rcl); 00546 RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, &rcl); 00547 } 00548 00549 if (flags & DCB_ENABLE) pdc->fs |= DC_ACCUM_APP; 00550 if (flags & DCB_DISABLE) pdc->fs &= ~DC_ACCUM_APP; 00551 DC_UnlockDc(pdc); 00552 return ret; 00553 } Generated on Mon May 28 2012 04:38:10 for ReactOS by
1.7.6.1
|