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).
This commit is contained in:
Roland Mainz 2004-10-25 07:12:21 +00:00
parent e0cc487149
commit a57e85b523
4 changed files with 46 additions and 5 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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