ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

dcutil.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.