diff options
author | Roland Mainz <roland.mainz@nrubsig.org> | 2004-10-25 07:12:21 +0000 |
---|---|---|
committer | Roland Mainz <roland.mainz@nrubsig.org> | 2004-10-25 07:12:21 +0000 |
commit | a57e85b52357f15f52e81c8d9b310a76e0c62b3f (patch) | |
tree | c6d5c730d0bafd5a6254a25cf2911736b3c2e302 | |
parent | e0cc4871491ab7a8c52749ff2c077d8f11516b15 (diff) |
Fix for https://freedesktop.org/bugzilla/show_bug.cgi?id=1664 - RFE: Add
support for the DOUBLE-BUFFER extension to the Xprint server and DDX.
Additionally a "pixmap-scrubber" optimisation is added to the
PostScript DDX to remove all content from a vector pixmap when a
|PolyFillRect()| call covers the whole pixmap surface with a solid fill
(this avoids that a backbuffer vector pixmap gets constantly filled
even when the content is not visible anymore after |XdbeSwapBuffers()|
has cleared the hidden buffer with the background color).
-rw-r--r-- | Xprint/ps/Ps.h | 1 | ||||
-rw-r--r-- | Xprint/ps/PsPixmap.c | 22 | ||||
-rw-r--r-- | Xprint/ps/PsPolygon.c | 25 | ||||
-rw-r--r-- | mi/miinitext.c | 3 |
4 files changed, 46 insertions, 5 deletions
diff --git a/Xprint/ps/Ps.h b/Xprint/ps/Ps.h index 1b1f02a1a..726cf5aae 100644 --- a/Xprint/ps/Ps.h +++ b/Xprint/ps/Ps.h @@ -566,6 +566,7 @@ extern void PsSetFillColor(DrawablePtr pDrawable, GCPtr pGC, PsOutPtr psOut, extern PixmapPtr PsCreatePixmap(ScreenPtr pScreen, int width, int height, int depth); +extern void PsScrubPixmap(PixmapPtr pPixmap); extern Bool PsDestroyPixmap(PixmapPtr pPixmap); extern DisplayListPtr PsGetFreeDisplayBlock(PsPixmapPrivPtr priv); extern void PsReplayPixmap(PixmapPtr pix, DrawablePtr pDrawable); diff --git a/Xprint/ps/PsPixmap.c b/Xprint/ps/PsPixmap.c index 6f4ca39d2..25a525b82 100644 --- a/Xprint/ps/PsPixmap.c +++ b/Xprint/ps/PsPixmap.c @@ -114,13 +114,15 @@ PsCreatePixmap( return pPixmap; } -Bool -PsDestroyPixmap(PixmapPtr pPixmap) +/* PsScrubPixmap: Remove all content from a pixmap (used by + * |PsPolyFillRect()| when the "solid fill" operation covers + * the whole pixmap) */ +void +PsScrubPixmap(PixmapPtr pPixmap) { PsPixmapPrivPtr priv = (PsPixmapPrivPtr)pPixmap->devPrivate.ptr; DisplayListPtr disp = priv->dispList; - if( --pPixmap->refcnt ) return TRUE; while( disp ) { int i; @@ -177,6 +179,20 @@ PsDestroyPixmap(PixmapPtr pPixmap) } xfree(oldDisp); } + + priv->dispList = NULL; +} + +Bool +PsDestroyPixmap(PixmapPtr pPixmap) +{ + PsPixmapPrivPtr priv = (PsPixmapPrivPtr)pPixmap->devPrivate.ptr; + DisplayListPtr disp = priv->dispList; + + if( --pPixmap->refcnt ) return TRUE; + + PsScrubPixmap(pPixmap); + xfree(priv); xfree(pPixmap); return TRUE; diff --git a/Xprint/ps/PsPolygon.c b/Xprint/ps/PsPolygon.c index a5b373775..dca00fa21 100644 --- a/Xprint/ps/PsPolygon.c +++ b/Xprint/ps/PsPolygon.c @@ -203,6 +203,31 @@ PsPolyFillRect( DisplayListPtr disp; GCPtr gc; +#ifdef DBE + /* Remove previous pixmap content if we render one single rect which + * covers the whole pixmap surface (this optimisation was added for + * the double-buffer extension ("DBE") which uses |PolyFillRect()| + * to clear the buffer - but it makes sense in other cases, too). + */ + if (nRects == 1) + { + extern Bool noDbeExtension; + + if ( (pRects[0].x==0) && (pRects[0].y==0) && + (pRects[0].width==pDrawable->width) && (pRects[0].height==pDrawable->height) && + (pGC->fillStyle == FillSolid) && + (noDbeExtension == False)) + { +#ifdef DEBUG_gismobile + ErrorF("PsPolyFillRect: scrubbing pixmap...\n"); +#endif /* DEBUG_gismobile */ + /* Remove all content from the pixmap as it would be covered + * by the whole rect anyway */ + PsScrubPixmap(pDrawable); + } + } +#endif /* DBE */ + if ((gc = PsCreateAndCopyGC(pDrawable, pGC)) == NULL) return; disp = PsGetFreeDisplayBlock(priv); diff --git a/mi/miinitext.c b/mi/miinitext.c index 4729f9c01..8ba3a63db 100644 --- a/mi/miinitext.c +++ b/mi/miinitext.c @@ -1,4 +1,4 @@ -/* $XdotOrg: xc/programs/Xserver/mi/miinitext.c,v 1.12 2004/08/12 08:45:33 anholt Exp $ */ +/* $XdotOrg: xc/programs/Xserver/mi/miinitext.c,v 1.13 2004/09/14 00:51:25 gisburn Exp $ */ /* $XFree86: xc/programs/Xserver/mi/miinitext.c,v 3.67 2003/01/12 02:44:27 dawes Exp $ */ /*********************************************************** @@ -74,7 +74,6 @@ SOFTWARE. #undef SCREENSAVER #undef XIDLE #undef XRECORD -#undef DBE #undef XF86VIDMODE #undef XF86MISC #undef XFreeXDGA |