Instead of using DamageDamageRegion for reporting the first (virtual)
damage in ProcDamageCreate that covers the borderClip of the drawable
window, use a function DamageReportDamage directly (previously called
damageReportDamage). This avoids sending all other damage listeners a
full window update when a new damage object is created.

As this patch makes DamageReportDamage a public interface, the
function has been moved into the part of the file that contains all
the other public functions. The function has not been otherwise
modified.

Signed-off-by: Erkki Seppälä <erkki.sepp...@vincit.fi>
---
 damageext/damageext.c |    2 +-
 miext/damage/damage.c |  101 +++++++++++++++++++++++++------------------------
 miext/damage/damage.h |    4 ++
 3 files changed, 56 insertions(+), 51 deletions(-)

diff --git a/damageext/damageext.c b/damageext/damageext.c
index cfef069..6958d89 100644
--- a/damageext/damageext.c
+++ b/damageext/damageext.c
@@ -223,7 +223,7 @@ ProcDamageCreate (ClientPtr client)
     if (pDrawable->type == DRAWABLE_WINDOW)
     {
        pRegion = &((WindowPtr) pDrawable)->borderClip;
-       DamageDamageRegion(pDrawable, pRegion);
+       DamageReportDamage(pDamageExt->pDamage, pRegion);
     }
 
     return Success;
diff --git a/miext/damage/damage.c b/miext/damage/damage.c
index a3de044..f13bfbc 100644
--- a/miext/damage/damage.c
+++ b/miext/damage/damage.c
@@ -121,54 +121,6 @@ getDrawableDamageRef (DrawablePtr pDrawable)
        dixLookupPrivateAddr(&(pWindow)->devPrivates, damageWinPrivateKey)
 
 static void
-damageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
-{
-    BoxRec tmpBox;
-    RegionRec tmpRegion;
-    Bool was_empty;
-
-    switch (pDamage->damageLevel) {
-    case DamageReportRawRegion:
-       RegionUnion(&pDamage->damage, &pDamage->damage,
-                        pDamageRegion);
-       (*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
-       break;
-    case DamageReportDeltaRegion:
-       RegionNull(&tmpRegion);
-       RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage);
-       if (RegionNotEmpty(&tmpRegion)) {
-           RegionUnion(&pDamage->damage, &pDamage->damage,
-                        pDamageRegion);
-           (*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
-       }
-       RegionUninit(&tmpRegion);
-       break;
-    case DamageReportBoundingBox:
-       tmpBox = *RegionExtents(&pDamage->damage);
-       RegionUnion(&pDamage->damage, &pDamage->damage,
-                    pDamageRegion);
-       if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) {
-           (*pDamage->damageReport) (pDamage, &pDamage->damage,
-                                     pDamage->closure);
-       }
-       break;
-    case DamageReportNonEmpty:
-       was_empty = !RegionNotEmpty(&pDamage->damage);
-       RegionUnion(&pDamage->damage, &pDamage->damage,
-                    pDamageRegion);
-       if (was_empty && RegionNotEmpty(&pDamage->damage)) {
-           (*pDamage->damageReport) (pDamage, &pDamage->damage,
-                                     pDamage->closure);
-       }
-       break;
-    case DamageReportNone:
-       RegionUnion(&pDamage->damage, &pDamage->damage,
-                    pDamageRegion);
-       break;
-    }
-}
-
-static void
 damageReportDamagePostRendering (DamagePtr pDamage, RegionPtr pOldDamage, 
RegionPtr pDamageRegion)
 {
     BoxRec tmpBox;
@@ -360,7 +312,7 @@ damageRegionAppend (DrawablePtr pDrawable, RegionPtr 
pRegion, Bool clip,
        /* Report damage now, if desired. */
        if (!pDamage->reportAfter) {
            if (pDamage->damageReport)
-               damageReportDamage (pDamage, pDamageRegion);
+               DamageReportDamage (pDamage, pDamageRegion);
            else
                RegionUnion(&pDamage->damage,
                         &pDamage->damage, pDamageRegion);
@@ -393,7 +345,7 @@ damageRegionProcessPending (DrawablePtr pDrawable)
        if (pDamage->reportAfter) {
            /* It's possible that there is only interest in postRendering 
reporting. */
            if (pDamage->damageReport)
-               damageReportDamage (pDamage, &pDamage->pendingDamage);
+               DamageReportDamage (pDamage, &pDamage->pendingDamage);
            else
                RegionUnion(&pDamage->damage, &pDamage->damage,
                        &pDamage->pendingDamage);
@@ -2149,3 +2101,52 @@ DamageGetScreenFuncs (ScreenPtr pScreen)
     damageScrPriv(pScreen);
     return &pScrPriv->funcs;
 }
+
+void
+DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
+{
+    BoxRec tmpBox;
+    RegionRec tmpRegion;
+    Bool was_empty;
+
+    switch (pDamage->damageLevel) {
+    case DamageReportRawRegion:
+       RegionUnion(&pDamage->damage, &pDamage->damage,
+                        pDamageRegion);
+       (*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
+       break;
+    case DamageReportDeltaRegion:
+       RegionNull(&tmpRegion);
+       RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage);
+       if (RegionNotEmpty(&tmpRegion)) {
+           RegionUnion(&pDamage->damage, &pDamage->damage,
+                        pDamageRegion);
+           (*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
+       }
+       RegionUninit(&tmpRegion);
+       break;
+    case DamageReportBoundingBox:
+       tmpBox = *RegionExtents(&pDamage->damage);
+       RegionUnion(&pDamage->damage, &pDamage->damage,
+                    pDamageRegion);
+       if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) {
+           (*pDamage->damageReport) (pDamage, &pDamage->damage,
+                                     pDamage->closure);
+       }
+       break;
+    case DamageReportNonEmpty:
+       was_empty = !RegionNotEmpty(&pDamage->damage);
+       RegionUnion(&pDamage->damage, &pDamage->damage,
+                    pDamageRegion);
+       if (was_empty && RegionNotEmpty(&pDamage->damage)) {
+           (*pDamage->damageReport) (pDamage, &pDamage->damage,
+                                     pDamage->closure);
+       }
+       break;
+    case DamageReportNone:
+       RegionUnion(&pDamage->damage, &pDamage->damage,
+                    pDamageRegion);
+       break;
+    }
+}
+
diff --git a/miext/damage/damage.h b/miext/damage/damage.h
index 067016f..0c7fc31 100644
--- a/miext/damage/damage.h
+++ b/miext/damage/damage.h
@@ -110,6 +110,10 @@ DamageRegionProcessPending (DrawablePtr pDrawable);
 extern _X_EXPORT void
 DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr 
pOldDamage, RegionPtr pRegion);
 
+/* Call this when you create a new Damage and you wish to send an initial 
damage message (to it). */
+extern _X_EXPORT void
+DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion);
+
 /* Avoid using this call, it only exists for API compatibility. */
 extern _X_EXPORT void
 DamageDamageRegion (DrawablePtr            pDrawable,
-- 
1.7.0.4

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to