summaryrefslogtreecommitdiff
path: root/Xprint/ps
diff options
context:
space:
mode:
authorRoland Mainz <roland.mainz@nrubsig.org>2004-10-25 07:12:21 +0000
committerRoland Mainz <roland.mainz@nrubsig.org>2004-10-25 07:12:21 +0000
commita57e85b52357f15f52e81c8d9b310a76e0c62b3f (patch)
treec6d5c730d0bafd5a6254a25cf2911736b3c2e302 /Xprint/ps
parente0cc4871491ab7a8c52749ff2c077d8f11516b15 (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).
Diffstat (limited to 'Xprint/ps')
-rw-r--r--Xprint/ps/Ps.h1
-rw-r--r--Xprint/ps/PsPixmap.c22
-rw-r--r--Xprint/ps/PsPolygon.c25
3 files changed, 45 insertions, 3 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);