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 DC_InitHack(PDC pdc) { HRGN hVisRgn; TextIntRealizeFont(pdc->pdcattr->hlfntNew,NULL); pdc->pdcattr->iCS_CP = ftGdiGetTextCharsetInfo(pdc,NULL,0); /* This should never fail */ ASSERT(pdc->dclevel.ppal); /* Select regions */ pdc->rosdc.hClipRgn = NULL; pdc->rosdc.hGCClipRgn = NULL; hVisRgn = IntSysCreateRectRgn(0, 0, 1, 1); ASSERT(hVisRgn); GdiSelectVisRgn(pdc->BaseObject.hHmgr, hVisRgn); GreDeleteObject(hVisRgn); }
static void DC_vUpdateDC(PDC pdc) { HRGN hVisRgn ; 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); hVisRgn = NtGdiCreateRectRgn(0, 0, pdc->dclevel.sizl.cx, pdc->dclevel.sizl.cy); ASSERT(hVisRgn); GdiSelectVisRgn(pdc->BaseObject.hHmgr, hVisRgn); GreDeleteObject(hVisRgn); pdc->flGraphicsCaps = ppdev->devinfo.flGraphicsCaps; pdc->flGraphicsCaps2 = ppdev->devinfo.flGraphicsCaps2; /* Mark EBRUSHOBJs as dirty */ pdc->pdcattr->ulDirty_ |= DIRTY_DEFAULT ; }
/* * @implemented */ HBITMAP APIENTRY NtGdiSelectBitmap( IN HDC hdc, IN HBITMAP hbmp) { PDC pdc; PDC_ATTR pdcattr; HBITMAP hbmpOld; PSURFACE psurfNew; HRGN hVisRgn; SIZEL sizlBitmap = {1, 1}; HDC hdcOld; ASSERT_NOGDILOCKS(); /* Verify parameters */ if (hdc == NULL || hbmp == NULL) return NULL; /* First lock the DC */ pdc = DC_LockDc(hdc); if (!pdc) { return NULL; } pdcattr = pdc->pdcattr; /* Must be a memory dc to select a bitmap */ if (pdc->dctype != DC_TYPE_MEMORY) { DC_UnlockDc(pdc); return NULL; } /* Check if there was a bitmap selected before */ if (pdc->dclevel.pSurface) { /* Return its handle */ hbmpOld = pdc->dclevel.pSurface->BaseObject.hHmgr; } else { /* Return default bitmap */ hbmpOld = StockObjects[DEFAULT_BITMAP]; } /* Check if the default bitmap was passed */ if (hbmp == StockObjects[DEFAULT_BITMAP]) { psurfNew = NULL; // HACK psurfNew = SURFACE_ShareLockSurface(hbmp); } else { /* Reference the new bitmap and check if it's valid */ psurfNew = SURFACE_ShareLockSurface(hbmp); if (!psurfNew) { DC_UnlockDc(pdc); return NULL; } /* Set the bitmp's hdc */ hdcOld = InterlockedCompareExchangePointer((PVOID*)&psurfNew->hdc, hdc, 0); if (hdcOld != NULL && hdcOld != hdc) { /* The bitmap is already selected, fail */ SURFACE_ShareUnlockSurface(psurfNew); DC_UnlockDc(pdc); return NULL; } /* Get the bitmap size */ sizlBitmap = psurfNew->SurfObj.sizlBitmap; /* Check if the bitmap is a dibsection */ if(psurfNew->hSecure) { /* Set DIBSECTION attribute */ pdcattr->ulDirty_ |= DC_DIBSECTION; } else { pdcattr->ulDirty_ &= ~DC_DIBSECTION; } } /* Select the new surface, release the old */ DC_vSelectSurface(pdc, psurfNew); /* Set the new size */ pdc->dclevel.sizl = sizlBitmap; /* Release one reference we added */ SURFACE_ShareUnlockSurface(psurfNew); /* Mark the dc brushes invalid */ pdcattr->ulDirty_ |= DIRTY_FILL | DIRTY_LINE; /* Unlock the DC */ DC_UnlockDc(pdc); /* FIXME; improve by using a region without a handle and selecting it */ hVisRgn = IntSysCreateRectRgn( 0, 0, sizlBitmap.cx, sizlBitmap.cy); if (hVisRgn) { GdiSelectVisRgn(hdc, hVisRgn); GreDeleteObject(hVisRgn); } /* Return the old bitmap handle */ return hbmpOld; }
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); } }