diff options
author | Keith Packard <keithp@keithp.com> | 2008-04-04 12:11:14 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2008-04-04 12:11:14 -0700 |
commit | 06e7e1d0486e8c516a9b3219a2c86026f88825fc (patch) | |
tree | 27078f19b651ce89653c0449c869604c80febd24 | |
parent | 436a549e7355c5ddd49086390099d2baca16fde8 (diff) |
Wrap AddTraps in exa and damage.
This fine (and unused) function wasn't ever wrapped which made it not work
under exa.
-rw-r--r-- | exa/exa.c | 4 | ||||
-rw-r--r-- | exa/exa_priv.h | 8 | ||||
-rw-r--r-- | exa/exa_unaccel.c | 14 | ||||
-rwxr-xr-x | miext/damage/damage.c | 53 | ||||
-rwxr-xr-x | miext/damage/damagestr.h | 1 |
5 files changed, 80 insertions, 0 deletions
@@ -700,6 +700,7 @@ exaCloseScreen(int i, ScreenPtr pScreen) if (ps) { ps->Composite = pExaScr->SavedComposite; ps->Trapezoids = pExaScr->SavedTrapezoids; + ps->AddTraps = pExaScr->SavedAddTraps; } #endif @@ -863,6 +864,9 @@ exaDriverInit (ScreenPtr pScreen, pExaScr->SavedTrapezoids = ps->Trapezoids; ps->Trapezoids = exaTrapezoids; + + pExaScr->SavedAddTraps = ps->AddTraps; + ps->AddTraps = ExaCheckAddTraps; } #endif diff --git a/exa/exa_priv.h b/exa/exa_priv.h index 89f47184f..f2dd93af6 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -113,6 +113,7 @@ typedef struct { TrianglesProcPtr SavedTriangles; GlyphsProcPtr SavedGlyphs; TrapezoidsProcPtr SavedTrapezoids; + AddTrapsProcPtr SavedAddTraps; #endif Bool swappedOut; @@ -291,6 +292,13 @@ ExaCheckGetSpans (DrawablePtr pDrawable, int nspans, char *pdstStart); +void +ExaCheckAddTraps (PicturePtr pPicture, + INT16 x_off, + INT16 y_off, + int ntrap, + xTrap *traps); + /* exa_accel.c */ static _X_INLINE Bool diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c index c55ef032b..6ea04282b 100644 --- a/exa/exa_unaccel.c +++ b/exa/exa_unaccel.c @@ -350,6 +350,20 @@ ExaCheckComposite (CARD8 op, REGION_UNINIT(pScreen, ®ion); } +void +ExaCheckAddTraps (PicturePtr pPicture, + INT16 x_off, + INT16 y_off, + int ntrap, + xTrap *traps) +{ + EXA_FALLBACK(("to pict %p (%c)\n", + exaDrawableLocation(pPicture->pDrawable))); + exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST); + fbAddTraps (pPicture, x_off, y_off, ntrap, traps); + exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST); +} + /** * Gets the 0,0 pixel of a pixmap. Used for doing solid fills of tiled pixmaps * that happen to be 1x1. Pixmap must be at least 8bpp. diff --git a/miext/damage/damage.c b/miext/damage/damage.c index 56864c56d..b9a15ee20 100755 --- a/miext/damage/damage.c +++ b/miext/damage/damage.c @@ -655,6 +655,58 @@ damageGlyphs (CARD8 op, damageReportPostOp (pDst->pDrawable); wrap (pScrPriv, ps, Glyphs, damageGlyphs); } + +static void +damageAddTraps (PicturePtr pPicture, + INT16 x_off, + INT16 y_off, + int ntrap, + xTrap *traps) +{ + ScreenPtr pScreen = pPicture->pDrawable->pScreen; + PictureScreenPtr ps = GetPictureScreen(pScreen); + damageScrPriv(pScreen); + + if (checkPictureDamage (pPicture)) + { + BoxRec box; + int i; + int x, y; + xTrap *t = traps; + + box.x1 = 32767; + box.y1 = 32767; + box.x2 = -32767; + box.y2 = -32767; + x = pPicture->pDrawable->x + x_off; + y = pPicture->pDrawable->y + y_off; + for (i = 0; i < ntrap; i++) + { + pixman_fixed_t l = min (t->top.l, t->bot.l); + pixman_fixed_t r = max (t->top.r, t->bot.r); + int x1 = x + pixman_fixed_to_int (l); + int x2 = x + pixman_fixed_to_int (pixman_fixed_ceil (r)); + int y1 = y + pixman_fixed_to_int (t->top.y); + int y2 = y + pixman_fixed_to_int (pixman_fixed_ceil (t->bot.y)); + + if (x1 < box.x1) + box.x1 = x1; + if (x2 > box.x2) + box.x2 = x2; + if (y1 < box.y1) + box.y1 = y1; + if (y2 > box.y2) + box.y2 = y2; + } + TRIM_PICTURE_BOX (box, pPicture); + if (BOX_NOT_EMPTY(box)) + damageDamageBox (pPicture->pDrawable, &box, pPicture->subWindowMode); + } + unwrap (pScrPriv, ps, AddTraps); + (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps); + damageReportPostOp (pPicture->pDrawable); + wrap (pScrPriv, ps, AddTraps, damageAddTraps); +} #endif /**********************************************************/ @@ -1767,6 +1819,7 @@ DamageSetup (ScreenPtr pScreen) if (ps) { wrap (pScrPriv, ps, Glyphs, damageGlyphs); wrap (pScrPriv, ps, Composite, damageComposite); + wrap (pScrPriv, ps, AddTraps, damageAddTraps); } #endif diff --git a/miext/damage/damagestr.h b/miext/damage/damagestr.h index 2f6d53844..7ee40ce23 100755 --- a/miext/damage/damagestr.h +++ b/miext/damage/damagestr.h @@ -70,6 +70,7 @@ typedef struct _damageScrPriv { #ifdef RENDER CompositeProcPtr Composite; GlyphsProcPtr Glyphs; + AddTrapsProcPtr AddTraps; #endif } DamageScrPrivRec, *DamageScrPrivPtr; |