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).
This commit is contained in:
parent
e0cc487149
commit
a57e85b523
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue