diff options
author | Keith Packard <keithp@keithp.com> | 2004-08-11 22:40:14 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2004-08-11 22:40:14 +0000 |
commit | fd439afdfe7ba451aff19b62d1764e4dfd0b782f (patch) | |
tree | ef70f8b2e726f132b3fe089f6fc02f5770149517 /miext | |
parent | f95293e5253904883d3b40f9e68e6175247754a3 (diff) |
Add COMPOSITE change to fbCopyWindow (not needed yet)
Xnest was half-using midispcur and doing a bad job of it. Replace all of
that code with mipointer which does a lot of the work.
Support DDXen which don't provide GetWindowPixmap, or which return NULL for
the root pixmap.
Diffstat (limited to 'miext')
-rwxr-xr-x | miext/damage/damage.c | 80 | ||||
-rwxr-xr-x | miext/damage/damagestr.h | 6 |
2 files changed, 56 insertions, 30 deletions
diff --git a/miext/damage/damage.c b/miext/damage/damage.c index 4284cacf7..3d1681dc9 100755 --- a/miext/damage/damage.c +++ b/miext/damage/damage.c @@ -61,30 +61,44 @@ #define DAMAGE_DEBUG(x) #endif -static PixmapPtr -GetDrawablePixmap (DrawablePtr pDrawable) +#define getPixmapDamageRef(pPixmap) \ + ((DamagePtr *) &(pPixmap->devPrivates[damagePixPrivateIndex].ptr)) + +#define pixmapDamage(pPixmap) damagePixPriv(pPixmap) + +static DamagePtr * +getDrawableDamageRef (DrawablePtr pDrawable) { - ScreenPtr pScreen = pDrawable->pScreen; - PixmapPtr pPixmap; + PixmapPtr pPixmap; + if (pDrawable->type == DRAWABLE_WINDOW) { - pPixmap = (*pScreen->GetWindowPixmap) ((WindowPtr) pDrawable); + ScreenPtr pScreen = pDrawable->pScreen; + + pPixmap = 0; + if (pScreen->GetWindowPixmap) + pPixmap = (*pScreen->GetWindowPixmap) ((WindowPtr)pDrawable); + if (!pPixmap) - pPixmap = (*pScreen->GetScreenPixmap) (pDrawable->pScreen); + { + damageScrPriv(pScreen); + + return &pScrPriv->pScreenDamage; + } } else pPixmap = (PixmapPtr) pDrawable; - return pPixmap; + return getPixmapDamageRef (pPixmap); } -#define pixmapDamage(pPixmap) damagePixPriv(pPixmap) -#define drawableDamage(pDrawable) damagePixPriv(GetDrawablePixmap(pDrawable)) -#define windowDamage(pWin) drawableDamage(&(pWin)->drawable) -#define getDrawableDamage(pDrawable) damageGetPixPriv(GetDrawablePixmap(pDrawable)) -#define getWindowDamage(pWin) getDrawableDamage(&(pWin)->drawable) -#define pixDamageRef(pPixmap) \ - DamagePtr *pPrev = (DamagePtr *) \ - &(pPixmap->devPrivates[damagePixPrivateIndex].ptr) +#define getDrawableDamage(pDrawable) (*getDrawableDamageRef (pDrawable)) +#define getWindowDamage(pWin) getDrawableDamage(&(pWin)->drawable) + +#define drawableDamage(pDrawable) \ + DamagePtr pDamage = getDrawableDamage(pDrawable) + +#define windowDamage(pWin) drawableDamage(&(pWin)->drawable) + #define winDamageRef(pWindow) \ DamagePtr *pPrev = (DamagePtr *) \ &(pWindow->devPrivates[damageWinPrivateIndex].ptr) @@ -299,6 +313,7 @@ damageCreateGC(GCPtr pGC) damageGCPriv(pGC); Bool ret; + pGC->pCompositeClip = 0; unwrap (pScrPriv, pScreen, CreateGC); if((ret = (*pScreen->CreateGC) (pGC))) { pGCPriv->ops = NULL; @@ -416,7 +431,7 @@ damageDestroyClip(GCPtr pGC) DAMAGE_GC_FUNC_EPILOGUE (pGC); } -#define TRIM_BOX(box, pGC) { \ +#define TRIM_BOX(box, pGC) if (pGC->pCompositeClip) { \ BoxPtr extents = &pGC->pCompositeClip->extents;\ if(box.x1 < extents->x1) box.x1 = extents->x1; \ if(box.x2 > extents->x2) box.x2 = extents->x2; \ @@ -440,7 +455,9 @@ damageDestroyClip(GCPtr pGC) (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0)) #define checkGCDamage(d,g) (getDrawableDamage(d) && \ - REGION_NOTEMPTY(d->pScreen, g->pCompositeClip)) + (!g->pCompositeClip ||\ + REGION_NOTEMPTY(d->pScreen, \ + g->pCompositeClip))) #ifdef RENDER @@ -1442,10 +1459,8 @@ damagePushPixels(GCPtr pGC, } static void -damageRemoveDamage (PixmapPtr pPixmap, DamagePtr pDamage) +damageRemoveDamage (DamagePtr *pPrev, DamagePtr pDamage) { - pixDamageRef (pPixmap); - while (*pPrev) { if (*pPrev == pDamage) @@ -1462,10 +1477,8 @@ damageRemoveDamage (PixmapPtr pPixmap, DamagePtr pDamage) } static void -damageInsertDamage (PixmapPtr pPixmap, DamagePtr pDamage) +damageInsertDamage (DamagePtr *pPrev, DamagePtr pDamage) { - pixDamageRef (pPixmap); - #if DAMAGE_VALIDATE_ENABLE DamagePtr pOld; @@ -1484,13 +1497,15 @@ damageDestroyPixmap (PixmapPtr pPixmap) { ScreenPtr pScreen = pPixmap->drawable.pScreen; damageScrPriv(pScreen); - DamagePtr pDamage; if (pPixmap->refcnt == 1) { - while ((pDamage = damageGetPixPriv(pPixmap))) + DamagePtr *pPrev = getPixmapDamageRef (pPixmap); + DamagePtr pDamage; + + while ((pDamage = *pPrev)) { - damageRemoveDamage (pPixmap, pDamage); + damageRemoveDamage (pPrev, pDamage); if (!pDamage->isWindow) DamageDestroy (pDamage); } @@ -1599,9 +1614,11 @@ damageSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap) if ((pDamage = damageGetWinPriv(pWindow))) { PixmapPtr pOldPixmap = (*pScreen->GetWindowPixmap) (pWindow); + DamagePtr *pPrev = getPixmapDamageRef(pOldPixmap); + while (pDamage) { - damageRemoveDamage (pOldPixmap, pDamage); + damageRemoveDamage (pPrev, pDamage); pDamage = pDamage->pNextWin; } } @@ -1610,9 +1627,11 @@ damageSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap) wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap); if ((pDamage = damageGetWinPriv(pWindow))) { + DamagePtr *pPrev = getPixmapDamageRef(pPixmap); + while (pDamage) { - damageInsertDamage (pPixmap, pDamage); + damageInsertDamage (pPrev, pDamage); pDamage = pDamage->pNextWin; } } @@ -1698,6 +1717,7 @@ DamageSetup (ScreenPtr pScreen) return FALSE; pScrPriv->internalLevel = 0; + pScrPriv->pScreenDamage = 0; wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap); wrap (pScrPriv, pScreen, CreateGC, damageCreateGC); @@ -1773,7 +1793,7 @@ DamageRegister (DrawablePtr pDrawable, else pDamage->isWindow = FALSE; pDamage->pDrawable = pDrawable; - damageInsertDamage (GetDrawablePixmap (pDrawable), pDamage); + damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage); } void @@ -1816,7 +1836,7 @@ DamageUnregister (DrawablePtr pDrawable, #endif } pDamage->pDrawable = 0; - damageRemoveDamage (GetDrawablePixmap (pDrawable), pDamage); + damageRemoveDamage (getDrawableDamageRef (pDrawable), pDamage); } void diff --git a/miext/damage/damagestr.h b/miext/damage/damagestr.h index 5cb565084..d975ee23b 100755 --- a/miext/damage/damagestr.h +++ b/miext/damage/damagestr.h @@ -46,6 +46,12 @@ typedef struct _damage { typedef struct _damageScrPriv { int internalLevel; + /* + * For DDXen which don't provide GetScreenPixmap, this provides + * a place to hook damage for windows on the screen + */ + DamagePtr pScreenDamage; + PaintWindowBackgroundProcPtr PaintWindowBackground; PaintWindowBorderProcPtr PaintWindowBorder; CopyWindowProcPtr CopyWindow; |