From 4cdc184c13ed43cc30ff5b76389e56ea8425ee7a Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Wed, 26 Feb 2025 17:56:41 +0100 Subject: [PATCH] Revert "mi: drop obsolete miOverlayComputeCompositeClip()" This reverts commit bfb69b7316c4d4dabc5fc1744cc8d8e5ecd83347. Requested by Nvidia - their proprietary driver still needs it. Signed-off-by: Enrico Weigelt, metux IT consult Part-of: --- mi/mioverlay.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ mi/mioverlay.h | 1 + 2 files changed, 57 insertions(+) diff --git a/mi/mioverlay.c b/mi/mioverlay.c index 6dd99d89a..83a4949a3 100644 --- a/mi/mioverlay.c +++ b/mi/mioverlay.c @@ -108,6 +108,62 @@ miOverlayCopyUnderlay(ScreenPtr pScreen) return MIOVERLAY_GET_SCREEN_PRIVATE(pScreen)->copyUnderlay; } +void +miOverlayComputeCompositeClip(GCPtr pGC, WindowPtr pWin) +{ + miOverlayTreePtr pTree = MIOVERLAY_GET_WINDOW_TREE(pWin); + RegionPtr pregWin; + Bool freeTmpClip, freeCompClip; + + if (!pTree) { + miComputeCompositeClip(pGC, &pWin->drawable); + return; + } + + if (pGC->subWindowMode == IncludeInferiors) { + pregWin = RegionCreate(NullBox, 1); + freeTmpClip = TRUE; + if (pWin->parent || (screenIsSaved != SCREEN_SAVER_ON) || + !HasSaverWindow(pGC->pScreen)) { + RegionIntersect(pregWin, &pTree->borderClip, &pWin->winSize); + } + } + else { + pregWin = &pTree->clipList; + freeTmpClip = FALSE; + } + freeCompClip = pGC->freeCompClip; + if (!pGC->clientClip) { + if (freeCompClip) + RegionDestroy(pGC->pCompositeClip); + pGC->pCompositeClip = pregWin; + pGC->freeCompClip = freeTmpClip; + } + else { + RegionTranslate(pGC->clientClip, + pWin->drawable.x + pGC->clipOrg.x, + pWin->drawable.y + pGC->clipOrg.y); + + if (freeCompClip) { + RegionIntersect(pGC->pCompositeClip, pregWin, pGC->clientClip); + if (freeTmpClip) + RegionDestroy(pregWin); + } + else if (freeTmpClip) { + RegionIntersect(pregWin, pregWin, pGC->clientClip); + pGC->pCompositeClip = pregWin; + } + else { + pGC->pCompositeClip = RegionCreate(NullBox, 0); + RegionIntersect(pGC->pCompositeClip, pregWin, pGC->clientClip); + } + pGC->freeCompClip = TRUE; + RegionTranslate(pGC->clientClip, + -(pWin->drawable.x + pGC->clipOrg.x), + -(pWin->drawable.y + pGC->clipOrg.y)); + } +} + static void MarkUnderlayWindow(WindowPtr pWin) { diff --git a/mi/mioverlay.h b/mi/mioverlay.h index ca4c06db5..5463a293c 100644 --- a/mi/mioverlay.h +++ b/mi/mioverlay.h @@ -9,6 +9,7 @@ typedef void (*miOverlayTransFunc) (ScreenPtr, int, BoxPtr); typedef Bool (*miOverlayInOverlayFunc) (WindowPtr); +extern _X_EXPORT void miOverlayComputeCompositeClip(GCPtr, WindowPtr); extern _X_EXPORT Bool miOverlayCopyUnderlay(ScreenPtr); extern _X_EXPORT void miOverlaySetRootClip(ScreenPtr, Bool);