summaryrefslogtreecommitdiff
path: root/app/x11perf/do_traps.c
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2006-11-25 20:24:16 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2006-11-25 20:24:16 +0000
commitdc4a2107be04f29ad06d6e60e102370bf68739cd (patch)
tree57b3b37d49dada5a081f5ee365979a730b13acf4 /app/x11perf/do_traps.c
parent78d9ac52db47a21e2260ec82b6666ca014fc4c68 (diff)
Importing from X.Org 7.2RC2
Diffstat (limited to 'app/x11perf/do_traps.c')
-rw-r--r--app/x11perf/do_traps.c397
1 files changed, 397 insertions, 0 deletions
diff --git a/app/x11perf/do_traps.c b/app/x11perf/do_traps.c
new file mode 100644
index 000000000..01a64ed65
--- /dev/null
+++ b/app/x11perf/do_traps.c
@@ -0,0 +1,397 @@
+/* $Xorg: do_traps.c,v 1.3 2000/08/17 19:54:10 cpqbld Exp $ */
+/*****************************************************************************
+Copyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************************/
+/* $XFree86: xc/programs/x11perf/do_traps.c,v 1.9tsi Exp $ */
+
+#include "x11perf.h"
+#include "bitmaps.h"
+
+#define NUM_POINTS 4 /* 4 points to a trapezoid */
+static XPoint *points;
+static GC pgc;
+
+int
+InitTrapezoids(XParms xp, Parms p, int reps)
+{
+ int i, numPoints;
+ int rows;
+ int x, y;
+ int size, skew;
+ XPoint *curPoint;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ numPoints = (p->objects) * NUM_POINTS;
+ points = (XPoint *)malloc(numPoints * sizeof(XPoint));
+ curPoint = points;
+ x = size;
+ y = 0;
+ rows = 0;
+ skew = size;
+
+ for (i = 0; i != p->objects; i++, curPoint += NUM_POINTS) {
+ curPoint[0].x = x - skew;
+ curPoint[0].y = y;
+ curPoint[1].x = x - skew + size;
+ curPoint[1].y = y;
+ curPoint[2].x = x + skew;
+ curPoint[2].y = y + size;
+ curPoint[3].x = x + skew - size;
+ curPoint[3].y = 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
+DoTrapezoids(XParms xp, Parms p, int reps)
+{
+ int i, j;
+ XPoint *curPoint;
+
+ for (i = 0; i != reps; i++) {
+ curPoint = points;
+ for (j = 0; j != p->objects; j++) {
+ XFillPolygon(xp->d, xp->w, pgc, curPoint, NUM_POINTS, Convex,
+ CoordModeOrigin);
+ curPoint += NUM_POINTS;
+ }
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ CheckAbort ();
+ }
+}
+
+void
+EndTrapezoids(XParms xp, Parms p)
+{
+ free(points);
+}
+
+#ifdef XRENDER
+#include <X11/extensions/Xrender.h>
+#include <X11/Xft/Xft.h>
+
+static XTrap *traps;
+static XTrapezoid *trapezoids;
+static XftDraw *aadraw;
+static XftColor aablack, aawhite;
+static XRenderColor transparent = { 0, 0, 0, 0 };
+static XRenderPictFormat *maskFormat;
+static Pixmap maskPixmap;
+static Picture mask;
+
+int
+InitFixedTraps(XParms xp, Parms p, int reps)
+{
+ int i, numTraps;
+ int rows;
+ int x, y;
+ int size, skew;
+ XTrap *curTrap;
+ XRenderColor color;
+ int major, minor;
+ int depth;
+ int width;
+ int std_fmt;
+
+ XRenderQueryVersion (xp->d, &major, &minor);
+ if (major == 0 && minor < 9)
+ return 0;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ numTraps = p->objects;
+ traps = (XTrap *)malloc(numTraps * sizeof(XTrap));
+ curTrap = traps;
+ x = size;
+ y = 0;
+ rows = 0;
+ skew = size;
+ aadraw = XftDrawCreate (xp->d, xp->w,
+ xp->vinfo.visual,
+ xp->cmap);
+
+ depth = 0;
+ width = 0;
+ if (p->font)
+ sscanf (p->font, "%d,%d", &depth, &width);
+
+ switch (depth) {
+ case 8:
+ default:
+ depth = 8;
+ std_fmt = PictStandardA8;
+ break;
+ case 4:
+ std_fmt = PictStandardA4;
+ break;
+ case 1:
+ std_fmt = PictStandardA1;
+ break;
+ }
+ maskFormat = XRenderFindStandardFormat (xp->d, std_fmt);
+
+ maskPixmap = XCreatePixmap (xp->d, xp->w, WIDTH, HEIGHT, depth);
+
+ mask = XRenderCreatePicture (xp->d, maskPixmap, maskFormat, 0, 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;
+ }
+
+ if (width == 0)
+ width = size;
+ for (i = 0; i != p->objects; i++, curTrap ++) {
+ curTrap->top.y = XDoubleToFixed (y);
+ curTrap->top.left = XDoubleToFixed (x - skew);
+ curTrap->top.right = XDoubleToFixed (x - skew + width);
+ curTrap->bottom.y = XDoubleToFixed (y + size);
+ curTrap->bottom.left = XDoubleToFixed (x + skew - width);
+ curTrap->bottom.right = XDoubleToFixed (x + skew);
+
+ 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
+DoFixedTraps(XParms xp, Parms p, int reps)
+{
+ int i;
+ Picture white, black, src, dst;
+
+ white = XftDrawSrcPicture (aadraw, &aawhite);
+ black = XftDrawSrcPicture (aadraw, &aablack);
+ dst = XftDrawPicture (aadraw);
+
+ src = black;
+ for (i = 0; i != reps; i++) {
+ XRenderFillRectangle (xp->d, PictOpSrc, mask, &transparent,
+ 0, 0, WIDTH, HEIGHT);
+ XRenderAddTraps (xp->d, mask, 0, 0, traps, p->objects);
+ XRenderComposite (xp->d, PictOpOver, src, mask, dst,
+ 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT);
+ if (src == black)
+ src = white;
+ else
+ src = black;
+ CheckAbort ();
+ }
+}
+
+void
+EndFixedTraps (XParms xp, Parms p)
+{
+ free (traps);
+ XftDrawDestroy (aadraw);
+ XRenderFreePicture (xp->d, mask);
+ XFreePixmap (xp->d, maskPixmap);
+}
+
+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;
+ trapezoids = (XTrapezoid *)malloc(numTraps * sizeof(XTrapezoid));
+ curTrap = trapezoids;
+ 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;
+ Picture white, black, src, dst;
+
+ white = XftDrawSrcPicture (aadraw, &aawhite);
+ black = XftDrawSrcPicture (aadraw, &aablack);
+ dst = XftDrawPicture (aadraw);
+
+ src = black;
+ for (i = 0; i != reps; i++) {
+ XRenderCompositeTrapezoids (xp->d, PictOpOver, src, dst, maskFormat,
+ 0, 0, trapezoids, p->objects);
+ if (src == black)
+ src = white;
+ else
+ src = black;
+ CheckAbort ();
+ }
+}
+
+void
+EndFixedTrapezoids (XParms xp, Parms p)
+{
+ free (trapezoids);
+ XftDrawDestroy (aadraw);
+}
+
+#endif /* XRENDER */