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; }
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; }