diff options
author | Roland Mainz <roland.mainz@nrubsig.org> | 2004-12-13 05:48:41 +0000 |
---|---|---|
committer | Roland Mainz <roland.mainz@nrubsig.org> | 2004-12-13 05:48:41 +0000 |
commit | 24c1ba42e2ff5663055fc422dd97d29e7fa04d46 (patch) | |
tree | 36e3f919de3379a1e55124d4f59987b0842acc59 | |
parent | e2463040d8270a4f16cb7bdf3e2a6a18245564d4 (diff) |
xc/config/cf/xprint_site.def
xc/programs/Xserver/Xprint/ps/Ps.h
xc/programs/Xserver/Xprint/ps/PsPixmap.c
xc/programs/Xserver/Xprint/ps/PsPolygon.c
//freedesktop.org/bugzilla/show_bug.cgi?id=1664) attachment #1161
(https://bugs.freedesktop.org/attachment.cgi?id=1161): 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 ed4524608..06b4e2254 100644 --- a/mi/miinitext.c +++ b/mi/miinitext.c @@ -1,4 +1,4 @@ -/* $XdotOrg: xc/programs/Xserver/mi/miinitext.c,v 1.12.2.1 2004/12/08 05:28:11 gisburn Exp $ */ +/* $XdotOrg: xc/programs/Xserver/mi/miinitext.c,v 1.12.2.2 2004/12/08 05:38:02 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 |