Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        ecompmgr.c 


Log Message:
Eliminate some unnecessary region operations.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -3 -r1.102 -r1.103
--- ecompmgr.c  8 Mar 2006 20:10:27 -0000       1.102
+++ ecompmgr.c  12 Mar 2006 19:20:22 -0000      1.103
@@ -51,6 +51,8 @@
 #define USE_DESK_EXPOSE     0
 #define USE_DESK_VISIBILITY 1
 
+#define USE_CLIP_RELATIVE_TO_DESK 1
+
 #define ENABLE_DEBUG   1
 #if ENABLE_DEBUG
 #define EDBUG_TYPE_COMPMGR  161
@@ -298,6 +300,8 @@
 static void
 ERegionTranslate(XserverRegion rgn, int dx, int dy)
 {
+   if (dx == 0 && dy == 0)
+      return;
    XFixesTranslateRegion(disp, rgn, dx, dy);
 }
 
@@ -314,6 +318,12 @@
 }
 
 static void
+ERegionSubtract(XserverRegion dst, XserverRegion src)
+{
+   XFixesSubtractRegion(disp, dst, dst, src);
+}
+
+static void
 ERegionLimit(XserverRegion rgn)
 {
    XserverRegion       screen;
@@ -343,6 +353,23 @@
       ERegionDestroy(rgn);
 }
 
+static void
+ERegionUnionOffset(XserverRegion dst, int dx, int dy, XserverRegion src)
+{
+   Display            *dpy = disp;
+   XserverRegion       rgn;
+
+   rgn = src;
+   if (dx != 0 || dy != 0)
+     {
+       rgn = ERegionClone(src);
+       XFixesTranslateRegion(dpy, rgn, dx, dy);
+     }
+   XFixesUnionRegion(dpy, dst, dst, rgn);
+   if (rgn != src)
+      ERegionDestroy(rgn);
+}
+
 #if 0                          /* Unused (for debug) */
 static int
 ERegionIsEmpty(XserverRegion rgn)
@@ -637,6 +664,7 @@
       ECompMgrDetermineOrder(NULL, 0, &Mode_compmgr.eo_first,
                             &Mode_compmgr.eo_last, DeskGet(0), None);
 
+#if 0                          /* FIXME - Remove? */
    if (cw->clip == None)
      {
        /* Clip may be None if window is not in paint list */
@@ -644,22 +672,24 @@
           ERegionDestroy(damage);
        return;
      }
+#endif
 
    if (!destroy)
       damage = ERegionClone(damage);
-#if 0                          /* FIXME - Remove */
-   ERegionShow("ECompMgrDamageMergeObject damage A:", damage);
-   ERegionShow("ECompMgrDamageMergeObject clip:", cw->clip);
-#endif
-   if (eo->type != EOBJ_TYPE_DESK)
-      ERegionIntersect(damage, cw->clip);
-#if 0                          /* FIXME - Remove */
-   ERegionShow("ECompMgrDamageMergeObject damage B:", damage);
+
+#if USE_CLIP_RELATIVE_TO_DESK
+   if (cw->clip != None && eo->type != EOBJ_TYPE_DESK)
+      ERegionSubtract(damage, cw->clip);
 #endif
 
-   if (dsk->num > 0 && (EoGetX(dsk) != 0 || EoGetY(dsk) != 0))
+   if (EoGetX(dsk) != 0 || EoGetY(dsk) != 0)
       ERegionTranslate(damage, EoGetX(dsk), EoGetY(dsk));
 
+#if !USE_CLIP_RELATIVE_TO_DESK
+   if (cw->clip != None && eo->type != EOBJ_TYPE_DESK)
+      ERegionSubtract(damage, cw->clip);
+#endif
+
    ECompMgrDamageMerge(damage, 1);
 }
 
@@ -1703,7 +1733,8 @@
        ERegionShow("win extents", cw->extents);
        ERegionShow("win shape  ", cw->shape);
        ERegionShow("win clip   ", cw->clip);
-       ERegionShow("region", rgn);
+       if (rgn != None)
+          ERegionShow("region", rgn);
      }
 }
 
@@ -1732,7 +1763,7 @@
                       EObj ** last, Desk * dsk, XserverRegion clip)
 {
    EObj               *eo, *eo_prev, *eo_first;
-   int                 i, stop;
+   int                 i, stop, destroy_clip;
    ECmWinInfo         *cw;
 
    D1printf("ECompMgrDetermineOrder %d\n", dsk->num);
@@ -1740,14 +1771,13 @@
       lst = EobjListStackGet(&num);
    if (clip == None)
      {
+       destroy_clip = 1;
        ECompMgrDestroyClip();
-       clip = ERegionCreateRect(0, 0, VRoot.w, VRoot.h);
+       clip = ERegionCreate();
      }
    else
      {
-       clip = ERegionClone(clip);
-       if (EoGetX(dsk) != 0 || EoGetY(dsk) != 0)
-          ERegionTranslate(clip, -EoGetX(dsk), -EoGetY(dsk));
+       destroy_clip = 0;
      }
 
    /* Determine overall paint order, top to bottom */
@@ -1774,8 +1804,6 @@
        if (cw->extents == None)
           cw->extents = win_extents(eo);
 
-       cw->clip = ERegionClone(clip);
-
        D4printf(" - %#lx desk=%d shown=%d fading=%d fadeout=%d\n", eo->win,
                 eo->desk->num, eo->shown, cw->fading, cw->fadeout);
 
@@ -1787,7 +1815,13 @@
             if (!d->viewable)
                continue;
 
+#if USE_CLIP_RELATIVE_TO_DESK
+            ERegionTranslate(clip, -EoGetX(d), -EoGetY(d));
+#endif
             stop = ECompMgrDetermineOrder(lst, num, &eo1, &eo2, d, clip);
+#if USE_CLIP_RELATIVE_TO_DESK
+            ERegionTranslate(clip, EoGetX(d), EoGetY(d));
+#endif
             if (eo1)
               {
                  if (!eo_first)
@@ -1807,6 +1841,8 @@
 #endif
          }
 
+       cw->clip = ERegionClone(clip);
+
        ECompMgrWinSetPicts(eo);
 
        D4printf(" - %#lx desk=%d shown=%d dam=%d pict=%#lx\n",
@@ -1836,7 +1872,11 @@
          case WINDOW_SOLID:
             D4printf("-   clip %#lx %#lx %d,%d %dx%d: %s\n", eo->win, cw->clip,
                      eo->x, eo->y, eo->w, eo->h, eo->name);
-            ERegionSubtractOffset(clip, 0, 0, cw->shape);
+#if USE_CLIP_RELATIVE_TO_DESK
+            ERegionUnionOffset(clip, 0, 0, cw->shape);
+#else
+            ERegionUnionOffset(clip, EoGetX(dsk), EoGetY(dsk), cw->shape);
+#endif
             break;
 
          default:
@@ -1859,41 +1899,52 @@
    *first = eo_first;
    *last = eo_prev;
 
-   ERegionDestroy(clip);
+   if (destroy_clip)
+      ERegionDestroy(clip);
    Mode_compmgr.reorder = 0;
    return stop;
 }
 
+static              XserverRegion
+ECompMgrRepaintObjSetClip(XserverRegion rgn, XserverRegion damage,
+                         XserverRegion clip, int x, int y)
+{
+   ERegionCopy(rgn, damage);
+#if USE_CLIP_RELATIVE_TO_DESK
+   ERegionSubtractOffset(rgn, x, y, clip);
+#else
+   ERegionSubtractOffset(rgn, 0, 0, clip);
+   x = y = 0;
+#endif
+   return rgn;
+}
+
 static void
 ECompMgrRepaintObj(Picture pbuf, XserverRegion region, EObj * eo, int mode)
 {
-   static XserverRegion clip = None;
+   static XserverRegion rgn_clip = None;
    Display            *dpy = disp;
    ECmWinInfo         *cw;
    Desk               *dsk = eo->desk;
    int                 x, y;
+   XserverRegion       clip;
    Picture             alpha;
 
    cw = eo->cmhook;
 
-#if 1                          /* FIXME - Remove? */
+#if 0                          /* FIXME - Remove? */
    if (!cw->shape)
       cw->shape = win_shape(eo);
    if (!cw->extents)
       cw->extents = win_extents(eo);
 #endif
 
-   if (clip == None)
-      clip = ERegionCreate();
+   if (rgn_clip == None)
+      rgn_clip = ERegionCreate();
 
    x = EoGetX(dsk);
    y = EoGetY(dsk);
 
-   ERegionCopy(clip, cw->clip);
-   if (x != 0 || y != 0)
-      ERegionTranslate(clip, x, y);
-   ERegionIntersect(clip, region);
-
    if (mode == 0)
      {
        /* Painting opaque windows top down. */
@@ -1909,13 +1960,13 @@
          {
          case WINDOW_UNREDIR:
          case WINDOW_SOLID:
+            clip = ECompMgrRepaintObjSetClip(rgn_clip, region, cw->clip, x, y);
             if (EventDebug(EDBUG_TYPE_COMPMGR2))
                ECompMgrWinDumpInfo("ECompMgrRepaintObj solid", eo, clip, 0);
             XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip);
             XRenderComposite(dpy, PictOpSrc, cw->picture, None, pbuf,
                              0, 0, 0, 0, x + cw->rcx, y + cw->rcy, cw->rcw,
                              cw->rch);
-            ERegionSubtractOffset(region, x, y, cw->shape);
             break;
          }
      }
@@ -1925,8 +1976,13 @@
 
        switch (cw->mode)
          {
+         default:
+            clip = None;
+            break;
+
          case WINDOW_TRANS:
          case WINDOW_ARGB:
+            clip = ECompMgrRepaintObjSetClip(rgn_clip, region, cw->clip, x, y);
             if (EventDebug(EDBUG_TYPE_COMPMGR2))
                ECompMgrWinDumpInfo("ECompMgrRepaintObj trans", eo, clip, 0);
             XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip);
@@ -1940,14 +1996,16 @@
          }
 
 #if ENABLE_SHADOWS
-       if (!eo->shadow)
+       if (!eo->shadow || Mode_compmgr.shadow_mode == ECM_SHADOWS_OFF)
           return;
 
+       if (clip == None)
+          clip = ECompMgrRepaintObjSetClip(rgn_clip, region, cw->clip, x, y);
+       ERegionSubtractOffset(clip, x, y, cw->shape);
+       XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip);
+
        switch (Mode_compmgr.shadow_mode)
          {
-         case ECM_SHADOWS_OFF:
-            break;
-
          case ECM_SHADOWS_SHARP:
          case ECM_SHADOWS_ECHO:
             if (cw->opacity != OPAQUE && !cw->shadow_alpha)
@@ -1956,8 +2014,6 @@
                                       OP32(cw->opacity) *
                                       Mode_compmgr.opac_sharp, 0., 0., 0.);
             alpha = cw->shadow_alpha ? cw->shadow_alpha : transBlackPicture;
-            ERegionSubtractOffset(clip, x, y, cw->shape);
-            XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip);
             if (Mode_compmgr.shadow_mode == ECM_SHADOWS_SHARP)
                XRenderComposite(dpy, PictOpOver, alpha, cw->picture, pbuf,
                                 0, 0, 0, 0,
@@ -1976,8 +2032,6 @@
             if (cw->shadow_pict == None)
                break;
 
-            ERegionSubtractOffset(clip, x, y, cw->shape);
-            XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip);
             if (cw->opacity != OPAQUE && !cw->pict_alpha)
                cw->pict_alpha =
                   EPictureCreateSolid(True, OP32(cw->opacity), 0., 0., 0.);
@@ -1997,7 +2051,6 @@
 ECompMgrRepaint(void)
 {
    Display            *dpy = disp;
-   XserverRegion       region;
    EObj               *eo;
    Picture             pbuf;
    Desk               *dsk = DeskGet(0);
@@ -2006,12 +2059,11 @@
       return;
 
    ERegionLimit(allDamage);
-   region = ERegionClone(allDamage);
 
    D2printf("ECompMgrRepaint rootBuffer=%#lx rootPicture=%#lx\n",
            rootBuffer, rootPicture);
    if (EventDebug(EDBUG_TYPE_COMPMGR))
-      ERegionShow("allDamage", region);
+      ERegionShow("allDamage", allDamage);
 
    if (!rootBuffer)
       rootBuffer = EPictureCreateBuffer(VRoot.win, VRoot.w, VRoot.h,
@@ -2026,17 +2078,17 @@
       ECompMgrDetermineOrder(NULL, 0, &Mode_compmgr.eo_first,
                             &Mode_compmgr.eo_last, dsk, None);
 
-   /* Paint opaque windows top down, adjusting clip regions */
+   /* Paint opaque windows top down */
    for (eo = Mode_compmgr.eo_first; eo;
        eo = ((ECmWinInfo *) (eo->cmhook))->next)
-      ECompMgrRepaintObj(pbuf, region, eo, 0);
-
-   if (EventDebug(EDBUG_TYPE_COMPMGR2))
-      ERegionShow("after opaque", region);
+      ECompMgrRepaintObj(pbuf, allDamage, eo, 0);
 
 #if 0                          /* FIXME - NoBg? */
    Picture             pict;
 
+   if (EventDebug(EDBUG_TYPE_COMPMGR2))
+      ERegionShow("after opaque", region);
+
    /* Repaint background, clipped by damage region and opaque windows */
    pict = ((ECmWinInfo *) (dsk->o.cmhook))->picture;
    D1printf("ECompMgrRepaint desk picture=%#lx\n", pict);
@@ -2056,7 +2108,6 @@
                         0, 0, 0, 0, 0, 0, VRoot.w, VRoot.h);
      }
 
-   ERegionDestroy(region);
    ERegionDestroy(allDamage);
    allDamage = None;
 }




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to