summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Mainz <roland.mainz@nrubsig.org>2004-12-13 05:48:41 +0000
committerRoland Mainz <roland.mainz@nrubsig.org>2004-12-13 05:48:41 +0000
commit24c1ba42e2ff5663055fc422dd97d29e7fa04d46 (patch)
tree36e3f919de3379a1e55124d4f59987b0842acc59
parente2463040d8270a4f16cb7bdf3e2a6a18245564d4 (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.h1
-rw-r--r--Xprint/ps/PsPixmap.c22
-rw-r--r--Xprint/ps/PsPolygon.c25
-rw-r--r--mi/miinitext.c3
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