static void DC_vUpdateDC(PDC pdc) { // PREGION VisRgn ; PPDEVOBJ ppdev = pdc->ppdev ; pdc->dhpdev = ppdev->dhpdev; SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface); pdc->dclevel.pSurface = PDEVOBJ_pSurface(ppdev); PDEVOBJ_sizl(pdc->ppdev, &pdc->dclevel.sizl); #if 0 VisRgn = IntSysCreateRectpRgn(0, 0, pdc->dclevel.sizl.cx, pdc->dclevel.sizl.cy); ASSERT(VisRgn); GdiSelectVisRgn(pdc->BaseObject.hHmgr, VisRgn); REGION_Delete(VisRgn); #endif pdc->flGraphicsCaps = ppdev->devinfo.flGraphicsCaps; pdc->flGraphicsCaps2 = ppdev->devinfo.flGraphicsCaps2; /* Mark EBRUSHOBJs as dirty */ pdc->pdcattr->ulDirty_ |= DIRTY_DEFAULT ; }
VOID FASTCALL co_VIS_WindowLayoutChanged( PWND Wnd, PREGION NewlyExposed) { PWND Parent; USER_REFERENCE_ENTRY Ref; ASSERT_REFS_CO(Wnd); Parent = Wnd->spwndParent; if(Parent) { PREGION TempRgn = IntSysCreateRectpRgn(0, 0, 0, 0); if (!TempRgn) return; IntGdiCombineRgn(TempRgn, NewlyExposed, NULL, RGN_COPY); REGION_bOffsetRgn(TempRgn, Wnd->rcWindow.left - Parent->rcClient.left, Wnd->rcWindow.top - Parent->rcClient.top); UserRefObjectCo(Parent, &Ref); co_UserRedrawWindow(Parent, NULL, TempRgn, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); UserDerefObjectCo(Parent); REGION_Delete(TempRgn); } }
INT FASTCALL GdiGetClipBox(HDC hDC, PRECTL rc) { INT retval; PDC dc; PROSRGNDATA pRgnNew, pRgn = NULL; BOOL Unlock = FALSE; //Small hack if (!(dc = DC_LockDc(hDC))) { return ERROR; } /* FIXME! Rao and Vis only! */ if (dc->prgnAPI) // APIRGN { pRgn = dc->prgnAPI; } else if (dc->dclevel.prgnMeta) // METARGN { pRgn = dc->dclevel.prgnMeta; } else if (dc->rosdc.hClipRgn) { Unlock = TRUE ; pRgn = REGION_LockRgn(dc->rosdc.hClipRgn); // CLIPRGN } if (pRgn) { pRgnNew = IntSysCreateRectpRgn( 0, 0, 0, 0 ); if (!pRgnNew) { DC_UnlockDc(dc); if(Unlock) REGION_UnlockRgn(pRgn); return ERROR; } IntGdiCombineRgn(pRgnNew, dc->prgnVis, pRgn, RGN_AND); retval = REGION_GetRgnBox(pRgnNew, rc); REGION_Delete(pRgnNew); DC_UnlockDc(dc); if(Unlock) REGION_UnlockRgn(pRgn); return retval; } retval = REGION_GetRgnBox(dc->prgnVis, rc); IntDPtoLP(dc, (LPPOINT)rc, 2); DC_UnlockDc(dc); return retval; }
int FASTCALL IntGdiSetMetaRgn(PDC pDC) { INT Ret = ERROR; PROSRGNDATA TempRgn; if ( pDC->dclevel.prgnMeta ) { if ( pDC->dclevel.prgnClip ) { TempRgn = IntSysCreateRectpRgn(0,0,0,0); if (TempRgn) { Ret = IntGdiCombineRgn( TempRgn, pDC->dclevel.prgnMeta, pDC->dclevel.prgnClip, RGN_AND); if ( Ret ) { GDIOBJ_vDereferenceObject(&pDC->dclevel.prgnMeta->BaseObject); if (!((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.ulShareCount) REGION_Delete(pDC->dclevel.prgnMeta); pDC->dclevel.prgnMeta = TempRgn; GDIOBJ_vDereferenceObject(&pDC->dclevel.prgnClip->BaseObject); if (!((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.ulShareCount) REGION_Delete(pDC->dclevel.prgnClip); pDC->dclevel.prgnClip = NULL; IntGdiReleaseRaoRgn(pDC); } else REGION_Delete(TempRgn); } } else Ret = REGION_Complexity(pDC->dclevel.prgnMeta); } else { if ( pDC->dclevel.prgnClip ) { Ret = REGION_Complexity(pDC->dclevel.prgnClip); pDC->dclevel.prgnMeta = pDC->dclevel.prgnClip; pDC->dclevel.prgnClip = NULL; } else Ret = SIMPLEREGION; } return Ret; }
VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To) { DPRINT("DC_vCopyState(%p, %p)\n", pdcSrc->BaseObject.hHmgr, pdcDst->BaseObject.hHmgr); /* Copy full DC attribute */ *pdcDst->pdcattr = *pdcSrc->pdcattr; /* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows" p.559). */ /* The VisRectRegion field needs to be set to a valid state */ /* Mark some fields as dirty */ pdcDst->pdcattr->ulDirty_ |= (DIRTY_FILL|DIRTY_LINE|DIRTY_TEXT|DIRTY_BACKGROUND|DIRTY_CHARSET|DC_ICM_NOT_CALIBRATED|DC_ICM_NOT_SET); // Note: Use if, To is FALSE.... /* Copy DC level */ pdcDst->dclevel.pColorSpace = pdcSrc->dclevel.pColorSpace; pdcDst->dclevel.laPath = pdcSrc->dclevel.laPath; pdcDst->dclevel.ca = pdcSrc->dclevel.ca; pdcDst->dclevel.mxWorldToDevice = pdcSrc->dclevel.mxWorldToDevice; pdcDst->dclevel.mxDeviceToWorld = pdcSrc->dclevel.mxDeviceToWorld; pdcDst->dclevel.mxWorldToPage = pdcSrc->dclevel.mxWorldToPage; pdcDst->dclevel.efM11PtoD = pdcSrc->dclevel.efM11PtoD; pdcDst->dclevel.efM22PtoD = pdcSrc->dclevel.efM22PtoD; pdcDst->dclevel.sizl = pdcSrc->dclevel.sizl; pdcDst->dclevel.hpal = pdcSrc->dclevel.hpal; /* Handle references here correctly */ DC_vSelectFillBrush(pdcDst, pdcSrc->dclevel.pbrFill); DC_vSelectLineBrush(pdcDst, pdcSrc->dclevel.pbrLine); DC_vSelectPalette(pdcDst, pdcSrc->dclevel.ppal); /* Dereference the old font, reference the new one */ if (pdcDst->dclevel.plfnt) LFONT_ShareUnlockFont(pdcDst->dclevel.plfnt); /// @todo should aways be != NULL GDIOBJ_vReferenceObjectByPointer(&pdcSrc->dclevel.plfnt->BaseObject); pdcDst->dclevel.plfnt = pdcSrc->dclevel.plfnt; /* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows" p.559). */ if (!To) { IntGdiExtSelectClipRgn(pdcDst, pdcSrc->dclevel.prgnClip, RGN_COPY); if (pdcDst->dclevel.prgnMeta) { REGION_Delete(pdcDst->dclevel.prgnMeta); pdcDst->dclevel.prgnMeta = NULL; } if (pdcSrc->dclevel.prgnMeta) { pdcDst->dclevel.prgnMeta = IntSysCreateRectpRgn(0, 0, 0, 0); IntGdiCombineRgn(pdcDst->dclevel.prgnMeta, pdcSrc->dclevel.prgnMeta, NULL, RGN_COPY); } pdcDst->fs |= DC_FLAG_DIRTY_RAO; } }
static PREGION FASTCALL DceGetVisRgn(PWND Window, ULONG Flags, HWND hWndChild, ULONG CFlags) { PREGION Rgn; Rgn = VIS_ComputeVisibleRegion( Window, 0 == (Flags & DCX_WINDOW), 0 != (Flags & DCX_CLIPCHILDREN), 0 != (Flags & DCX_CLIPSIBLINGS)); /* Caller expects a non-null region */ if (!Rgn) Rgn = IntSysCreateRectpRgn(0, 0, 0, 0); return Rgn; }
int FASTCALL IntGdiExtSelectClipRgn( PDC dc, PREGION prgn, int fnMode) { if (fnMode == RGN_COPY) { if (!prgn) { if (dc->dclevel.prgnClip != NULL) { REGION_Delete(dc->dclevel.prgnClip); dc->dclevel.prgnClip = NULL; dc->fs |= DC_FLAG_DIRTY_RAO; } return SIMPLEREGION; } if (!dc->dclevel.prgnClip) dc->dclevel.prgnClip = IntSysCreateRectpRgn(0, 0, 0, 0); dc->fs |= DC_FLAG_DIRTY_RAO; return IntGdiCombineRgn(dc->dclevel.prgnClip, prgn, NULL, RGN_COPY); } ASSERT(prgn != NULL); if (!dc->dclevel.prgnClip) { RECTL rect; REGION_GetRgnBox(dc->prgnVis, &rect); dc->dclevel.prgnClip = IntSysCreateRectpRgnIndirect(&rect); } dc->fs |= DC_FLAG_DIRTY_RAO; return IntGdiCombineRgn(dc->dclevel.prgnClip, dc->dclevel.prgnClip, prgn, fnMode); }
INT FASTCALL NEW_CLIPPING_UpdateGCRegion(PDC pDC) { CLIPOBJ * co; /* Must have VisRgn set to a valid state! */ ASSERT (pDC->prgnVis); if (pDC->prgnAPI) { REGION_Delete(pDC->prgnAPI); pDC->prgnAPI = IntSysCreateRectpRgn(0,0,0,0); } if (pDC->prgnRao) { REGION_Delete(pDC->prgnRao); pDC->prgnRao = IntSysCreateRectpRgn(0,0,0,0); } if (pDC->dclevel.prgnMeta && pDC->dclevel.prgnClip) { IntGdiCombineRgn( pDC->prgnAPI, pDC->dclevel.prgnClip, pDC->dclevel.prgnMeta, RGN_AND); } else { if (pDC->dclevel.prgnClip) { IntGdiCombineRgn( pDC->prgnAPI, pDC->dclevel.prgnClip, NULL, RGN_COPY); } else if (pDC->dclevel.prgnMeta) { IntGdiCombineRgn( pDC->prgnAPI, pDC->dclevel.prgnMeta, NULL, RGN_COPY); } } IntGdiCombineRgn( pDC->prgnRao, pDC->prgnVis, pDC->prgnAPI, RGN_AND); RtlCopyMemory(&pDC->erclClip, &((PROSRGNDATA)pDC->prgnRao)->rdh.rcBound, sizeof(RECTL)); pDC->fs &= ~DC_FLAG_DIRTY_RAO; IntGdiOffsetRgn(pDC->prgnRao, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y); // pDC->co should be used. Example, CLIPOBJ_cEnumStart uses XCLIPOBJ to build // the rects from region objects rects in pClipRgn->Buffer. // With pDC->co.pClipRgn->Buffer, // pDC->co.pClipRgn = pDC->prgnRao ? pDC->prgnRao : pDC->prgnVis; co = IntEngCreateClipRegion( ((PROSRGNDATA)pDC->prgnRao)->rdh.nCount, ((PROSRGNDATA)pDC->prgnRao)->Buffer, &pDC->erclClip); if (co) { if (pDC->rosdc.CombinedClip != NULL) IntEngDeleteClipRegion(pDC->rosdc.CombinedClip); pDC->rosdc.CombinedClip = co; } return IntGdiOffsetRgn(pDC->prgnRao, -pDC->ptlDCOrig.x, -pDC->ptlDCOrig.y); }
BOOL FASTCALL IntSetDefaultRegion(PDC pdc) { PSURFACE pSurface; PREGION prgn; RECTL rclWnd, rclClip; IntGdiReleaseRaoRgn(pdc); rclWnd.left = 0; rclWnd.top = 0; rclWnd.right = pdc->dclevel.sizl.cx; rclWnd.bottom = pdc->dclevel.sizl.cy; rclClip = rclWnd; //EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock); if (pdc->ppdev->flFlags & PDEV_META_DEVICE) { pSurface = pdc->dclevel.pSurface; if (pSurface && pSurface->flags & PDEV_SURFACE) { rclClip.left += pdc->ppdev->ptlOrigion.x; rclClip.top += pdc->ppdev->ptlOrigion.y; rclClip.right += pdc->ppdev->ptlOrigion.x; rclClip.bottom += pdc->ppdev->ptlOrigion.y; } } //EngReleaseSemaphore(pdc->ppdev->hsemDevLock); prgn = pdc->prgnVis; if (prgn && prgn != prgnDefault) { REGION_SetRectRgn( prgn, rclClip.left, rclClip.top, rclClip.right , rclClip.bottom ); } else { prgn = IntSysCreateRectpRgn( rclClip.left, rclClip.top, rclClip.right , rclClip.bottom ); pdc->prgnVis = prgn; } if (prgn) { pdc->ptlDCOrig.x = 0; pdc->ptlDCOrig.y = 0; pdc->erclWindow = rclWnd; pdc->erclClip = rclClip; /* Might be an InitDC or DCE... */ pdc->ptlFillOrigin.x = pdc->dcattr.VisRectRegion.Rect.right; pdc->ptlFillOrigin.y = pdc->dcattr.VisRectRegion.Rect.bottom; return TRUE; } pdc->prgnVis = prgnDefault; return FALSE; }
VOID NTAPI DC_vInitDc( PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev) { /* Setup some basic fields */ pdc->dctype = dctype; pdc->ppdev = ppdev; pdc->dhpdev = ppdev->dhpdev; pdc->hsem = ppdev->hsemDevLock; pdc->flGraphicsCaps = ppdev->devinfo.flGraphicsCaps; pdc->flGraphicsCaps2 = ppdev->devinfo.flGraphicsCaps2; pdc->fs = DC_DIRTY_RAO; /* Setup dc attribute */ pdc->pdcattr = &pdc->dcattr; pdc->dcattr.pvLDC = NULL; pdc->dcattr.ulDirty_ = DIRTY_DEFAULT; if (ppdev == gppdevPrimary) pdc->dcattr.ulDirty_ |= DC_PRIMARY_DISPLAY; /* Setup the DC size */ if (dctype == DCTYPE_MEMORY) { /* Memory DCs have a 1 x 1 bitmap by default */ pdc->dclevel.sizl.cx = 1; pdc->dclevel.sizl.cy = 1; } else { /* Other DC's are as big as the related PDEV */ pdc->dclevel.sizl.cx = ppdev->gdiinfo.ulHorzRes; pdc->dclevel.sizl.cy = ppdev->gdiinfo.ulVertRes; } /* Setup Window rect based on DC size */ pdc->erclWindow.left = 0; pdc->erclWindow.top = 0; pdc->erclWindow.right = pdc->dclevel.sizl.cx; pdc->erclWindow.bottom = pdc->dclevel.sizl.cy; if (dctype == DCTYPE_DIRECT) { /* Direct DCs get the surface from the PDEV */ pdc->dclevel.pSurface = PDEVOBJ_pSurface(ppdev); pdc->erclBounds.left = 0x7fffffff; pdc->erclBounds.top = 0x7fffffff; pdc->erclBounds.right = 0x80000000; pdc->erclBounds.bottom = 0x80000000; pdc->erclBoundsApp.left = 0xffffffff; pdc->erclBoundsApp.top = 0xfffffffc; pdc->erclBoundsApp.right = 0x00007ffc; // FIXME pdc->erclBoundsApp.bottom = 0x00000333; // FIXME pdc->erclClip = pdc->erclBounds; pdc->co = gxcoTrivial; pdc->fs |= DC_SYNCHRONIZEACCESS | DC_ACCUM_APP | DC_PERMANANT | DC_DISPLAY; } else { /* Non-direct DCs don't have a surface by default */ pdc->dclevel.pSurface = NULL; pdc->erclBounds.left = 0; pdc->erclBounds.top = 0; pdc->erclBounds.right = 0; pdc->erclBounds.bottom = 0; pdc->erclBoundsApp = pdc->erclBounds; pdc->erclClip = pdc->erclWindow; pdc->co = gxcoTrivial; } //pdc->dcattr.VisRectRegion: /* Setup coordinate transformation data */ pdc->dclevel.mxWorldToDevice = gmxWorldToDeviceDefault; pdc->dclevel.mxDeviceToWorld = gmxDeviceToWorldDefault; pdc->dclevel.mxWorldToPage = gmxWorldToPageDefault; pdc->dclevel.efM11PtoD = gef16; pdc->dclevel.efM22PtoD = gef16; pdc->dclevel.efDxPtoD = gef0; pdc->dclevel.efDyPtoD = gef0; pdc->dclevel.efM11_TWIPS = gef0; pdc->dclevel.efM22_TWIPS = gef0; pdc->dclevel.efPr11 = gef0; pdc->dclevel.efPr22 = gef0; pdc->dcattr.mxWorldToDevice = pdc->dclevel.mxWorldToDevice; pdc->dcattr.mxDeviceToWorld = pdc->dclevel.mxDeviceToWorld; pdc->dcattr.mxWorldToPage = pdc->dclevel.mxWorldToPage; pdc->dcattr.efM11PtoD = pdc->dclevel.efM11PtoD; pdc->dcattr.efM22PtoD = pdc->dclevel.efM22PtoD; pdc->dcattr.efDxPtoD = pdc->dclevel.efDxPtoD; pdc->dcattr.efDyPtoD = pdc->dclevel.efDyPtoD; pdc->dcattr.iMapMode = MM_TEXT; pdc->dcattr.dwLayout = 0; pdc->dcattr.flXform = PAGE_TO_DEVICE_SCALE_IDENTITY | PAGE_TO_DEVICE_IDENTITY | WORLD_TO_PAGE_IDENTITY; /* Setup more coordinates */ pdc->ptlDCOrig.x = 0; pdc->ptlDCOrig.y = 0; pdc->dcattr.lWindowOrgx = 0; pdc->dcattr.ptlWindowOrg.x = 0; pdc->dcattr.ptlWindowOrg.y = 0; pdc->dcattr.szlWindowExt.cx = 1; pdc->dcattr.szlWindowExt.cy = 1; pdc->dcattr.ptlViewportOrg.x = 0; pdc->dcattr.ptlViewportOrg.y = 0; pdc->dcattr.szlViewportExt.cx = 1; pdc->dcattr.szlViewportExt.cy = 1; pdc->dcattr.szlVirtualDevicePixel.cx = ppdev->gdiinfo.ulHorzRes; pdc->dcattr.szlVirtualDevicePixel.cy = ppdev->gdiinfo.ulVertRes; pdc->dcattr.szlVirtualDeviceMm.cx = ppdev->gdiinfo.ulHorzSize; pdc->dcattr.szlVirtualDeviceMm.cy = ppdev->gdiinfo.ulVertSize; pdc->dcattr.szlVirtualDeviceSize.cx = 0; pdc->dcattr.szlVirtualDeviceSize.cy = 0; /* Setup regions */ pdc->prgnAPI = NULL; pdc->prgnRao = NULL; pdc->dclevel.prgnClip = NULL; pdc->dclevel.prgnMeta = NULL; /* Allocate a Vis region */ pdc->prgnVis = IntSysCreateRectpRgn(0, 0, pdc->dclevel.sizl.cx, pdc->dclevel.sizl.cy); ASSERT(pdc->prgnVis); /* Initialize Clip object */ IntEngInitClipObj(&pdc->co); /* Setup palette */ pdc->dclevel.hpal = StockObjects[DEFAULT_PALETTE]; pdc->dclevel.ppal = PALETTE_ShareLockPalette(pdc->dclevel.hpal); /* Setup path */ pdc->dclevel.hPath = NULL; pdc->dclevel.flPath = 0; // pdc->dclevel.lapath: /* Setup colors */ pdc->dcattr.crBackgroundClr = RGB(0xff, 0xff, 0xff); pdc->dcattr.ulBackgroundClr = RGB(0xff, 0xff, 0xff); pdc->dcattr.crForegroundClr = RGB(0, 0, 0); pdc->dcattr.ulForegroundClr = RGB(0, 0, 0); pdc->dcattr.crBrushClr = RGB(0xff, 0xff, 0xff); pdc->dcattr.ulBrushClr = RGB(0xff, 0xff, 0xff); pdc->dcattr.crPenClr = RGB(0, 0, 0); pdc->dcattr.ulPenClr = RGB(0, 0, 0); /* Select the default fill and line brush */ pdc->dcattr.hbrush = StockObjects[WHITE_BRUSH]; pdc->dcattr.hpen = StockObjects[BLACK_PEN]; pdc->dclevel.pbrFill = BRUSH_ShareLockBrush(pdc->pdcattr->hbrush); pdc->dclevel.pbrLine = PEN_ShareLockPen(pdc->pdcattr->hpen); pdc->dclevel.ptlBrushOrigin.x = 0; pdc->dclevel.ptlBrushOrigin.y = 0; pdc->dcattr.ptlBrushOrigin = pdc->dclevel.ptlBrushOrigin; /* Initialize EBRUSHOBJs */ EBRUSHOBJ_vInitFromDC(&pdc->eboFill, pdc->dclevel.pbrFill, pdc); EBRUSHOBJ_vInitFromDC(&pdc->eboLine, pdc->dclevel.pbrLine, pdc); EBRUSHOBJ_vInitFromDC(&pdc->eboText, pbrDefaultBrush, pdc); EBRUSHOBJ_vInitFromDC(&pdc->eboBackground, pbrDefaultBrush, pdc); /* Setup fill data */ pdc->dcattr.jROP2 = R2_COPYPEN; pdc->dcattr.jBkMode = 2; pdc->dcattr.lBkMode = 2; pdc->dcattr.jFillMode = ALTERNATE; pdc->dcattr.lFillMode = 1; pdc->dcattr.jStretchBltMode = 1; pdc->dcattr.lStretchBltMode = 1; pdc->ptlFillOrigin.x = 0; pdc->ptlFillOrigin.y = 0; /* Setup drawing position */ pdc->dcattr.ptlCurrent.x = 0; pdc->dcattr.ptlCurrent.y = 0; pdc->dcattr.ptfxCurrent.x = 0; pdc->dcattr.ptfxCurrent.y = 0; /* Setup ICM data */ pdc->dclevel.lIcmMode = 0; pdc->dcattr.lIcmMode = 0; pdc->dcattr.hcmXform = NULL; pdc->dcattr.flIcmFlags = 0; pdc->dcattr.IcmBrushColor = CLR_INVALID; pdc->dcattr.IcmPenColor = CLR_INVALID; pdc->dcattr.pvLIcm = NULL; pdc->dcattr.hColorSpace = NULL; // FIXME: 0189001f pdc->dclevel.pColorSpace = NULL; // FIXME pdc->pClrxFormLnk = NULL; // pdc->dclevel.ca = /* Setup font data */ pdc->hlfntCur = NULL; // FIXME: 2f0a0cf8 pdc->pPFFList = NULL; pdc->flSimulationFlags = 0; pdc->lEscapement = 0; pdc->prfnt = NULL; pdc->dcattr.flFontMapper = 0; pdc->dcattr.flTextAlign = 0; pdc->dcattr.lTextAlign = 0; pdc->dcattr.lTextExtra = 0; pdc->dcattr.lRelAbs = 1; pdc->dcattr.lBreakExtra = 0; pdc->dcattr.cBreak = 0; pdc->dcattr.hlfntNew = StockObjects[SYSTEM_FONT]; pdc->dclevel.plfnt = LFONT_ShareLockFont(pdc->dcattr.hlfntNew); /* Other stuff */ pdc->hdcNext = NULL; pdc->hdcPrev = NULL; pdc->ipfdDevMax = 0; pdc->ulCopyCount = -1; pdc->ptlDoBanding.x = 0; pdc->ptlDoBanding.y = 0; pdc->dclevel.lSaveDepth = 1; pdc->dclevel.hdcSave = NULL; pdc->dcattr.iGraphicsMode = GM_COMPATIBLE; pdc->dcattr.iCS_CP = 0; pdc->pSurfInfo = NULL; if (defaultDCstate == NULL) { defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC); ASSERT(defaultDCstate); RtlZeroMemory(defaultDCstate, sizeof(DC)); defaultDCstate->pdcattr = &defaultDCstate->dcattr; DC_vCopyState(pdc, defaultDCstate, TRUE); } }
VOID FASTCALL DceUpdateVisRgn(DCE *Dce, PWND Window, ULONG Flags) { PREGION RgnVisible = NULL; ULONG DcxFlags; PWND DesktopWindow; if (Flags & DCX_PARENTCLIP) { PWND Parent; Parent = Window->spwndParent; if (!Parent) { RgnVisible = NULL; goto noparent; } if (Parent->style & WS_CLIPSIBLINGS) { DcxFlags = DCX_CLIPSIBLINGS | (Flags & ~(DCX_CLIPCHILDREN | DCX_WINDOW)); } else { DcxFlags = Flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW); } RgnVisible = DceGetVisRgn(Parent, DcxFlags, Window->head.h, Flags); } else if (Window == NULL) { DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); if (NULL != DesktopWindow) { RgnVisible = IntSysCreateRectpRgnIndirect(&DesktopWindow->rcWindow); } else { RgnVisible = NULL; } } else { RgnVisible = DceGetVisRgn(Window, Flags, 0, 0); } noparent: if (Flags & DCX_INTERSECTRGN) { PREGION RgnClip = NULL; if (Dce->hrgnClip != NULL) RgnClip = REGION_LockRgn(Dce->hrgnClip); if (RgnClip) { IntGdiCombineRgn(RgnVisible, RgnVisible, RgnClip, RGN_AND); REGION_UnlockRgn(RgnClip); } else { if (RgnVisible != NULL) { REGION_Delete(RgnVisible); } RgnVisible = IntSysCreateRectpRgn(0, 0, 0, 0); } } else if ((Flags & DCX_EXCLUDERGN) && Dce->hrgnClip != NULL) { PREGION RgnClip = REGION_LockRgn(Dce->hrgnClip); IntGdiCombineRgn(RgnVisible, RgnVisible, RgnClip, RGN_DIFF); REGION_UnlockRgn(RgnClip); } Dce->DCXFlags &= ~DCX_DCEDIRTY; GdiSelectVisRgn(Dce->hDC, RgnVisible); /* Tell GDI driver */ if (Window) IntEngWindowChanged(Window, WOC_RGN_CLIENT); if (RgnVisible != NULL) { REGION_Delete(RgnVisible); } }