summaryrefslogtreecommitdiff
path: root/do_traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'do_traps.c')
-rw-r--r--do_traps.c160
1 files changed, 149 insertions, 11 deletions
diff --git a/do_traps.c b/do_traps.c
index 5605ff3..4c0b4ce 100644
--- a/do_traps.c
+++ b/do_traps.c
@@ -21,6 +21,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************************/
+/* $XFree86: xc/programs/x11perf/do_traps.c,v 1.9 2002/12/04 10:28:08 eich Exp $ */
#include "x11perf.h"
#include "bitmaps.h"
@@ -29,10 +30,8 @@ SOFTWARE.
static XPoint *points;
static GC pgc;
-int InitTrapezoids(xp, p, reps)
- XParms xp;
- Parms p;
- int reps;
+int
+InitTrapezoids(XParms xp, Parms p, int reps)
{
int i, numPoints;
int rows;
@@ -80,10 +79,8 @@ int InitTrapezoids(xp, p, reps)
return reps;
}
-void DoTrapezoids(xp, p, reps)
- XParms xp;
- Parms p;
- int reps;
+void
+DoTrapezoids(XParms xp, Parms p, int reps)
{
int i, j;
XPoint *curPoint;
@@ -99,13 +96,154 @@ void DoTrapezoids(xp, p, reps)
pgc = xp->fggc;
else
pgc = xp->bggc;
+ CheckAbort ();
}
}
-void EndTrapezoids(xp, p)
- XParms xp;
- Parms p;
+void
+EndTrapezoids(XParms xp, Parms p)
{
free(points);
}
+#ifdef XRENDER
+#include <X11/extensions/Xrender.h>
+#include <X11/Xft/Xft.h>
+
+static XTrapezoid *traps;
+static XftDraw *aadraw;
+static XftColor aablack, aawhite;
+static XRenderPictFormat *maskFormat;
+
+int
+InitFixedTrapezoids(XParms xp, Parms p, int reps)
+{
+ int i, numTraps;
+ int rows;
+ int x, y;
+ int size, skew;
+ XTrapezoid *curTrap;
+ XRenderColor color;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ numTraps = p->objects;
+ traps = (XTrapezoid *)malloc(numTraps * sizeof(XTrapezoid));
+ curTrap = traps;
+ x = size;
+ y = 0;
+ rows = 0;
+ skew = size;
+ aadraw = XftDrawCreate (xp->d, xp->w,
+ xp->vinfo.visual,
+ xp->cmap);
+ if (p->font && !strcmp (p->font, "add"))
+ {
+ XRenderPictFormat templ;
+ templ.type = PictTypeDirect;
+ templ.depth = 8;
+ templ.direct.alpha = 0;
+ templ.direct.alphaMask = 0xff;
+ maskFormat = XRenderFindFormat (xp->d,
+ PictFormatType |
+ PictFormatDepth |
+ PictFormatAlpha |
+ PictFormatAlphaMask,
+ &templ,
+ 0);
+ }
+ else
+ maskFormat = 0;
+ color.red = 0;
+ color.green = 0;
+ color.blue = 0;
+ color.alpha = 0xffff;
+ if (!XftColorAllocValue (xp->d,
+ xp->vinfo.visual,
+ xp->cmap,
+ &color, &aablack))
+ {
+ XftDrawDestroy (aadraw);
+ aadraw = 0;
+ return 0;
+ }
+ color.red = 0xffff;
+ color.green = 0xffff;
+ color.blue = 0xffff;
+ color.alpha = 0xffff;
+ if (!XftColorAllocValue (xp->d,
+ xp->vinfo.visual,
+ xp->cmap,
+ &color, &aawhite))
+ {
+ XftDrawDestroy (aadraw);
+ aadraw = 0;
+ return 0;
+ }
+
+ for (i = 0; i != p->objects; i++, curTrap ++) {
+ curTrap->top = XDoubleToFixed (y);
+ curTrap->bottom = XDoubleToFixed (y + size);
+ curTrap->left.p1.x = XDoubleToFixed (x - skew);
+ curTrap->left.p1.y = XDoubleToFixed (y);
+ curTrap->left.p2.x = XDoubleToFixed (x + skew - size);
+ curTrap->left.p2.y = XDoubleToFixed (y + size);
+
+ curTrap->right.p1.x = XDoubleToFixed (x - skew + size);
+ curTrap->right.p1.y = XDoubleToFixed (y);
+ curTrap->right.p2.x = XDoubleToFixed (x + skew);
+ curTrap->right.p2.y = XDoubleToFixed (y + size);
+
+ skew--;
+ if (skew < 0) skew = size;
+
+ y += size;
+ rows++;
+ if (y + size > HEIGHT || rows == MAXROWS) {
+ rows = 0;
+ y = 0;
+ x += 2 * size;
+ if (x + size > WIDTH) {
+ x = size;
+ }
+ }
+ }
+
+
+ SetFillStyle(xp, p);
+ return reps;
+}
+
+void
+DoFixedTrapezoids(XParms xp, Parms p, int reps)
+{
+ int i;
+ XTrapezoid *curTrap;
+ Picture white, black, src, dst;
+
+ white = XftDrawSrcPicture (aadraw, &aawhite);
+ black = XftDrawSrcPicture (aadraw, &aablack);
+ dst = XftDrawPicture (aadraw);
+
+ src = black;
+ for (i = 0; i != reps; i++) {
+ curTrap = traps;
+ XRenderCompositeTrapezoids (xp->d, PictOpOver, src, dst, maskFormat,
+ 0, 0, traps, p->objects);
+ if (src == black)
+ src = white;
+ else
+ src = black;
+ CheckAbort ();
+ }
+}
+
+void
+EndFixedTrapezoids (XParms xp, Parms p)
+{
+ free (traps);
+ XftDrawDestroy (aadraw);
+}
+
+#endif /* XRENDER */