This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository e16.

View the commit online.

commit b41a6a9a5346100e2883e69f22cd85c89c497352
Author: Kim Woelders <[email protected]>
AuthorDate: Fri Dec 9 20:00:53 2022 +0100

    pagers: Avoid some overhead
---
 src/pager.c | 115 +++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 83 insertions(+), 32 deletions(-)

diff --git a/src/pager.c b/src/pager.c
index 86f14665..1336d8eb 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -94,7 +94,13 @@ typedef struct {
    EWin               *ewin;
    Win                 win;
    int                 w, h;
-   EX_Pixmap           bgpmap;
+   EX_Pixmap           pmap;	/* Pager window background pixmap */
+#if USE_XRENDER
+   EX_Picture          pict;	/* Pager window background picture */
+   EX_Picture          bgpict;	/* Desktop background picture */
+#else
+   EX_Pixmap           bgpmap;	/* Desktop background pixmap */
+#endif
    Desk               *dsk;
    int                 dw, dh;
    int                 screen_w, screen_h;
@@ -155,6 +161,57 @@ PagerCreate(void)
    return p;
 }
 
+static void
+_PagerCanvasInit(Pager * p, bool create)
+{
+   if (p->pmap != NoXID)
+      EFreePixmap(p->pmap);
+   p->pmap = NoXID;
+#if USE_XRENDER
+   if (p->pict != NoXID)
+      EPictureDestroy(p->pict);
+   p->pict = NoXID;
+#endif
+
+   if (!create)
+      return;			/* Just cleaning up */
+
+   p->pmap = ECreatePixmap(p->win, p->w, p->h, 0);
+#if USE_XRENDER
+   p->pict = EPictureCreate(NULL, p->pmap);
+#endif
+
+   ESetWindowBackgroundPixmap(p->win, p->pmap, 1);
+}
+
+static void
+_PagerBgBufferInit(Pager * p, EX_Pixmap * ppmap)
+{
+#if USE_XRENDER
+   XRenderPictureAttributes pa;
+
+   if (p->bgpict != NoXID)
+      EPictureDestroy(p->bgpict);
+   p->bgpict = NoXID;
+#else
+   if (p->bgpmap != NoXID)
+      EFreePixmap(p->bgpmap);
+   p->bgpmap = NoXID;
+#endif
+
+   if (!ppmap)
+      return;			/* Just cleaning up */
+
+#if USE_XRENDER
+   p->bgpict = EPictureCreateBuffer(p->win, p->dw, p->dh, 0, ppmap);
+   pa.repeat = True;
+   XRenderChangePicture(disp, p->bgpict, CPRepeat, &pa);
+#else
+   p->bgpmap = ECreatePixmap(p->win, p->dw, p->dh, 0);
+   *ppmap = p->bgpmap;
+#endif
+}
+
 static void
 PagerDestroy(Pager * p)
 {
@@ -162,8 +219,8 @@ PagerDestroy(Pager * p)
 
    PagerScanCancel(p);
    PagerHiwinHide();
-   if (p->bgpmap != NoXID)
-      EFreePixmap(p->bgpmap);
+   _PagerBgBufferInit(p, NULL);
+   _PagerCanvasInit(p, false);
 
    Efree(p);
 }
@@ -349,12 +406,6 @@ doPagerUpdate(Pager * p)
    EWin               *const *lst;
    int                 i, num, update_screen_included, update_screen_only;
    int                 pager_mode = PagersGetMode();
-   EX_Pixmap           pmap;
-
-#if USE_COMPOSITE
-   EX_Picture          pager_pict, pict, alpha;
-   XRenderPictureAttributes pa;
-#endif
 
    p->update_phase = 0;
    DeskGetArea(p->dsk, &cx, &cy);
@@ -378,7 +429,8 @@ doPagerUpdate(Pager * p)
    p->x1 = p->y1 = 99999;
    p->x2 = p->y2 = -99999;
 
-   pmap = EGetWindowBackgroundPixmap(p->win);
+   if (p->pmap == NoXID)
+      _PagerCanvasInit(p, true);
 
    if (update_screen_only)
       goto do_screen_update;
@@ -405,16 +457,11 @@ doPagerUpdate(Pager * p)
    Dprintf("%s %d: Repaint\n", __func__, p->dsk->num);
 
    /* Tile background over pager areas */
-#if USE_COMPOSITE
-   pager_pict = EPictureCreate(NULL, pmap);
-   pict = EPictureCreate(NULL, p->bgpmap);
-   pa.repeat = True;
-   XRenderChangePicture(disp, pict, CPRepeat, &pa);
-   XRenderComposite(disp, PictOpSrc, pict, NoXID, pager_pict,
+#if USE_XRENDER
+   XRenderComposite(disp, PictOpSrc, p->bgpict, NoXID, p->pict,
 		    0, 0, 0, 0, 0, 0, p->w, p->h);
-   EPictureDestroy(pict);
 #else
-   EXCopyAreaTiled(p->bgpmap, NoXID, pmap, 0, 0, p->w, p->h, 0, 0);
+   EXCopyAreaTiled(p->bgpmap, NoXID, p->pmap, 0, 0, p->w, p->h, 0, 0);
 #endif
 
    for (i = num - 1; i >= 0; i--)
@@ -438,11 +485,13 @@ doPagerUpdate(Pager * p)
 	      * PagerEwinUpdateMini()           ewin
 	      * PagerEwinUpdateFromPager()      p->win
 	      */
+	     EX_Picture          pict, alpha;
+
 	     pict = EPictureCreate(ewin->mini_pmm.depth == WinGetDepth(p->win) ?
 				   p->win : EoGetWin(ewin),
 				   ewin->mini_pmm.pmap);
 	     alpha = ECompMgrWinGetAlphaPict(EoObj(ewin));
-	     XRenderComposite(disp, PictOpOver, pict, alpha, pager_pict,
+	     XRenderComposite(disp, PictOpOver, pict, alpha, p->pict,
 			      0, 0, 0, 0, wx, wy, ww, wh);
 	     EPictureDestroy(pict);
 #else
@@ -453,7 +502,7 @@ doPagerUpdate(Pager * p)
 		  XSetClipOrigin(disp, gc, wx, wy);
 	       }
 #endif
-	     EXCopyArea(ewin->mini_pmm.pmap, pmap, 0, 0, ww, wh, wx, wy);
+	     EXCopyArea(ewin->mini_pmm.pmap, p->pmap, 0, 0, ww, wh, wx, wy);
 #if 0				/* Mask is currently not set anywhere */
 	     if (ewin->mini_pmm.mask)
 		XSetClipMask(disp, gc, NoXID);
@@ -462,13 +511,10 @@ doPagerUpdate(Pager * p)
 	  }
 	else
 	  {
-	     EXPaintRectangle(pmap, wx, wy, ww, wh,
+	     EXPaintRectangle(p->pmap, wx, wy, ww, wh,
 			      Dpy.pixel_black, Dpy.pixel_white);
 	  }
      }
-#if USE_COMPOSITE
-   EPictureDestroy(pager_pict);
-#endif
 
    if (!update_screen_included)
      {
@@ -480,7 +526,7 @@ doPagerUpdate(Pager * p)
    EobjsRepaint();
    Dprintf("%s %d: Snap screen\n", __func__, p->dsk->num);
    /* Update pager area by snapshotting entire screen */
-   ScaleRect(VROOT, WinGetXwin(VROOT), p->win, pmap, 0, 0,
+   ScaleRect(VROOT, WinGetXwin(VROOT), p->win, p->pmap, 0, 0,
 	     WinGetW(VROOT), WinGetH(VROOT), cx * p->dw, cy * p->dh,
 	     p->dw, p->dh, HIQ);
 
@@ -565,10 +611,7 @@ PagerUpdateBg(Pager * p)
    p->x1 = p->y1 = 0;
    p->x2 = p->y2 = 99999;
 
-   pmap = p->bgpmap;
-   if (pmap != NoXID)
-      EFreePixmap(pmap);
-   pmap = p->bgpmap = ECreatePixmap(p->win, p->dw, p->dh, 0);
+   _PagerBgBufferInit(p, &pmap);
 
    bg = DeskBackgroundGet(p->dsk);
    if (pager_mode != PAGER_MODE_SIMPLE && bg)
@@ -599,14 +642,14 @@ PagerUpdateBg(Pager * p)
 	     EImageDecache(im);
 	  }
 #endif
-	return;
+	goto done;
      }
 
    if (pager_mode != PAGER_MODE_SIMPLE && p->dsk->bg.pmap)
      {
 	ScaleTile(VROOT, p->dsk->bg.pmap, p->win, pmap,
 		  0, 0, p->dw, p->dh, HIQ);
-	return;
+	goto done;
      }
 
    ic = ImageclassFind("PAGER_BACKGROUND", 1);
@@ -614,10 +657,16 @@ PagerUpdateBg(Pager * p)
      {
 	ImageclassApplySimple(ic, p->win, pmap, STATE_NORMAL,
 			      0, 0, p->dw, p->dh);
-	return;
+	goto done;
      }
 
    EXPaintRectangle(pmap, 0, 0, p->dw, p->dh, Dpy.pixel_black, Dpy.pixel_white);
+
+ done:
+#if USE_XRENDER
+   EFreePixmap(pmap);		/* Using bgpict as of now */
+#endif
+   return;
 }
 
 static void
@@ -666,6 +715,8 @@ _PagerEwinMoveResize(EWin * ewin, int resize __UNUSED__)
    p->dw = w / ax;
    p->dh = h / ay;
 
+   _PagerCanvasInit(p, false);
+
    if (p->scale <= 0.f || Mode.op_source == OPSRC_USER)
       p->scale = ((float)WinGetW(VROOT) / p->dw +
 		  (float)WinGetH(VROOT) / p->dh) / 2;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to